- Updated BPC_NarrativeStateSystem with a comprehensive manual implementation guide, including class setup, variable initialization, and function breakdowns. - Expanded BPC_ObjectiveSystem documentation to include a manual implementation guide and detailed function descriptions. - Added a manual implementation guide for BPC_DialoguePlaybackSystem, outlining class setup and function nodes. - Introduced a manual implementation guide for BPC_DialogueChoiceSystem, detailing choice presentation and selection processes. - Enhanced BPC_BranchingConsequenceSystem documentation with a manual implementation guide for consequence evaluation. - Updated BPC_TrialScenarioSystem with a manual implementation guide for scenario management. - Expanded BPC_LoreUnlockSystem documentation to include a manual implementation guide for lore entry management. - Added a manual implementation guide for BP_NarrativeTriggerVolume, detailing trigger volume setup and action execution. - Enhanced BPC_EndingAccumulator documentation with a manual implementation guide for ending evaluation. - Updated BPC_HitReactionSystem with a manual implementation guide for hit reaction management. - Added a manual implementation guide for BPC_RecoilSystem, detailing recoil application and recovery processes. - Introduced DT_ProjectTags.csv to define gameplay tags for various systems, enhancing data-driven design capabilities.
7.7 KiB
7.7 KiB
41 — BPC_DialogueChoiceSystem
Blueprint Spec — UE 5.5–5.7
Parent Class
ActorComponent
Dependencies
Purpose
Presents branching dialogue choices to the player and routes the selected response back to the narrative system. Manages choice availability based on narrative flags and time limits.
Responsibilities
- Receive choice set from dialogue flow (via dispatcher from
BPC_DialoguePlaybackSystem) - Filter choices by required flags (only show choices player qualifies for)
- Display choices via
WBP_DialogueChoiceDisplay - Apply time limit if configured (auto-select default on expiry)
- Route selected choice tag to
BPC_NarrativeStateSystem - Trigger consequence dialogue branches by returning next sequence tag
Does NOT Handle
- Playing dialogue lines (that is
BPC_DialoguePlaybackSystem) - Evaluating narrative consequences beyond setting choice flag (that is
BPC_BranchingConsequenceSystem) - UI visual styling (that is
WBP_DialogueChoiceDisplay)
Variables
| Name | Type | Description |
|---|---|---|
CurrentChoices |
Array of S_DialogueChoice | Available options for active choice |
DefaultChoiceIndex |
Integer | Auto-selected if timer expires |
ChoiceTimeLimit |
Float | Seconds before auto-select (0 = no limit) |
ChoiceTimer |
TimerHandle | Countdown timer |
bChoiceActive |
Bool | Player is currently choosing |
TimeRemaining |
Float | Remaining time for UI display |
Structs
| Struct | Fields | Description |
|---|---|---|
S_DialogueChoice |
ChoiceText: FText, ResultFlagTag: GameplayTag, NextSequenceTag: GameplayTag, RequiredFlagTag: GameplayTag, bIsHidden: Bool, Priority: Integer, FlavorText: FText (tooltip/thought) | One choice option |
Functions / Events
| Name | Inputs | Outputs | Description |
|---|---|---|---|
PresentChoices |
Choices: Array of S_DialogueChoice, TimeLimit: Float | — | Opens choice UI and starts timer |
SelectChoice |
ChoiceIndex: Integer | — | Player or system selects a choice |
GetValidChoices |
Choices: Array of S_DialogueChoice | Array of S_DialogueChoice | Filters choices by RequiredFlagTag against narrative state |
HasValidChoices |
Choices: Array | Bool | At least one choice available? |
OnChoiceTimedOut |
— | — | Default choice auto-selected |
CancelChoice |
— | — | Exits choice without selecting |
ProcessSelectedChoice |
Choice: S_DialogueChoice | GameplayTag (NextSequenceTag) | Sets narrative flag and returns next sequence |
IsChoiceActive |
— | Bool | Query |
Event Dispatchers
| Name | Parameters | Fired When |
|---|---|---|
OnChoicesPresented |
Choices: Array of S_DialogueChoice | Choice UI opens |
OnChoiceSelected |
SelectedChoice: S_DialogueChoice, ChoiceIndex: Integer | Player makes selection |
OnChoiceTimedOut |
DefaultChoiceIndex: Integer | Timer expired |
OnChoiceCancelled |
— | Choice dismissed without selection |
OnChoiceCompleted |
NextSequenceTag: GameplayTag | Choice processed, ready for next dialogue |
Blueprint Flow
[PresentChoices called]
└─► Call GetValidChoices (filter by narrative flags)
└─► If no valid choices → skip (choose default or cancel)
└─► Set CurrentChoices to valid set
└─► Set bChoiceActive = true
└─► Broadcast OnChoicesPresented to WBP_DialogueChoiceDisplay
└─► If TimeLimit > 0 → start ChoiceTimer
[SelectChoice called]
└─► Validate ChoiceIndex is in range
└─► Get selected S_DialogueChoice
└─► Clear ChoiceTimer
└─► Broadcast OnChoiceSelected
└─► Call ProcessSelectedChoice
[ProcessSelectedChoice]
└─► If ResultFlagTag is valid → BPC_NarrativeStateSystem.SetFlag(ResultFlagTag)
└─► Set bChoiceActive = false
└─► Broadcast OnChoiceCompleted with NextSequenceTag
└─► Hand NextSequenceTag back to BPC_DialoguePlaybackSystem
Communications With
| Target System | Method | Why |
|---|---|---|
BPC_NarrativeStateSystem |
Direct | Set choice flag, check required flags |
BPC_DialoguePlaybackSystem |
Dispatcher (receives) + Direct (returns) | Receives choice points, returns next sequence |
WBP_DialogueChoiceDisplay |
Dispatcher | Opens/closes choice UI |
BPC_BranchingConsequenceSystem |
Dispatcher | Choice flag changes trigger consequence evaluation |
Reuse Notes
Choice filtering by RequiredFlagTag allows context-sensitive dialogue without branching logic in the system. Choices can be hidden (e.g., secret dialogue options only appear if player has a specific lore unlock). The system handles all choice patterns: timed, untimed, locked, hidden, and priority-sorted.
Manual Implementation Guide
Class Setup
- Create Blueprint Class: Parent =
ActorComponent, Name =BPC_DialogueChoiceSystem - Add to Player Character
- Define struct
S_DialogueChoice: ChoiceText (Text), ResultFlagTag (GameplayTag), NextSequenceTag (GameplayTag), RequiredFlagTag (GameplayTag), Priority (Integer)
Variable Init (BeginPlay)
Event BeginPlay
├─ Set CurrentChoices = empty array
├─ Set bChoiceActive = false
├─ Set ChoiceTimeLimit = 0.0
└─ Cache: BPC_NarrativeStateSystem, BPC_DialoguePlaybackSystem
Function Node-by-Node
PresentChoices(Choices: Array<S_DialogueChoice>, TimeLimit: Float) → void
Step 1: Filtered = GetValidChoices(Choices) ← filter by narrative flags
Step 2: If Filtered.Length == 0: auto-cancel (or select hidden default)
Step 3: Sort Filtered by Priority (descending)
Step 4: Set CurrentChoices = Filtered
Step 5: Set bChoiceActive = true
Step 6: Fire OnChoicesPresented(CurrentChoices) → WBP_DialogueChoiceDisplay shows UI
Step 7: If TimeLimit > 0:
Set ChoiceTimeLimit = TimeLimit, TimeRemaining = TimeLimit
Start looping timer (0.1s):
TimeRemaining -= 0.1 → update UI
If TimeRemaining <= 0 → Call OnChoiceTimedOut
GetValidChoices(Choices) → Array<S_DialogueChoice>
ForEach Choices:
If Choice.RequiredFlagTag valid:
Call BPC_NarrativeStateSystem.GetFlag(Choice.RequiredFlagTag)
If flag is true → Add to results
Else: Add to results (no requirement)
Return results
SelectChoice(ChoiceIndex: Integer) → void
Step 1: Validate ChoiceIndex < CurrentChoices.Length
Step 2: Selected = CurrentChoices[ChoiceIndex]
Step 3: Clear ChoiceTimer
Step 4: Fire OnChoiceSelected(Selected, ChoiceIndex)
Step 5: Call ProcessSelectedChoice(Selected)
ProcessSelectedChoice(Choice) → GameplayTag (NextSequenceTag)
Step 1: If Choice.ResultFlagTag valid:
BPC_NarrativeStateSystem.SetFlag(Choice.ResultFlagTag, true)
Step 2: Set bChoiceActive = false
Step 3: Fire OnChoiceCompleted(Choice.NextSequenceTag)
Step 4: Return Choice.NextSequenceTag ← caller (DialoguePlayback) plays this sequence
Build Checklist
- Create BPC_DialogueChoiceSystem, add to Player Character
- Define S_DialogueChoice struct
- Implement PresentChoices with flag filtering + timer
- Implement GetValidChoices with RequiredFlagTag check
- Implement SelectChoice with timer clear
- Implement ProcessSelectedChoice: set flag → return next sequence
- Wire to WBP_DialogueChoiceDisplay via dispatcher
- Test: dialogue choice appears → player selects → flag set → next dialogue plays