# 77 — WBP_CreditsScreen

## Blueprint Spec — UE 5.5–5.7

---

### Parent Class
`UserWidget`

### Dependencies
- [`BPC_InputManager`](../02-player/13_BPC_InputManager.md) — Skip input handling
- [`BPC_AudioManager`](../10-adaptive/66_BPC_AudioManager.md) — Credit music/ambience
- [`BPC_LoadingScreen`](../11-polish/76_BPC_LoadingScreen.md) — Post-credits transition
- [`DA_CreditsData`](../12-content/80_DA_CreditsData.md) — Credit entries (Phase 12)

### Purpose
Animated credits display shown at game completion. Renders scrolling credit entries with sections (department headings, names, roles), supports speed control, pause/resume, and skip. Includes fade-in/out transitions and supports both standard and post-credits scenes. Designed to feel cinematic with smooth scrolling text.

### Enums

**ECreditSectionType**

| Value | Description |
|-------|-------------|
| Title | Main title text |
| Department | Group heading |
| Name | Person/role entry |
| Divider | Separator line |
| Special | Custom styled entry |
| Logo | Company logo display |

### Structs

**FCreditEntry**

| Field | Type | Description |
|-------|------|-------------|
| SectionType | ECreditSectionType | Entry category |
| Text | FText | Display text |
| SubText | FText | Role or subtitle |
| DelaySeconds | Float | Extra pause before |
| FontScale | Float | Size multiplier |
| bBold | Bool | Bold style |
| LogoTexture | UTexture2D | Optional logo |

**FCreditsSection**

| Field | Type | Description |
|-------|------|-------------|
| SectionHeading | FText | Department name |
| Entries | TArray\<FCreditEntry\> | People in section |
| bSeparator | Bool | Add line after |

### Variables

| Name | Type | Description |
|------|------|-------------|
| `CreditsData` | FCreditsSection[] | Full credit sequence |
| `CurrentEntryIndex` | Int32 | Active entry |
| `ScrollSpeed` | Float | Pixels per second |
| `bIsPlaying` | Bool | Credits running |
| `bIsPaused` | Bool | User paused |
| `bSkippable` | Bool | Allow skip |
| `TotalEntries` | Int32 | End of list marker |
| `AccumulatedTime` | Float | Entry transition timer |
| `bFadeComplete` | Bool | Intro finished |

### Functions

| Name | Inputs | Outputs | Description |
|------|--------|---------|-------------|
| `InitializeCredits` | Data: FCreditsSection[] | — | Set up display |
| `PlayCredits` | — | — | Start scrolling |
| `PauseCredits` | — | — | Pause scrolling |
| `ResumeCredits` | — | — | Resume scrolling |
| `SkipCredits` | — | — | End credits early |
| `SetScrollSpeed` | Speed: Float | — | Adjust speed |
| `ShowNextEntry` | — | — | Display next credit |
| `ShowPreviousEntry` | — | — | Display previous |
| `FadeInScreen` | — | — | Intro animation |
| `FadeOutScreen` | — | — | Outro animation |
| `OnCreditsComplete` | — | — | End of credits |
| `HandleInputAction` | Action: FName | — | Input binding |
| `GetSectionsForCollectibles` | — | FCreditsSection[] | Unlockable content credits |

### Blueprint Flow

```
[InitializeCredits]
  └─► Clear all existing entries
  └─► CurrentEntryIndex = 0
  └─► Load CreditsData from DA_CreditsData
  └─► If player collected all collectibles:
         Add bonus sections (GetSectionsForCollectibles)
  └─► TotalEntries = Sum of all entries

[PlayCredits]
  └─► If already playing: return
  └─► bIsPlaying = true
  └─► FadeInScreen()
         Set widget opacity 0 → 1 over 1.5 seconds
         On fade complete: bFadeComplete = true
  └─► Start scrolling:
         Every Tick:
              If bIsPaused: return
              AccumulatedTime += DeltaTime * ScrollSpeed
              If AccumulatedTime >= EntryDisplayThreshold:
                   ShowNextEntry()
                   AccumulatedTime = 0

[ShowNextEntry]
  └─► If CurrentEntryIndex >= TotalEntries:
         OnCreditsComplete()
         Return
  └─► Current Credit = CreditsData entries[CurrentEntryIndex]
  └─► Create text block with appropriate styling:
         Title: large, centered, bold
         Department: medium, uppercase, separated
         Name: normal, two-column layout
         Divider: thin line, 50% width
  └─► Apply fade-in animation on new entry
  └─► Fade out previous entry
  └─► CurrentEntryIndex++

[OnCreditsComplete]
  └─► bIsPlaying = false
  └─► FadeOutScreen()
         Set widget opacity 1 → 0 over 2 seconds
  └─► On fade complete:
         Broadcast OnCreditsFinished()
         If bReturnToMenu:
              Load main menu level
         Else:
              Trigger post-credits content

[SkipCredits]
  └─► If Not bSkippable: return
  └─► bIsPlaying = false
  └─► Immediate fade out (0.3 seconds)
  └─► Broadcast OnCreditsSkipped()
  └─► Proceed to post-credits flow

[HandleInputAction]
  └─► Bind to BPC_InputManager:
         "Pause" -> Toggle Pause/Resume
         "Skip" -> SkipCredits()
         "SpeedUp" -> SetScrollSpeed(1.5x)
         "SlowDown" -> SetScrollSpeed(0.5x)
```

### Event Dispatchers

| Name | Payload | Description |
|------|---------|-------------|
| `OnCreditsFinished` | — | Normal completion |
| `OnCreditsSkipped` | — | User skipped |
| `OnCreditsPaused` | — | Paused state |
| `OnCreditsResumed` | — | Resumed state |

### Communications With

| Target | Method | Why |
|--------|--------|-----|
| [`BPC_InputManager`](../02-player/13_BPC_InputManager.md) | Event binding | Input handling |
| [`BPC_AudioManager`](../10-adaptive/66_BPC_AudioManager.md) | Direct call | Music/ambience |
| [`BPC_LoadingScreen`](../11-polish/76_BPC_LoadingScreen.md) | Direct call | Post-credits transition |
| [`DA_CreditsData`](../12-content/80_DA_CreditsData.md) | Data asset | Credit entries |

### Reuse Notes
- Entirely data-driven via DA_CreditsData
- Supports unlockable post-credits content based on collectibles
- Scroll speed configurable and allows speed-up
- Pause/Resume supports accessibility needs
- Clean separation of data and presentation
- Can be reused for splash screens, acknowledgments, or prologue credit sequences