- 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.
705 lines
29 KiB
Markdown
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/).*
|