A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
DlgNode_Speech.cpp
Go to the documentation of this file.
1// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.
3
4#include "DlgContext.h"
5#include "DlgConstants.h"
6#include "Logging/DlgLogger.h"
8
9#if WITH_EDITOR
10void UDlgNode_Speech::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
11{
12 Super::PostEditChangeProperty(PropertyChangedEvent);
13
14 const FName PropertyName = PropertyChangedEvent.Property != nullptr ? PropertyChangedEvent.Property->GetFName() : NAME_None;
15 const bool bTextChanged = PropertyName == GetMemberNameText();
16
17 // rebuild text arguments
18 if (bTextChanged || PropertyName == GetMemberNameTextArguments())
19 {
21 }
22}
23
24#endif
25
26void UDlgNode_Speech::UpdateTextsValuesFromDefaultsAndRemappings(const UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode)
27{
29 Super::UpdateTextsValuesFromDefaultsAndRemappings(Settings, bEdges, bUpdateGraphNode);
30}
31
32void UDlgNode_Speech::UpdateTextsNamespacesAndKeys(const UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode)
33{
35 Super::UpdateTextsNamespacesAndKeys(Settings, bEdges, bUpdateGraphNode);
36}
37
39{
40 if (TextArguments.Num() <= 0)
41 {
42 return;
43 }
44
45 FFormatNamedArguments OrderedArguments;
46 for (const FDlgTextArgument& DlgArgument : TextArguments)
47 {
48 OrderedArguments.Add(DlgArgument.DisplayString, DlgArgument.ConstructFormatArgumentValue(Context, OwnerName));
49 }
50 ConstructedText = FText::AsCultureInvariant(FText::Format(Text, OrderedArguments));
51}
52
53bool UDlgNode_Speech::HandleNodeEnter(UDlgContext& Context, TSet<const UDlgNode*> NodesEnteredWithThisStep)
54{
56 const bool bResult = Super::HandleNodeEnter(Context, NodesEnteredWithThisStep);
57
58 // Handle virtual parent enter events for direct children
60 {
61 // Add to history
62 Context.SetNodeVisited(
65 );
66
67 // Fire all the direct child enter events
69 {
71 {
72 Node->FireNodeEnterEvents(Context);
73 }
74 }
75 }
76
77 return bResult;
78}
79
80bool UDlgNode_Speech::ReevaluateChildren(UDlgContext& Context, TSet<const UDlgNode*> AlreadyEvaluated)
81{
83 {
85 Context.GetMutableOptionsArray().Empty();
86 Context.GetAllMutableOptionsArray().Empty();
87
88 // stop endless loop
89 if (AlreadyEvaluated.Contains(this))
90 {
92 TEXT("ReevaluateChildren - Endless loop detected, a virtual parent became his own parent! "
93 "This is not supposed to happen, the dialogue is terminated.\nContext:\n\t%s"),
94 *Context.GetContextString()
95 );
96 return false;
97 }
98
99 AlreadyEvaluated.Add(this);
100
101 for (const FDlgEdge& Edge : Children)
102 {
103 // Find first satisfied child
104 if (Edge.Evaluate(Context, { this }))
105 {
106 if (UDlgNode* Node = Context.GetMutableNodeFromIndex(Edge.TargetIndex))
107 {
108 // Get Grandchildren
109 const bool bResult = Node->ReevaluateChildren(Context, AlreadyEvaluated);
110 if (bResult)
111 {
113 }
114 return bResult;
115 }
116 }
117 }
118 return false;
119 }
120
121 // Normal speech node
122 return Super::ReevaluateChildren(Context, AlreadyEvaluated);
123}
124
125
126void UDlgNode_Speech::GetAssociatedParticipants(TArray<FName>& OutArray) const
127{
128 Super::GetAssociatedParticipants(OutArray);
129 for (const FDlgTextArgument& TextArgument : TextArguments)
130 {
131 if (TextArgument.ParticipantName != NAME_None)
132 {
133 OutArray.AddUnique(TextArgument.ParticipantName);
134 }
135 }
136}
static void UpdateTextFromRemapping(const UDlgSystemSettings &Settings, FText &OutText)
static void UpdateTextNamespaceAndKey(const UObject *Object, const UDlgSystemSettings &Settings, FText &Text)
static FDlgLogger & Get()
Definition DlgLogger.h:24
void Errorf(const FmtType &Fmt, Types... Args)
Definition INYLogger.h:305
UCLASS(BlueprintType)
Definition DlgContext.h:96
UDlgNode * GetMutableNodeFromIndex(int32 NodeIndex) const
UFUNCTION(BlueprintPure, Category = "Dialogue|Data", DisplayName = "Get Node From Index")
TArray< FDlgEdge > & GetMutableOptionsArray()
Definition DlgContext.h:249
bool IsValidNodeIndex(int32 NodeIndex) const
UFUNCTION(BlueprintPure, Category = "Dialogue|Data")
FString GetContextString() const
UFUNCTION(BlueprintPure, Category = "Dialogue|Context")
FGuid GetNodeGUIDForIndex(int32 NodeIndex) const
UFUNCTION(BlueprintPure, Category = "Dialogue|Data", DisplayName = "Get Node GUID For Index")
void SetNodeVisited(int32 NodeIndex, const FGuid &NodeGUID)
TArray< FDlgEdgeData > & GetAllMutableOptionsArray()
Definition DlgContext.h:304
bool HandleNodeEnter(UDlgContext &Context, TSet< const UDlgNode * > NodesEnteredWithThisStep) override
TArray< FDlgTextArgument > TextArguments
UPROPERTY(EditAnywhere, EditFixedSize, Category = "Dialogue|Node")
void RebuildConstructedText(const UDlgContext &Context) override
FText Text
UPROPERTY(EditAnywhere, Category = "Dialogue|Node", Meta = (MultiLine = true))
void UpdateTextsValuesFromDefaultsAndRemappings(const UDlgSystemSettings &Settings, bool bEdges, bool bUpdateGraphNode=true) override
bool bVirtualParentFireDirectChildEnterEvents
UPROPERTY(EditAnywhere, Category = "Dialogue|Node")
int32 VirtualParentFirstSatisfiedDirectChildIndex
void GetAssociatedParticipants(TArray< FName > &OutArray) const override
static FName GetMemberNameTextArguments()
bool bIsVirtualParent
UPROPERTY(EditAnywhere, Category = "Dialogue|Node")
bool ReevaluateChildren(UDlgContext &Context, TSet< const UDlgNode * > AlreadyEvaluated) override
void RebuildTextArguments(bool bEdges, bool bUpdateGraphNode=true) override
static FName GetMemberNameText()
void UpdateTextsNamespacesAndKeys(const UDlgSystemSettings &Settings, bool bEdges, bool bUpdateGraphNode=true) override
UCLASS(BlueprintType, Abstract, EditInlineNew, ClassGroup = "Dialogue")
Definition DlgNode.h:40
FName OwnerName
UPROPERTY(EditAnywhere, Category = "Dialogue|Node", Meta = (DisplayName = "Participant Name"))
Definition DlgNode.h:359
TArray< FDlgEdge > Children
UPROPERTY(VisibleAnywhere, EditFixedSize, AdvancedDisplay, Category = "Dialogue|Node")
Definition DlgNode.h:402
UCLASS(Config = Engine, DefaultConfig, meta = (DisplayName = "Dialogue System Settings"))
USTRUCT(BlueprintType)
Definition DlgEdge.h:25
USTRUCT(BlueprintType)