API Reference
Joint Native API Reference
Here is the place where everything fundamental about Joint Native is explained at. We mainly focus on explaining about what each class does and how we implemented that feature.
This documentation will be updated and reinforced through the future updates.
There are some parts that are not explained yet - you can check them out on the release notes or the source code directly for now. We will update this documentation as soon as possible.
Joint Native Might Receive Breaking Changes
Joint Native is still under frequent update, and can have a lot of changes on the contents in the future update.
So it is not wise to modify the plugin for your project on the original installation folder. You need to make the contents that work with Joint or Joint Native separated from Joint and Joint Native's content or source folder.
We want to say, you must let those plugin be itself, without getting touched!
Fragments
Detailed explanation for the fragments on the system.
In Joint 2.5.0, the design of the slates in the system has been reworked and some of the images of them show the old design yet. Though they will work the same.

Flow
Select
An implementation of user-selectable branching option for the dialogue.
One select node means one option on the branching. It will have a pin that refers this select option's branching target.
When bIsSelected is true, it will return the following next nodes for this node on the SelectNextNodes().
This node itself doesn't have any actions by itself. You have to check out how the other nodes related to the select node use this node to see how they actually halt the dialogue playback and implement the selection actions.
Joint Native provides Vote fragment for that purpose. See that parts as well.
You can attach some sub nodes for the select nodes and parse it to display some additional data for the widgets or etc. See how the sample widget for the Joint utilize the DF_Text on the select node like.
Sequence
Sequence node is a node that you can play the node in sequence. (one by one)
Sub nodes attached to this node will be played after the prior sub node has been marked as pending.

Text Related
Text
Text fragment is a fragment that contains a text variable. It can be used on various situations.
Also, Text fragment has TextStyleInstance property that can receive a text style fragment on the graph.
You can get the text style table with GetTextStyleTableIfPresent. If there is no valid text style fragment specified or the fragment doesn't have a valid text style table, it will return nullptr.

Text fragment's graph node, UDialogueEdFragment_Text provide a simple text editor by default.
If you specify the text style node this fragment will use, it will start to display an WYSIWYG editor that you can apply a styling on the text.

You can select the style you want to use from the dropdown menu, and press ctrl + shift + s (style) to apply the style on the selection.

You can press the pipette button and click the text with styling to pick up that style to use on styling.
You can press the magnifying glass button to see and edit the raw text with the decoration for the styling.

Text Style
Text Style fragment is a fragment that contains a text style table. Basically every data table can be provided, but if it is used by a text fragment, the table's row struct type must be FRichTextStyleRow.

Dialogue Voice - Audio Dialogue
Dialogue Voice (Audio) related fragments.
Dialogue Voice system is Unreal's native audio based dialogue system. And well, it's not the best one, to be honest. But it has very certain, charming advantages:
- Unreal's localization system works very well with it.
- Easily accessible, and easy to use.
- It's maintained by Epic Games.
That's why we added fragments that work with Dialogue Voice & Wave system of Unreal. But if you want, you can implement your own fragments that work with custom audio dialogue system, but we quite recommend you to use native system as well.
We aren't very experienced with the dialogue wave & voice system's workflow, so those fragments remain quite rudimentary. (but those are been field tested, and good enough to be used in the actual product)
If you have any cool experiences or ideas about its design, or suggestions, please let us know, Let us improve those fragments further!
We are currently aiming to provide a feature that automatically store the played time of the sound cue, and allowing it to be resumed from there. It will be useful when the dialogue is being halted, maybe because characters get hurt.
Dialogue Voice

A data fragment that contains Dialogue Voice asset. It can be used with other fragments. Especially, this fragment will be used together with participant fragments.
Dialogue Play Dialogue Wave

A fragment that plays specified dialogue wave with specified Speaker Dialogue Voice and Target Dialogue Voices.

Specified Dialogue Voices will be used to find the dialogue context in the dialogue wave asset, and it will play the sound cue of that context.
You can also make it keep being active while the sound cue is being played, and also make the sound cue to be finish when this node is end played. (when player skip to the next node especially.)
Dialogue Play Dialogue Wave

A fragment that plays specified dialogue wave with specified Speaker Dialogue Voice and Target Dialogue Voices.
You must provide participant fragments that has a Dialogue Voice fragment to this. You can check Attach on Speaker option to attach the spawned sound cue to the speaker participant.

You can make it stop the sound cue automatically when the character that the sound cue is attached at is destroyed on the level. This is useful to make it stop when characters dead.
Participant Related
Participant
A fragment that represent specific participant component on the graph. You can access the participant with this node.
This node can be used in various situation when you need to get the reference of the participant in the graph.
This node will automatically collect the participant that matches with the ParticipantTag property when bAllowCollectingParticipantComponentOnWorldAutomatically is true.
You can access the participant that this node refers with ParticipantComponentInstance or GetParticipantComponent. You can set this value to specify the component this node will use before that participant node begins played.
If you manually specified the participant before it begins, it will ignore the bAllowCollectingParticipantComponentOnWorldAutomatically and will not search the participant on the world.
To specify the participant, we recommend to make it as a manager fragment, and attach some tag to it to access it before we start off the dialogue, and provide the participant component to the ParticipantComponentInstance.
For most cases, it is recommended to be used as manager fragment and recycle it, due to the auto collect action's performance cost. It's not that big, but also not necessary to iterate through the participant components on the world everytime.
Speaker And Listener
A default implementation of the speakers and listeners in the dialogue node. Useful when we have to display which participants are involved in the conversation manually.
You can provide Participant fragments to the Speakers and Listeners property as you want.
You can get the speaker and listener participants with the GetAllSpeakers and GetAllListeners.

