A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
DlgExportTwineCommandlet.h
Go to the documentation of this file.
1// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.
2#pragma once
3
4#include "Commandlets/Commandlet.h"
5
6#include "DlgExportTwineCommandlet.generated.h"
7
8
9DECLARE_LOG_CATEGORY_EXTERN(LogDlgExportTwineCommandlet, All, All);
10
11class UDlgDialogue;
12class UDlgNode;
14struct FDlgEdge;
15
16
17UCLASS()
19{
20 GENERATED_BODY()
21
22public:
24
25public:
26
27 //~ UCommandlet interface
28 int32 Main(const FString& Params) override;
29
30 FString CreateTwineStoryData(const FString& Name, const FGuid& DialogueGuid, int32 StartNodeIndex, const FString& PassagesData);
31
32 FString CreateTwinePassageDataFromNode(const UDlgDialogue& Dialogue, const UDlgNode& Node, int32 NodeIndex);
33 FString CreateTwinePassageDataLinksFromEdges(const UDlgDialogue& Dialogue, const TArray<FDlgEdge>& Edges, bool bNoTextOnEdges = false);
34
35 FString CreateTwinePassageData(int32 Pid, const FString& Name, const FString& Tags, const FIntPoint& Position, const FIntPoint& Size, const FString& Content);
36
37 FString CreateTwineCustomCss();
38
39 FORCEINLINE FIntPoint GraphNodeToTwineCanvas(int32 PositionX, int32 PositionY)
40 {
41 // Twine Graph canvas always starts from 0,0 - there is not negative position
42 const int32 NewX = FMath::Abs(MinimumGraphX) + PositionX;
43 const int32 NewY = FMath::Abs(MinimumGraphY) + PositionY;
44 return FIntPoint(NewX, NewY);
45 }
46
47 bool GetBoxThatConflicts(const FBox2D& Box, FBox2D& OutConflict);
48 FIntPoint GetNonConflictingPointFor(const FIntPoint& InPoint, const FIntPoint& Size, const FIntPoint& Padding);
49
50 static FString CreateTwineTagColorsData();
51
52 FString GetNodeNameFromNode(const UDlgNode& Node, int32 NodeIndex, bool bIsRootNode = false);
53
54 FORCEINLINE static FString& EscapeHtml(FString& String)
55 {
56 String.ReplaceInline(TEXT("&"), TEXT("&amp;"), ESearchCase::CaseSensitive);
57 String.ReplaceInline(TEXT("\""), TEXT("&quot;"), ESearchCase::CaseSensitive);
58 String.ReplaceInline(TEXT("'"), TEXT("&apos;"), ESearchCase::CaseSensitive);
59 String.ReplaceInline(TEXT("<"), TEXT("&lt;"), ESearchCase::CaseSensitive);
60 String.ReplaceInline(TEXT(">"), TEXT("&gt;"), ESearchCase::CaseSensitive);
61 return String;
62 }
63
64 FORCEINLINE static FString EscapeHtml(const FString& String)
65 {
66 FString NewString = String;
67 NewString.ReplaceInline(TEXT("&"), TEXT("&amp;"), ESearchCase::CaseSensitive);
68 NewString.ReplaceInline(TEXT("\""), TEXT("&quot;"), ESearchCase::CaseSensitive);
69 NewString.ReplaceInline(TEXT("'"), TEXT("&apos;"), ESearchCase::CaseSensitive);
70 NewString.ReplaceInline(TEXT("<"), TEXT("&lt;"), ESearchCase::CaseSensitive);
71 NewString.ReplaceInline(TEXT(">"), TEXT("&gt;"), ESearchCase::CaseSensitive);
72 return NewString;
73 }
74
75protected:
76 static void InitTwinetagNodesColors();
77
78protected:
79 FString OutputDirectory;
80
81 // Flatten files to the same directory
82 bool bFlatten = false;
83
84 // used to compute the proper size
85 int32 MinimumGraphX = 0;
86 int32 MinimumGraphY = 0;
88 // Stop overlapping nodes
89 TArray<FBox2D> CurrentNodesAreas;
90
91 // Maps from:
92 // Key: NodeTagName
93 // Value: Color name https://twine2.neocities.org/#type_colour
94 static TMap<FString, FString> TwineTagNodesColorsMap;
95
96 static const FIntPoint SizeSmall;
97 static const FIntPoint SizeWide;
98 static const FIntPoint SizeTall;
99 static const FIntPoint SizeLarge;
101 static const FString TagNodeStart;
102 static const FString TagNodeEnd;
103 static const FString TagNodeVirtualParent;
104 static const FString TagNodeSpeech;
105 static const FString TagNodeSpeechSequence;
106 static const FString TagNodeSelectorFirst;
107 static const FString TagNodeSelectorRandom;
DECLARE_LOG_CATEGORY_EXTERN(LogDlgExportTwineCommandlet, All, All)
UCLASS(BlueprintType, Meta = (DisplayThumbnail = "true"))
Definition DlgDialogue.h:85
FString CreateTwineStoryData(const FString &Name, const FGuid &DialogueGuid, int32 StartNodeIndex, const FString &PassagesData)
static const FString TagNodeVirtualParent
int32 Main(const FString &Params) override
static TMap< FString, FString > TwineTagNodesColorsMap
static const FString TagNodeSpeechSequence
static FORCEINLINE FString & EscapeHtml(FString &String)
FString CreateTwinePassageDataLinksFromEdges(const UDlgDialogue &Dialogue, const TArray< FDlgEdge > &Edges, bool bNoTextOnEdges=false)
FString GetNodeNameFromNode(const UDlgNode &Node, int32 NodeIndex, bool bIsRootNode=false)
FString CreateTwinePassageData(int32 Pid, const FString &Name, const FString &Tags, const FIntPoint &Position, const FIntPoint &Size, const FString &Content)
static const FString TagNodeSelectorRandom
bool GetBoxThatConflicts(const FBox2D &Box, FBox2D &OutConflict)
FIntPoint GetNonConflictingPointFor(const FIntPoint &InPoint, const FIntPoint &Size, const FIntPoint &Padding)
FORCEINLINE FIntPoint GraphNodeToTwineCanvas(int32 PositionX, int32 PositionY)
FString CreateTwinePassageDataFromNode(const UDlgDialogue &Dialogue, const UDlgNode &Node, int32 NodeIndex)
static const FString TagNodeSelectorFirst
static FORCEINLINE FString EscapeHtml(const FString &String)
UCLASS(BlueprintType, Abstract, EditInlineNew, ClassGroup = "Dialogue")
Definition DlgNode.h:40
USTRUCT(BlueprintType)
Definition DlgEdge.h:25