ArticyXImporter
ArticyXImporter for Unreal Engine
Loading...
Searching...
No Matches
ArticyFlowPlayer.h
1//
2// Copyright (c) 2023 articy Software GmbH & Co. KG. All rights reserved.
3//
4
5#pragma once
6
7#include "ArticyRuntimeModule.h"
8#include "ArticyDatabase.h"
9#include "ArticyGlobalVariables.h"
10#include "ArticyRef.h"
11#include "Components/BillboardComponent.h"
12#include "Containers/Queue.h"
13#include "ArticyFlowPlayer.generated.h"
14
15class IArticyNode;
17
21UENUM(BlueprintType, meta = (Bitflags))
22enum class EArticyPausableType : uint8
23{
24 FlowFragment,
25 Dialogue,
26 DialogueFragment,
27 Hub,
28 Jump,
29 Condition,
30 Instruction,
31 Pin
32};
33ENUM_CLASS_FLAGS(EArticyPausableType);
34
38USTRUCT(BlueprintType)
39struct ARTICYRUNTIME_API FArticyBranch
40{
41 GENERATED_BODY()
42
43public:
44
48 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Articy")
49 TArray<TScriptInterface<IArticyFlowObject>> Path;
50
52 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Articy")
53 bool bIsValid = true;
54
55 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Articy")
56 int32 Index = -1;
57
59 TScriptInterface<IArticyFlowObject> GetTarget() const;
60};
61
67UCLASS(BlueprintType, ClassGroup = "Articy", meta = (BlueprintSpawnableComponent))
68class ARTICYRUNTIME_API UArticyFlowPlayer : public UActorComponent
69{
70 GENERATED_BODY()
71
72public:
73
74 void BeginPlay() override;
75 void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
76
77 //---------------------------------------------------------------------------//
78
79 //EArticyPausableType
80 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Setup", meta = (Bitmask, BitmaskEnum = "/Script/ArticyRuntime.EArticyPausableType"))
81 uint8 PauseOn = 1 << uint8(EArticyPausableType::DialogueFragment)
82 | 1 << uint8(EArticyPausableType::Dialogue)
83 | 1 << uint8(EArticyPausableType::FlowFragment);
84
89 template<typename Lambda>
90 void ShadowedOperation(Lambda Operation) const;
91
92 uint32 GetShadowLevel() const { return ShadowLevel; }
93
94 //---------------------------------------------------------------------------//
95
97 UFUNCTION(BlueprintCallable, meta = (DisplayName = "Set Start Node (ArticyRef)"), Category = "Setup")
98 void SetStartNode(FArticyRef NewId);
99
100 UFUNCTION(BlueprintCallable, meta = (DisplayName = "Set Start Node (ArticyID)"), Category = "Setup")
101 void SetStartNodeById(FArticyId NewId);
102
104 UFUNCTION(BlueprintCallable, meta = (DisplayName = "Set Start Node (FlowObject)"), Category = "Setup")
105 void SetStartNodeWithFlowObject(TScriptInterface<IArticyFlowObject> Node);
106
108 UFUNCTION(BlueprintCallable, meta = (DisplayName = "Get Start Node"), Category = "Setup")
109 FArticyRef GetStartNode() { return StartOn; }
110
112 UFUNCTION(BlueprintCallable, meta = (DisplayName = "Set Ignore Invalid Branches"), Category = "Setup")
113 void SetIgnoreInvalidBranches(bool bNewIgnoreInvalidBranches) { bIgnoreInvalidBranches = bNewIgnoreInvalidBranches; }
114
116 UFUNCTION(BlueprintCallable, Category = "Flow")
117 void SetCursorTo(TScriptInterface<IArticyFlowObject> Node);
118
120 UFUNCTION(BlueprintCallable, Category = "Flow")
121 const TScriptInterface<IArticyFlowObject> GetCursor() const { return Cursor; }
122
124 UFUNCTION(BlueprintCallable, Category = "Flow")
125 void Play(int Index = 0);
126
128 UFUNCTION(BlueprintCallable, Category = "Flow")
129 void FinishCurrentPausedObject(int PinIndex = 0);
130
135 UFUNCTION(BlueprintCallable, Category = "Flow")
136 void PlayBranch(const FArticyBranch& Branch);
137
138 //---------------------------------------------------------------------------//
139
145 TArray<FArticyBranch> Explore(IArticyFlowObject* Node, bool bShadowed, int32 Depth, bool IncludeCurrent = true);
146
147 void SetPauseOn(EArticyPausableType Types);
149 bool ShouldPauseOn(IArticyFlowObject* Node) const;
150
151 UFUNCTION(BlueprintCallable, Category = "Flow")
152 bool ShouldPauseOn(TScriptInterface<IArticyFlowObject> Node) const;
153
157 UFUNCTION(BlueprintCallable, Category = "Setup")
158 UArticyGlobalVariables* GetGVs() const;
159
163 UFUNCTION(BlueprintPure, Category = "Setup")
164 UObject* GetMethodsProvider();
165
166 //---------------------------------------------------------------------------//
167
169 UFUNCTION(BlueprintCallable, Category = "Flow")
170 void UpdateAvailableBranches();
171
173 UFUNCTION(BlueprintCallable, Category = "Flow")
174 const TArray<FArticyBranch>& GetAvailableBranches() const { return AvailableBranches; }
175
176 //---------------------------------------------------------------------------//
177
179 UFUNCTION(BlueprintCallable, Category = "Setup")
181
182 bool OnTick(float DeltaTime);
183
184 DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnPushState);
185 DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnPopState);
186 DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPlayerPaused, TScriptInterface<IArticyFlowObject>, PausedOn);
187 DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnBranchesUpdated, const TArray<FArticyBranch>&, AvailableBranches);
188
189
191 UPROPERTY(BlueprintAssignable, Category = "Flow")
192 FOnPushState OnShadowOpStart;
193
195 UPROPERTY(BlueprintAssignable, Category = "Flow")
196 FOnPopState OnShadowOpEnd;
197
202 UPROPERTY(BlueprintAssignable, Category = "Flow")
203 FOnPlayerPaused OnPlayerPaused;
204
208 UPROPERTY(BlueprintAssignable, Category = "Flow")
209 FOnBranchesUpdated OnBranchesUpdated;
210
211protected:
212
213 //========================================//
214
218 // [Alewinn] : no valid reference in code, limit most probably set at Articy side.
219 //UPROPERTY(EditAnywhere, Category = "Setup", meta=(ClampMin=0))
220 //int32 BranchLimit = 32;
221
225 UPROPERTY(EditAnywhere, Category = "Setup", meta = (ClampMin = 0))
226 int32 ExploreLimit = 128;
227
232 UPROPERTY(EditAnywhere, Category = "Setup")
234
238 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Setup")
240
241 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Setup", meta = (ArticyClassRestriction = "ArticyNode"))
242 FArticyRef StartOn;
243
245 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Flow")
247
248 //---------------------------------------------------------------------------//
249
257 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Setup")
259
267 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Setup")
268 mutable UObject* UserMethodsProvider;
269
270private:
272 UPROPERTY(Transient, VisibleAnywhere, Category = "Debug")
273 mutable uint32 ShadowLevel = 0;
274
275 TQueue<FArticyBranch> BranchQueue;
276 FTSTicker::FDelegateHandle TickerHandle;
277
278 UArticyExpressoScripts* CachedExpressoInstance = nullptr;
279
280private:
287 void UpdateAvailableBranchesInternal(bool Startup);
288
290 UPROPERTY(Transient)
291 TScriptInterface<IArticyFlowObject> Cursor = nullptr;
292
294 void SetCursorToStartNode();
295
300 bool FastForwardToPause();
301
303 IArticyFlowObject* GetUnshadowedNode(IArticyFlowObject* Node);
304
305 UArticyDatabase* GetDB() const;
306};
307
308//---------------------------------------------------------------------------//
309// TEMPLATED METHODS
310//---------------------------------------------------------------------------//
311
318template<typename Lambda>
319void UArticyFlowPlayer::ShadowedOperation(Lambda Operation) const
320{
321 if (std::is_null_pointer<Lambda>::value)
322 return;
323 if (!ensure(GetGVs()))
324 {
325 UE_LOG(LogArticyRuntime, Warning, TEXT("FlowPlayer cannot get GVs!"));
326 return;
327 }
328 if (!ensure(ShadowLevel < ShadowLevelLimit))
329 {
330 UE_LOG(LogArticyRuntime, Warning, TEXT("More than 100 nested ShadowedOperations, probably there's an infinite loop in the Flow!"));
331 return;
332 }
333
334 //push shadow state
335 ++ShadowLevel;
336
337 //notify on push
338 GetGVs()->PushState(ShadowLevel);
339 GetGVs()->PushSeen();
340 UArticyDatabase::Get(this)->PushState(ShadowLevel);
341 OnShadowOpStart.Broadcast();
342
343 //execute the operation
344 Operation();
345
346 //notify on pop
347 OnShadowOpEnd.Broadcast();
348 UArticyDatabase::Get(this)->PopState(ShadowLevel);
349 GetGVs()->PopSeen();
350 GetGVs()->PopState(ShadowLevel);
351
352 //pop shadow state
353 if (ensure(ShadowLevel > 0))
354 --ShadowLevel;
355}
356
360UCLASS(BlueprintType, HideCategories = (Replication, Physics, Rendering, Input, Collision, Actor, LOD, Cooking))
361class AArticyFlowDebugger : public AActor
362{
363 GENERATED_BODY()
364
365public:
367public:
368 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Articy")
369 UArticyFlowPlayer* FlowPlayer = nullptr;
370private:
371
372 UPROPERTY()
373 UBillboardComponent* ArticyImporterIcon = nullptr;
374};
AArticyFlowDebugger()
Definition ArticyFlowPlayer.cpp:639
Definition ArticyFlowObject.h:19
virtual void Explore(UArticyFlowPlayer *Player, TArray< FArticyBranch > &OutBranches, const uint32 &Depth)=0
A data asset class for managing alternative global variables in the Articy runtime.
Definition ArticyAlternativeGlobalVariables.h:19
Definition ArticyDatabase.h:172
static UArticyDatabase * Get(const UObject *WorldContext)
Definition ArticyDatabase.cpp:217
The UArticyExpressoScripts class manages script conditions and instructions.
Definition ArticyExpressoScripts.h:819
Definition ArticyFlowPlayer.h:69
UArticyGlobalVariables * GetGVs() const
Definition ArticyFlowPlayer.cpp:204
FOnPlayerPaused OnPlayerPaused
Definition ArticyFlowPlayer.h:203
TArray< FArticyBranch > AvailableBranches
Definition ArticyFlowPlayer.h:246
uint8 ShadowLevelLimit
Definition ArticyFlowPlayer.h:233
UFUNCTION(BlueprintCallable, meta=(DisplayName="Set Start Node (ArticyRef)"), Category="Setup") void SetStartNode(FArticyRef NewId)
const TScriptInterface< IArticyFlowObject > GetCursor() const
Definition ArticyFlowPlayer.h:121
int32 ExploreLimit
Definition ArticyFlowPlayer.h:226
bool bIgnoreInvalidBranches
Definition ArticyFlowPlayer.h:239
void SetIgnoreInvalidBranches(bool bNewIgnoreInvalidBranches)
Definition ArticyFlowPlayer.h:113
void BeginPlay() override
Definition ArticyFlowPlayer.cpp:28
void ShadowedOperation(Lambda Operation) const
Definition ArticyFlowPlayer.h:319
bool IgnoresInvalidBranches() const
Definition ArticyFlowPlayer.h:180
UArticyAlternativeGlobalVariables * OverrideGV
Definition ArticyFlowPlayer.h:258
FArticyRef GetStartNode()
Definition ArticyFlowPlayer.h:109
UObject * UserMethodsProvider
Definition ArticyFlowPlayer.h:268
void EndPlay(const EEndPlayReason::Type EndPlayReason) override
Definition ArticyFlowPlayer.cpp:42
FOnPopState OnShadowOpEnd
Definition ArticyFlowPlayer.h:196
FOnBranchesUpdated OnBranchesUpdated
Definition ArticyFlowPlayer.h:209
FOnPushState OnShadowOpStart
Definition ArticyFlowPlayer.h:192
const TArray< FArticyBranch > & GetAvailableBranches() const
Definition ArticyFlowPlayer.h:174
Definition ArticyGlobalVariables.h:479
Definition ArticyFlowPlayer.h:40
TScriptInterface< IArticyFlowObject > GetTarget() const
Definition ArticyFlowPlayer.cpp:20
TArray< TScriptInterface< IArticyFlowObject > > Path
Definition ArticyFlowPlayer.h:49
bool bIsValid
Definition ArticyFlowPlayer.h:53
Definition ArticyBaseTypes.h:18
Definition ArticyRef.h:13