Files
UE5-Modular-Game-Framework/docs/game/ui-overrides.md
Lefteris Notas 040db37720 Add UI Overrides and Weapons Index documentation for Project Void
- Created ui-overrides.md detailing game-specific Widget Blueprint overrides, including purpose, widget index, visual styling, and accessibility requirements.
- Established weapons-index.md outlining all held weapon actors, including their components, logic, and comparisons for gameplay mechanics.
2026-05-21 22:27:57 +03:00

705 lines
29 KiB
Markdown

# UI Overrides — Game-Specific Widget Blueprints
**Game:** Project Void | **Build Phase:** 11
**Framework Systems:** 44_SS_UIManager through 57_WBP_SettingsMenu (all 14 UI systems)
**Demonstrated By:** 8 game-specific WBP_ child widgets
---
## Purpose
Defines every game-specific Widget Blueprint override. Each is a **child** of the framework WBP_ parent, inheriting all framework logic while adding horror-game visual styling, branding, and game-specific menu options.
**Rule:** Game widgets are children of framework widgets. They override visual styling and add game-specific buttons/options. Never rebuild framework logic in game widgets.
---
## Widget Index
| Game Widget | Parent (Framework) | Purpose |
|-------------|-------------------|---------|
| `WBP_GameHUDController` | `WBP_HUDController` (47) | Root HUD — horror-themed diegetic layout |
| `WBP_GameMainMenu` | `WBP_MainMenu` (51) | "Project Void" title screen |
| `WBP_GamePauseMenu` | `WBP_PauseMenu` (55) | In-game pause with horror styling |
| `WBP_GameInventoryMenu` | `WBP_InventoryMenu` (49) | Inventory grid with asylum aesthetic |
| `WBP_SplashHorror` | `WBP_SplashScreen` (114) | Boot splash sequence |
| `WBP_JournalHorror` | `WBP_JournalDocumentViewer` (50) | Document reader with aged-paper styling |
| `WBP_DeathScreen` | `UserWidget` (custom) | Death/void space screen overlay |
| `WBP_LoadingHorror` | — (used by BPC_LoadingScreen) | Level loading with tips |
---
## 1. WBP_GameHUDController — Root HUD
**Parent:** `WBP_HUDController` | **Asset Path:** `Content/Game/UI/WBP_GameHUDController.uasset`
### Child Widgets (auto-created by parent)
| Widget | Position | Visibility |
|--------|----------|------------|
| `WBP_DiegeticHUDFrame` (46) | Bottom-center (wristwatch position) | Gameplay only |
| `WBP_InteractionPromptDisplay` (48) | Center-bottom (crosshair area) | When focused on interactable |
| `WBP_ObjectiveDisplay` (54) | Top-right | When objective active |
| `WBP_NotificationToast` (53) | Top-center (slide-in) | On events |
| `WBP_ScreenEffectController` (56) | Full screen (behind all UI) | Always (transparent until effect) |
| `WBP_AccessibilityUI` (45) | Bottom-center (subtitles) | Dialogue playing |
### Game-Specific Overrides
#### Visual Styling (Class Defaults)
| Property | Framework Default | Horror Override |
|----------|-----------------|-----------------|
| `HUDTintColor` | White | Pale amber `#D4A574` (aged paper) |
| `HUDFontFamily` | Roboto | `Chiller` or serif horror font |
| `CrosshairStyle` | Dot | Faint vertical line (no crosshair — diegetic aim) |
| `HUDBackgroundOpacity` | 0.5 | 0.2 (minimalist) |
| `HealthBarColor` | Red | Deep crimson `#8B0000` |
| `StaminaBarColor` | Yellow | Faded gold `#B8860B` |
| `StressBarColor` | Purple | Void purple `#4B0082` |
#### Functions to Override
```
Override: UpdateDiegeticHUDFrame
├─ Parent: UpdateDiegeticHUDFrame (calls framework HUD update logic)
└─ [Horror-Specific Additions]
├─ Get BPC_StateManager → GetHeartRate()
│ └─ WBP_DiegeticHUDFrame → SetHeartRateIndicator(rate)
│ └─ Visual: subtle heartbeat pulse on health bar edge
├─ Get BPC_StressSystem → GetCurrentStressTier()
│ └─ WBP_ScreenEffectController → UpdateStressVignette(tier)
│ ├─ Calm: no effect
│ ├─ Uneasy: very subtle edge darkening
│ ├─ Disturbed: peripheral blur + vignette
│ ├─ Breaking: tunnel vision + color desaturation
│ └─ Catatonic: near-black edges, breathing effect
└─ Get BPC_HidingSystem → GetBreathHoldRemaining()
└─ WBP_DiegeticHUDFrame → ShowBreathHoldMeter(seconds)
└─ Visual: shrinking circle near crosshair area
```
#### Phase Visibility (inherited from parent, overridden)
| Game Phase | HUD Visible | Notes |
|-----------|:---:|-------|
| `MainMenu` | No | Menu layer active instead |
| `Loading` | No | Loading screen visible |
| `InGame` | Yes | Full HUD |
| `Paused` | No | Dimmed, pause menu overlay |
| `Cutscene` | No | Clean cinematic view |
| `DeathLoop` | Partial | Only death screen overlay |
| `AltDeathSpace` | No | Void has its own UI |
| `Credits` | No | Credits widget active |
| `PostGame` | Partial | Stats overlay |
---
## 2. WBP_GameMainMenu — Title Screen
**Parent:** `WBP_MainMenu` | **Asset Path:** `Content/Game/UI/WBP_GameMainMenu.uasset`
### Layout
```
┌──────────────────────────────────────────────────────┐
│ │
│ │
│ ██████╗ ██████╗ ██████╗ ██╗ │
│ ██╔══██╗██╔══██╗██╔═══██╗ ██║ │
│ ██████╔╝██████╔╝██║ ██║ ██║ │
│ ██╔═══╝ ██╔══██╗██║ ██║██ ██║ │
│ ██║ ██║ ██║╚██████╔╝╚█████╔╝ │
│ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚════╝ │
│ │
│ ██╗ ██╗ ██████╗ ██╗██████╗ │
│ ██║ ██║██╔═══██╗██║██╔══██╗ │
│ ██║ ██║██║ ██║██║██║ ██║ │
│ ╚██╗ ██╔╝██║ ██║██║██║ ██║ │
│ ╚████╔╝ ╚██████╔╝██║██████╔╝ │
│ ╚═══╝ ╚═════╝ ╚═╝╚═════╝ │
│ │
│ [ NEW GAME ] │
│ [ CONTINUE ] (dim if no save) │
│ [ LOAD GAME ] │
│ [ SETTINGS ] │
│ [ CREDITS ] │
│ [ QUIT ] │
│ │
│ v1.0 — UE5 Demo │
│ "In the void, memory is currency." │
│ │
└──────────────────────────────────────────────────────┘
```
### Overrides from WBP_MainMenu
| Element | Framework | Horror Override |
|---------|-----------|----------------|
| Title | Plain text | Animated glitch-effect title (Timeline: opacity flicker + position jitter) |
| Background | Solid color | Semi-transparent 3D scene visible behind UI |
| Buttons | Square, solid | Faded rounded, amber highlight on hover |
| Font | System default | Horror serif font |
| Continue button | Standard | Reads "Continue the Nightmare" |
| Quit button | Standard | Reads "Wake Up" (thematic) |
| Version text | Bottom-right | Bottom-center with tagline |
| Ambient effect | None | Occasional text glitch on title (every 8-12 seconds) |
### Functions
#### Override: OnConstruct
```
OnConstruct
├─ Parent: OnConstruct (check SS_SaveManager.HasAnySave for Continue)
└─ [Horror Additions]
├─ StartTitleGlitchTimer (random 8-12 second interval)
│ └─ Title Text → SetRenderOpacity(random 0.7-1.0) + position jitter
├─ SS_AudioManager.PlayMusic("menu_theme", MS_MusicBus)
│ └─ Fade in from 0.0 to 1.0 over 3 seconds
└─ Get GI_HorrorGame → TotalDeaths
└─ If > 0: show small text "Deaths: [N]" below version
Override: OnNewGame
├─ Parent: OnNewGame (calls SS_SaveManager.ResetGameState)
├─ GI_HorrorGame → SetSessionFlag("NewGameStarted", true)
├─ GI_HorrorGame → SetGamePhase(Loading)
├─ OpenLevel("L_Asylum_Entry")
└─ SS_AudioManager.FadeOutMusic(2.0)
Override: OnContinue
├─ Parent: OnContinue (load latest save)
├─ SS_SaveManager.LoadLatestSaveSlot()
├─ Get SaveHeader → LastChapterTag
└─ GI_HorrorGame → TransitionToChapter(LastChapterTag)
Override: OnQuit
├─ Show confirmation: "Are you sure you want to wake up?"
│ ├─ Yes → GI_HorrorGame.QuitToDesktop()
│ └─ No → close confirmation
└─ (Remove standard quit confirm, use themed text)
```
---
## 3. WBP_GamePauseMenu — Pause Screen
**Parent:** `WBP_PauseMenu` | **Asset Path:** `Content/Game/UI/WBP_GamePauseMenu.uasset`
### Layout
```
┌────────────────────────────────────────┐
│ │
│ ┌──────────────┐ │
│ │ PAUSED │ │
│ └──────────────┘ │
│ │
│ [ RESUME ] │
│ [ SAVE GAME ] │
│ [ LOAD GAME ] │
│ [ SETTINGS ] │
│ [ RETURN TO MENU ] │
│ [ WAKE UP (QUIT) ] │
│ │
│ ───── Chapter: Ward A ───── │
│ Deaths: 2 Time: 00:14:32 │
│ │
└────────────────────────────────────────┘
```
### Game-Specific Functions
```
Override: OnConstruct
├─ Parent: OnConstruct
└─ [Show Session Stats]
├─ GS_HorrorGameState → GetSessionTimeFormatted()
│ └─ Set TimeText
├─ PS_HorrorPlayerState → DeathsThisChapter
│ └─ Set DeathsText
└─ GM_HorrorGameMode → GetCurrentChapter()
└─ Set ChapterText
Override: OnResume
├─ Parent: OnResume (close menu, set phase)
└─ SS_AudioManager.PlaySFX("menu_close")
Override: OnSave
├─ SS_SaveManager.CreateManualSave("PauseSave")
├─ Show toast: "Progress saved."
└─ SS_AudioManager.PlaySFX("save_confirm")
Override: OnQuitToMenu
├─ Show confirmation: "Return to main menu? Unsaved progress will be lost."
│ ├─ Yes → SS_SaveManager.QuickSave → OpenLevel("L_MainMenu")
│ └─ No → close confirmation
└─ (Add quick-save before quit for safety)
```
---
## 4. WBP_GameInventoryMenu — Inventory Screen
**Parent:** `WBP_InventoryMenu` (49) | **Asset Path:** `Content/Game/UI/WBP_GameInventoryMenu.uasset`
### Visual Overrides
| Element | Framework Default | Horror Override |
|---------|-----------------|-----------------|
| Grid Background | Dark gray | Aged parchment texture |
| Slot Border | Thin white | Worn leather frame |
| Item Icon Background | None | Vignette behind each icon |
| Category Tabs | All/Weapons/Items | All/Weapons/Tools/Keys/Documents |
| Weight Bar | Bottom | Bottom with thematic label "Burden" |
| Selected Item Info | Right panel | Right panel with "flavor text" from item desc |
| Font | System | Typewriter/courier for item names |
### Additional Functions
```
Override: OnItemSelected(ItemData, SlotIndex)
├─ Parent: OnItemSelected (framework: show item details, enable actions)
└─ [Horror Additions]
├─ If ItemData.ItemType == Document:
│ └─ Show "Read" button → push WBP_JournalHorror with document
├─ If ItemData.bIsKeyItem:
│ └─ Show "KEY ITEM" badge on item detail panel
│ └─ Warning text: "Cannot be discarded"
└─ Show item flavor text below description
└─ Small, italic: "It feels cold to the touch."
Override: UpdateGrid
├─ Parent: UpdateGrid
└─ [Horror Additions]
├─ Get PS_HorrorPlayerState → GetSanityPercentage()
│ └─ If < 25% (Breaking): items shift slightly on grid refresh
│ └─ Subtle: slot positions jitter 1-2px randomly
│ (Memory Drift System bleed into UI)
└─ BPC_CollectibleTracker → GetFoundCount() + GetTotalCount()
└─ Display at bottom: "Memories Recovered: [N]/15"
```
---
## 5. WBP_SplashHorror — Boot Splash Screen
**Parent:** `WBP_SplashScreen` (114) | **Asset Path:** `Content/Game/UI/WBP_SplashHorror.uasset`
### Splash Sequence
```
Sequence (inherits parent's FSplashElement array):
1. COMPANY LOGO — 2.5s
├─ FadeIn: 0.5s
├─ Display: 1.5s
├─ FadeOut: 0.5s
└─ Texture: T_StudioLogo
2. UE5 LOGO — 1.5s
├─ FadeIn: 0.3s
├─ Display: 1.0s
└─ FadeOut: 0.2s
3. GAME TITLE — 3.5s
├─ FadeIn: 0.8s
├─ Display: 2.5s
│ └─ "PROJECT VOID" — large, with slow glitch effect
├─ FadeOut: 0.2s
└─ Audio: deep bass rumble begins
4. HEALTH WARNING — 2.0s
├─ FadeIn: 0.5s
├─ Display: 1.0s
│ └─ "This game contains psychological horror,
│ disturbing imagery, and themes of
│ mental illness. Player discretion advised."
├─ FadeOut: 0.5s
└─ Can be skipped
5. AUTO-ADVANCE
├─ Dispatch OnSequenceComplete
└─ Level Blueprint → OpenLevel("L_MainMenu")
```
### Override
```
Override: PlaySplashSequence
├─ Parent: PlaySplashSequence
└─ [Horror Additions]
├─ SS_AudioManager.PlayMusic("splash_ambient", MS_MusicBus)
│ └─ Starts at 0.0 volume, fades to 0.5 over 2 seconds
└─ [Accessibility]
├─ If SS_SettingsSystem.GetBool("subtitles_enabled"):
│ └─ Show subtitle text for health warning
└─ If SS_SettingsSystem.GetBool("slow_mode"):
└─ Double all display durations
```
---
## 6. WBP_JournalHorror — Document Viewer
**Parent:** `WBP_JournalDocumentViewer` (50) | **Asset Path:** `Content/Game/UI/WBP_JournalHorror.uasset`
### Visual Design
```
┌─────────────────────────────────────┐
│ ┌───────────────────────────────┐ │
│ │ │ │
│ │ [AGED PAPER TEXTURE BG] │ │
│ │ │ │
│ │ Patient File #47 │ │
│ │ ───────────────────── │ │
│ │ │ │
│ │ "The subject exhibits │ │
│ │ extreme paranoia and │ │
│ │ claims to hear voices │ │
│ │ from within the walls..." │ │
│ │ │ │
│ │ ── Dr. Blackwood, 1923 │ │
│ │ │ │
│ │ [← PREV] [NEXT →] │ │
│ └───────────────────────────────┘ │
│ │
│ [CLOSE] [FLAG IMPORTANT] │
└─────────────────────────────────────┘
```
### Override Behavior
```
Override: ShowDocument(DocumentData)
├─ Parent: ShowDocument (renders pages)
└─ [Horror Styling]
├─ Page background: T_Parchment texture (aged paper)
├─ Font: Typewriter style, slightly uneven (random kerning)
├─ Ink color: Dark brown (#3B2314) not pure black
├─ Page edge: Slight vignette around border
├─ [Memory Drift Integration]
│ └─ If BPC_StressSystem.GetCurrentStressTier() >= Breaking:
│ └─ Some words on page randomly shift/unblur
│ (subtle hallucination bleed)
│ Timer: every 4-6 seconds, shift 1-2 words, revert after 1s
└─ [Accessibility]
└─ If SS_SettingsSystem.GetBool("dyslexia_font"):
└─ Switch to OpenDyslexic font
Override: FlagDocument(DocumentData)
├─ BPC_DocumentArchiveSystem.FlagAsImportant(DocumentData)
├─ WBP_NotificationToast.Show("Document flagged for review")
└─ (Items flagged as important glow faintly in inventory)
```
---
## 7. WBP_DeathScreen — Death Overlay
**Parent:** `UserWidget` (custom — no framework parent) | **Asset Path:** `Content/Game/UI/WBP_DeathScreen.uasset`
### Purpose
Shown when the player dies (overlay, not a separate level). Handles the death-to-respawn flow and void space entry.
### Layout
```
┌──────────────────────────────────────────────┐
│ │
│ │
│ ┌──────────────┐ │
│ │ YOU DIED │ │
│ │ (fade in) │ │
│ └──────────────┘ │
│ │
│ Death Cause: Void Entity │
│ Chapter: Basement │
│ Deaths this run: 4 │
│ Time survived: 00:45:12 │
│ │
│ ┌─────────────────────┐ │
│ │ "The void watches. │ │
│ │ It always watches."│ │
│ └─────────────────────┘ │
│ │
│ [CONTINUE] [MAIN MENU] │
│ (respawn at (quit to │
│ checkpoint) menu) │
│ │
│ (if void-qualifying death shows instead:) │
│ [ENTER THE VOID] │
│ │
└──────────────────────────────────────────────┘
```
### Variables
| Variable | Type | Default | Purpose |
|----------|------|---------|---------|
| `DeathCause` | Text | — | Set by BPC_DeathHandlingSystem before show |
| `DeathChapter` | Text | — | Current chapter at time of death |
| `DeathsThisRun` | Int | 0 | From PS_HorrorPlayerState |
| `TimeSurvived` | Text | "" | Formatted playtime |
| `bCanEnterVoid` | Boolean | false | True if void space conditions met |
| `RandomFlavorTexts` | Array\<Text\> | — | Pool of death-screen quotes |
### Functions
```
ShowDeathScreen(DeathCause: Text, bVoidQualified: Boolean)
├─ Set DeathCause, DeathChapter, DeathsThisRun, TimeSurvived
├─ [Fade In]
│ ├─ SetRenderOpacity(0.0)
│ └─ Timeline: 0.0 → 1.0 over 2.0 seconds
├─ [Visual Effects]
│ ├─ Background: dark red gradient (bottom) to black (top)
│ ├─ Vignette: heavy edge darkening
│ └─ Particle: faint void particles drifting upward
├─ [Audio]
│ ├─ SS_AudioManager.StopAllSFX()
│ ├─ SS_AudioManager.FadeOutMusic(1.0)
│ └─ SS_AudioManager.PlaySFX("death_sting")
│ └─ Low bass rumble + heartbeat stop
├─ [Flavor Text]
│ ├─ Select random quote from RandomFlavorTexts
│ └─ Display in center with slow fade-in
├─ [Button Visibility]
│ ├─ bVoidQualified? → Branch
│ │ ├─ True: Show "ENTER THE VOID" (primary)
│ │ │ + "Continue" (secondary, below)
│ │ └─ False: Show "CONTINUE" (primary)
│ │
│ └─ Always show "MAIN MENU" (secondary)
└─ [Accessibility]
└─ If SS_SettingsSystem.GetBool("reduce_jumpscares"):
└─ Skip death sting audio, play soft tone instead
OnContinueClicked
├─ GM_HorrorGameMode.HandlePlayerDead → resume respawn flow
├─ HideDeathScreen()
└─ (BPC_PlayerRespawnSystem handles the actual respawn)
OnEnterVoidClicked
├─ GM_HorrorGameMode → bVoidSpaceActive = true
├─ BPC_AltDeathSpaceSystem.EnterVoidSpace()
├─ TransitionToChapter(Chapter.VoidSpace)
└─ HideDeathScreen()
OnMainMenuClicked
├─ Show confirmation: "Return to main menu? All unsaved progress lost."
│ ├─ Yes → OpenLevel("L_MainMenu")
│ └─ No → close confirmation
└─ HideDeathScreen() (called by hide function)
```
### Flavor Text Pool
| Quote |
|-------|
| "The void does not forget. It merely waits." |
| "Each death is a memory. Each memory is a key." |
| "You've been here before. You'll be here again." |
| "The asylum remembers what you cannot." |
| "Death is not an ending. It is a doorway." |
| "Breathe. The darkness is patient." |
| "They say the patients never truly die here." |
| "You are one step closer to the truth." |
---
## 8. WBP_LoadingHorror — Loading Screen
**Parent:** Associated with `BPC_LoadingScreen` (110) | **Asset Path:** `Content/Game/UI/WBP_LoadingHorror.uasset`
### Layout
```
┌─────────────────────────────────────────────┐
│ │
│ │
│ ┌─────────────────────┐ │
│ │ │ │
│ │ LOADING... │ │
│ │ │ │
│ │ ████████░░░░ 65% │ │
│ │ │ │
│ └─────────────────────┘ │
│ │
│ CHAPTER NAME: Ward A — Patient Wing │
│ │
│ ┌─────────────────────────────────────┐ │
│ │ "Darkness is your ally. │ │
│ │ Enemies can't see what they │ │
│ │ can't hear." │ │
│ └─────────────────────────────────────┘ │
│ │
│ [void symbol] │
│ │
└─────────────────────────────────────────────┘
```
### Variables
| Variable | Type | Default | Purpose |
|----------|------|---------|---------|
| `TipsDataTable` | DataTable | `DT_LoadingTips` | Pool of loading tips |
| `TipTimer` | Float | `8.0` | Seconds between tip rotation |
| `CurrentTipIndex` | Int32 | `0` | Which tip is showing |
| `BackgroundImage` | Texture | — | Blurred screenshot of current area |
### Functions
```
ShowLoadingScreen(ChapterTag: GameplayTag)
├─ [Set Chapter Name]
│ ├─ GM_HorrorGameMode → HorrorLevelNames → get name from tag
│ └─ Set ChapterNameText
├─ [Select Background]
│ └─ Load background texture based on ChapterTag
│ ├─ Entry → "asylum_cell_blur"
│ ├─ WardA → "ward_a_hallway_blur"
│ ├─ WardB → "ward_b_courtyard_blur"
│ ├─ Basement → "basement_dark_blur"
│ └─ Void → "void_abstract"
├─ [Start Tip Rotation]
│ ├─ Pick random tip from TipsDataTable
│ └─ Set Timer (8.0s, looping) → ShowNextTip
├─ [Progress Bar]
│ └─ Bind to level load progress (Get Async Load Percentage)
│ └─ Update ProgressBar percent every tick
├─ [Audio]
│ ├─ SS_AudioManager.PlaySFX("loading_ambient_loop")
│ └─ SS_AudioManager.FadeOutMusic(0.5)
└─ [Add to Viewport]
HideLoadingScreen()
├─ Stop TipTimer
├─ SS_AudioManager.StopSFX("loading_ambient_loop")
├─ Remove from viewport
└─ Broadcast OnLoadingComplete
```
---
## UI Integration with Framework Systems
```
SS_UIManager (44) — Owns all menu widgets, pushes/pops stack
├─ MAIN MENU flow: WBP_GameMainMenu → (Settings) → WBP_SettingsMenu
│ WBP_GameMainMenu → (Credits) → WBP_CreditsScreen
├─ PAUSE flow: IA_PauseMenu → Push WBP_GamePauseMenu
│ └─ (Settings) → Push WBP_SettingsMenu
├─ INVENTORY flow: IA_OpenWatch → Push WBP_GameInventoryMenu
│ └─ (Read Document) → Push WBP_JournalHorror
└─ DEATH flow: BPC_DeathHandlingSystem → Show WBP_DeathScreen
(NOT through SS_UIManager — direct overlay)
WBP_HUDController (47) → WBP_GameHUDController
├─ Always visible during InGame phase
├─ Hides during menu push (SS_UIManager coordinates)
└─ Children: DiegeticHUDFrame, InteractionPrompt, Objective, Toast, ScreenEffect
SS_EnhancedInputManager (128)
├─ Coordinates with SS_UIManager for input mode changes
│ ├─ Menu open → SetInputModeUIOnly → show cursor
│ └─ Menu close → SetInputModeGameOnly → hide cursor
└─ IA_PauseMenu → SS_UIManager
IA_OpenWatch → SS_UIManager + push WristwatchUI context
```
---
## Accessibility Requirements
All game UI widgets must implement:
| Feature | Implementation | Target |
|---------|---------------|--------|
| **Subtitles** | `WBP_AccessibilityUI` — shows all dialogue, whispered voices | Deaf/HoH |
| **Colorblind modes** | 3 presets (Protanopia, Deuteranopia, Tritanopia) — adjust health/stress colors | Colorblind |
| **High contrast** | Toggle via Settings — increases HUD opacity to 0.9, brightens colors | Low vision |
| **Dyslexia font** | Toggle via Settings — switch all text to OpenDyslexic | Dyslexia |
| **Controller support** | All menus navigable via D-Pad + A/B buttons | Console players |
| **Text size** | Slider (Small/Medium/Large) — scales all UI text | Low vision |
| **Reduce jumpscares** | Toggle — replaces stingers with soft tones, removes screen shake | Anxiety/PTSD |
| **Hold-to-confirm** | All destructive actions (Quit, Delete Save) require 1s hold | Accidental press |
---
## Blueprint Wiring Checklist
- [ ] Create `WBP_GameHUDController` — child of `WBP_HUDController` — set horror colors/fonts
- [ ] Create `WBP_GameMainMenu` — child of `WBP_MainMenu` — Project Void branding
- [ ] Create `WBP_GamePauseMenu` — child of `WBP_PauseMenu` — session stats display
- [ ] Create `WBP_GameInventoryMenu` — child of `WBP_InventoryMenu` — parchment styling
- [ ] Create `WBP_SplashHorror` — child of `WBP_SplashScreen` — boot sequence
- [ ] Create `WBP_JournalHorror` — child of `WBP_JournalDocumentViewer` — aged paper
- [ ] Create `WBP_DeathScreen` — custom UserWidget — death/respawn flow
- [ ] Create `WBP_LoadingHorror` — associated with `BPC_LoadingScreen` — tips + progress
- [ ] Create `DT_LoadingTips` Data Table — 10 horror-themed tips
- [ ] Wire all widgets into `SS_UIManager` menu stack
- [ ] Test all accessibility toggles work through `WBP_SettingsMenu`
- [ ] Verify UI layer hides/shows correctly with game phase changes
---
*UI Overrides for Project Void. See [GAMEINDEX.md](GAMEINDEX.md) for full game structure. See [hud-overview.md](../architecture/hud-overview.md) for HUD architecture. See individual framework widget specs in [06-ui/](../blueprints/06-ui/).*