Condition & Branching
Branching
Branching fragment is the most fundamental node for the flow control of the graph.
You can control the flow of the dialogue by attaching condition nodes on this node.
If the attached condition nodes passes the condition check, branch node will play the nodes at the true pin. Otherwise, it will play the nodes at the false pin.
You can disable the false pin with bUseFalse variable. When the false pin is disabled, dialogue instance will continue to the next branching fragment if available. So you can create simple if-else branching with it.
It will not return any of the nodes if it was not played.

Condition Fragments
Condition fragments are the fragments that will be used to express conditional checks in the graph.
Currently, we support 2 usages for condition fragments:
- Branching Fragment Conditional Check: When the condition fragments pass the check, branching fragment will play the pins at true pin, otherwise, play node on the false pin.
- Conditional Fragments : You can make fragments be only played under certain conditions with them (See Condition AND for this usage)
You can use them on your custom system as well to express condition system as well. See how branching fragment does this.
Condition AND

AND condition for the dialogue. It will be marked failed if any of the condition fragments under itself is marked as failed on the check.
If Use Asynchronous Playback is unchecked, It will play all the subnodes simultaneously and decide whether it is failed or not when this node is marked as pending.
*If Use Asynchronous Playback is checked, It will play through the sub nodes one by one asynchronously just like the sequence node does, but it will break the iteration when any sub node changes the bConditionResult value to false.

You can make fragments be only played under certain conditions with condition AND.
Just check Use Asynchronous Playback, and put the fragment at the tail of condition AND fragment's sub node list. Just like the image above!
Condition OR
OR condition for the dialogue. It will be marked failed if all the condition fragments under itself is marked as failed on the check.
If Use Asynchronous Playback is unchecked, It will play all the sub nodes simultaneously and decide whether it is failed or not when this node is marked as pending.
*If Use Asynchronous Playback is checked, It will play through the sub nodes one by one asynchronously just like the sequence node does. Not like condition AND, it will not break the iteration.
Condition NOT
NOT condition for the dialogue. It will be marked failed if any of the sub node condition fragments fails.
NOT + AND, so to speak.
Condition Is Actor Valid
A little condition fragment that will be marked as failed when specified actor on the level is not valid.
This one is close to a sample condition fragment, instead of some fundamental one.
Condition Is Networking
A little condition fragment that will be marked as failed when the current session is not a standalone session type.
Can be useful on making multiplayer games.
If you are looking for the conditional playback according to the networking session types, Also check out for the OnAuthority, OnServer, OnClient, OnNetworking, OnStandalone fragments. They must be better for the most of the productions.
Interaction
Interaction related fragments. Not just for the user interactions, but can be used to interact with internal, systematical interaction under the hood.
Wait Skip

A fragment that waits until the dialogue instance to get a specified gameplay event tag.
This can be used to block the dialogue playback until the player requests stop.
This fragment supports networking as well.

You can check Wait Until All Players Skips to make it halt the playback until all players agree to skip in a networking session.
Check Use Skippable Players to allow only some specific players to get involved in the skip action. And specify Players fragment on Skippable Players property as well.
You can use Linear Amount Of Player Count to Skip to make it require the request of only certain ratio of the total player count, or Offset Count to Skip to give absolute offset to it (this will be added to count, so if you want to reduce the count, you have to provide negative value to it.)
Make sure to check Replicates, to make it work properly in the networking sessions.
If Wait Until All Players Skips is unchecked, it will work just like in a standalone session.
Vote

A fragment that will conduct user selectable vote for flow branching. Both works in singleplayer & multiplayer games.
Put Select fragment as its sub nodes to implement each option for the vote.
This fragment supports networking as well.

Check Use Votable Players to allow only some specific players to get involved in the vote. And specify Players fragment on Skippable Players property as well.
You can use Vote Countdown Duration to specify the duration of vote.
You can use Allow Withdrawal to allow users to change their vote after selecting one.
Make sure to check Replicates, to make it work properly in the networking sessions.
Networking
Networking relate fragments. Useful to make some production on the multiplayer games.
On Authority & On Client & On Networking & On Server & On Standalone
As their names tell, they will play their sub nodes under certain conditions.

Just like the image above, you can use it to make certain sessions do certain things according to their type.
Well, it's still only preventing the playback, so clients can still access the node that will be played only in the server.
We're aware of the possible issues with this so, we're also planning to make a system that let you specify whether to include or exclude the fragments according to the build target.
Please wait for the future update!
Conditions for each fragment are as following:
- On Authority: when this session has the authority over the dialogue instance, play its sub node.
- On Client: when this session is a client (client, standalone), play its sub node.
- On Server: when this session is a server (dedicated, listen server, standalone), play its sub node.
- On Networking: when this session is not a standalone session, play its sub node.
- On Standalone: when this session is a standalone session, play its sub node.