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.
This commit is contained in:
704
docs/game/ui-overrides.md
Normal file
704
docs/game/ui-overrides.md
Normal file
@@ -0,0 +1,704 @@
|
||||
# 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/).*
|
||||
Reference in New Issue
Block a user