# 78 — WBP_SplashScreen

## Blueprint Spec — UE 5.5–5.7

---

### Parent Class
`UserWidget`

### Dependencies
- [`BPC_LoadingScreen`](../11-polish/76_BPC_LoadingScreen.md) — Transition to loading
- [`BPC_AudioManager`](../10-adaptive/66_BPC_AudioManager.md) — Splash audio
- [`BPC_InputManager`](../02-player/13_BPC_InputManager.md) — Skip input
- [`GI_GameManager`](../01-core/05_GI_GameManager.md) — Boot flow control (Phase 0)
- [`SS_SaveManager`](../05-saveload/28_SS_SaveManager.md) — Check for existing save

### Purpose
Introductory splash screen sequence shown on game boot before the main menu or loading screen. Displays company logos, game title, engine badges, and legal notices in a timed sequential presentation. Supports skip-to-main-menu via input, accessibility features (slow mode), and conditional branching based on save state.

### Enums

**ESplashElementType**

| Value | Description |
|-------|-------------|
| CompanyLogo | Developer/publisher logo |
| EngineLogo | UE5 logo, power badges |
| GameTitle | Full game title card |
| LegalNotice | Copyright, ratings info |
| Warning | Health/safety warnings |
| AccessibilityNotice | Accessibility info |

### Structs

**FSplashElement**

| Field | Type | Description |
|-------|------|-------------|
| ElementType | ESplashElementType | What to show |
| DisplayDuration | Float | Seconds to display |
| FadeInTime | Float | Fade in duration |
| FadeOutTime | Float | Fade out duration |
| Texture | UTexture2D | Logo/image to show |
| TitleText | FText | Optional text overlay |
| SubtitleText | FText | Optional subtitle |
| bCanSkip | Bool | Allow skip this element |

### Variables

| Name | Type | Description |
|------|------|-------------|
| `SplashSequence` | TArray\<FSplashElement\> | Ordered splash elements |
| `CurrentElementIndex` | Int32 | Active element |
| `bIsPlaying` | Bool | Sequence running |
| `bSkipped` | Bool | User skipped |
| `bSlowMode` | Bool | Accessibility slow mode |
| `CurrentTimer` | Float | Element timer |
| `bTransitionComplete` | Bool | Sequence done |

### Functions

| Name | Inputs | Outputs | Description |
|------|--------|---------|-------------|
| `PlaySplashSequence` | — | — | Start boot splash |
| `ShowElement` | Element: FSplashElement | — | Display single element |
| `AdvanceToNext` | — | — | Move to next element |
| `SkipSplash` | — | — | End sequence early |
| `FadeInElement` | Duration: Float | — | Fade animation |
| `FadeOutElement` | Duration: Float | — | Fade animation |
| `HandleInput` | Action: FName | — | Skip/confirm binding |
| `OnSequenceComplete` | — | — | Splash finished |
| `SetSlowMode` | bEnabled: Bool | — | Accessibility mode |
| `CheckSaveState` | — | Bool | Has existing save |

### Blueprint Flow

```
[PlaySplashSequence]
  └─► Create splash sequence from configuration:
         CompanyLogo (3s display, 1s fade in/out)
         EngineLogo (2s display, 0.5s fade in/out)
         GameTitle (4s display, 1.5s fade in/out)
         LegalNotice (3s display, 1s fade in/out)
  └─► bIsPlaying = true
  └─► CurrentElementIndex = 0
  └─► ShowElement(SplashSequence[0])
  └─► Bind input actions:
         BPC_InputManager -> "Confirm" -> SkipSplash()
         BPC_InputManager -> "Pause" -> SkipSplash()

[ShowElement]
  └─► Get Element = SplashSequence[CurrentElementIndex]
  └─► Set visibility for appropriate canvas panel
  └─► If Element.Type == CompanyLogo:
         Set logo image, center
  └─► Else if Element.Type == GameTitle:
         Set title text, subtitle, large text block
  └─► Else if Element.Type == LegalNotice:
         Set legal text, small, bottom-aligned
  └─► Play FadeInElement(Element.FadeInTime)
  └─► Timer = 0
  └─► Tick:
         Timer += DeltaTime
         If Timer >= Element.DisplayDuration:
              AdvanceToNext()

[AdvanceToNext]
  └─► Play FadeOutElement(CurrentElement.FadeOutTime)
  └─► On fade complete:
         Hide current element
         CurrentElementIndex++
         If CurrentElementIndex >= SplashSequence.Length:
              OnSequenceComplete()
         Else:
              ShowElement(SplashSequence[CurrentElementIndex])

[SkipSplash]
  └─► If bSkipped: return
  └─► bSkipped = true
  └─► Fade out current element (fast, 0.2 seconds)
  └─► Clear all elements
  └─► OnSequenceComplete()

[OnSequenceComplete]
  └─► bIsPlaying = false
  └─► CheckSaveState():
         If save exists: Load main menu
         If no save: Show main menu (new game focus)
         If first boot ever: Show language/accessibility prompt
  └─► Broadcast OnSplashComplete()
  └─► Remove self from viewport
```

### Event Dispatchers

| Name | Payload | Description |
|------|---------|-------------|
| `OnSplashComplete` | bSkipped: Bool | Splash sequence done |

### Communications With

| Target | Method | Why |
|--------|--------|-----|
| [`BPC_LoadingScreen`](../11-polish/76_BPC_LoadingScreen.md) | Direct call | Load main menu |
| [`BPC_AudioManager`](../10-adaptive/66_BPC_AudioManager.md) | Direct call | Splash audio |
| [`BPC_InputManager`](../02-player/13_BPC_InputManager.md) | Event binding | Skip input |
| [`GI_GameManager`](../01-core/05_GI_GameManager.md) | Direct call | Boot flow |
| [`SS_SaveManager`](../05-saveload/28_SS_SaveManager.md) | Direct call | Save detection |

### Reuse Notes
- Fully configurable splash sequence via data
- Supports accessibility slow mode (doubles all durations)
- Skip input at any point
- First-boot branching for language/accessibility setup
- Handles both new game and existing save flows
- Legal notice compliance baked into sequence
- Can be reused for "press any key" or demo mode splash screens