[OPEN SOURCE] Not Yet: Dialogue System

Hi, my team and I while working on our game WarriOrb has developed yet another Dialogue plugin, because we thought the current Dialogue plugins on the market did not fit our needs. So here we are today releasing this awesome (we hope so) Plugin to everyone who wants to use it.

:shopping_cart: Marketplace (binaries are paid)

:fireworks: Feature Showcase
:movie_camera: Video Tutorials
:open_book: Documentation
:office: Example Project
:bug: Patch Notes
License: MIT
Plugin Source Code repository: Here
Current Version: v13.1
Contact : Discord or here in this forum post

Features:

  • 100% open source, source code included
  • Full Blueprint and C++ support
  • Events and conditions
  • Branching based on different node types and conditions
  • Well structured runtime and editor modules
  • Full editor support including:
  • Graph Editor
  • Search window
  • Dialogue Browser to get a good overview of all the dialogues
  • Customized blueprint nodes to handle certain events and conditions in Blueprint easily
  • Settings panel in Editor Preferences to modify the layout
  • Option to import from and export to plain text formats (e.g. json)
  • Real time display/edit functionality of the Dialogue runtime data.

Contribution, feedback and constructive criticism are appreciated and we would be really happy to hear about your game using our tool.
Should it prove useful to you, the best way to say thanks is to mention us and our game to your own audience.

Video Tutorials:

  • Create your first Dialogue Project Tutorial
  • Basic Events, Conditions, Text arguments, Save/Load
  • Using Dialogue Variables #1

Feature showcase Here:

  • Easy to use graph editor:

https://gitlab.com/NotYetGames/DlgSystem/uploads/f61f5226c7545506aacb69bf32b0da38/graph_editor.gif

  • Local and global search and jump to node functionality:

https://gitlab.com/NotYetGames/DlgSystem/uploads/ed4d615d8bba410ae7799af35467b6aa/search_0.gif

  • Customized details panel where your FName identifiers are cached for auto-completion:

https://gitlab.com/NotYetGames/DlgSystem/uploads/e5577cfab31e7c90e1c5006928ee3592/details_panel.gif

  • Dialogue Browser to have an overview of the system related data:

https://gitlab.com/NotYetGames/DlgSystem/uploads/fbd3486dd05cfcf852ccf0bb6a9f30b9/browser.gif

  • Preferences panel to change editor layout and behavior:

https://gitlab.com/NotYetGames/DlgSystem/uploads/773b98d3ce11a44cdef597e75b9f6c0e/preferences.gif

  • The feature we always missed from the animation state machine :wink:

https://gitlab.com/NotYetGames/DlgSystem/uploads/35b55cb796d08f9aefa9ecd6d036b00c/retarget.gif

2 Likes

This honestly looks amazing. I am downloading the source now to compile it :smiley:

This is amazing! thankyou!

A quick update, we just implemented a new feature that allows you to modify the runtime data of the Participant Actors that implement the IDlgDialogueParticipant interface. This is very useful if you want to test the Dialogues easily at runtime or just to cheat in your game ;).

Showcase video from the Example project:

To open the runtime editor you just need run the console command Dlg.DlgDataDisplay.
OR
After running the game in the editor you can open the **DlgDataDisplay **window by going to: Window -> Dialogue Data Display

Before you can use the DlgDataDisplay Window you need to register the console commands of the Plugin. An example is provided in the project here.

In the showcase video above you can see that at runtime only two actors Implement the IDlgDialogueParticipant interface: *TopDownCharacter_C_0 *and MrCube_182.

The Character can talk with the cube to change the color of the cube, but every time a color is changed the int variable **ColorChangeRequest **is incremented (up to 4 times).
The Cube is changing the color by using some events: ColorToRed, ColorToGreen, ColorToBlue.
You can change the color of the cube by simply talking to it or by triggering the events in the **DlgDataDisplay **window.

This of course works in every project with any amount of actors that implement the **IDlgDialogueParticipant **interface properly, see the example project for a reference :).

Happy Hacking.

Hi,
Quick update, you can also find the Plugin on the Marketplace

Cool and thank you again guys! :rolleyes:

An Update regarding branches, we plan to remove the master branch and instead use branch names depending on the version of UE they support. (e.g. for UE 4.18 the branch name is 4.18).
The default branch would be the UE version we are using in our project at any time (it is 4.18 at the time of writing this post)

If you are using or plan to use the Plugin as a submodule in your project please update/add the git submodule with the branch name you want it to track.

NOTE: That some old branches are no longer maintained, please read the README for that branch first :slight_smile:

Really awesomeā€¦ thank you.

Could you add a Typewriter effect? That would be really cool.

an example:

This looks like a decent project, since I am still tinkering to what extent dialogue will play a part in my game (maybe huge), planning to test it out.

This looks amazing! Is it possible to use this to call functions, such as opening a shop widget?

The plugin does not have any UI logic (we considered the UI to be too game specific to include it).

We have events for that. Your trader implements the interface, then you can call an event with e.g. name ā€œOpenShopā€ on him/her/it.
In your trader code/blueprint you can implement the event handler function, and you can open the shop from there.

Is there any way to check which node youā€™re on (by like, number or something) and jump back to it later? Like if I was to make a visual novel, Iā€™d want to save which node iā€™m on when I save, and when I load, Iā€™d want to jump straight there after loading all my variables and stuff.

Unfortunately not yet, saving during dialogue is something we did not need.

It is rather easy to do (all I need to do is to write a getter function for a protected variable and a function which starts a context with a given node index), I am going to add that tomorrow.
You will be able to get the newest version from the gitlab repository right away. Unfortunately doing a marketplace update takes unpredictable time, I canā€™t really tell how long it will take to include this in that version as well.

Alright, thanks man, looking forward to it. Great plug-in btw, thanks for sharing it for free.

Any chance you guys could add a couple of things? I know some of these might be a pain to add because youā€™d probably have to redo your branches in your project but I think they would make the plug in a lot better.

  1. Enter requirements check against another participantā€™s value. For example, the node can be entered if the main character has less strength than their ally. So if there is no other participant, it would just check against the given value like it does now. I know this can be done by checking a custom bool but that would get pretty annoying to do if you have to do it a lot.

  2. Check if the child has been entered or not. So if youā€™re playing a choice based game whoā€™s options loops back, you can tell the player theyā€™ve chosen a choice already by graying out the text or something, but itā€™s still enterable. As far as I can tell, itā€™s not possible to do in blueprints atm

  3. Get all choices, even the ones that canā€™t be entered. I know in one of the .h files you said that itā€™s a todo thing, so if it was really easy to do, you probably would have done it by now. But ultimately, I believe itā€™s player friendly to allow them to choose if they see unpickable choices or not, so while itā€™s not really necessary, it would be really nice.

Thanks for the list, all three sounds like a pretty good feature to have!
Request 3 wasnā€™t skipped because it was too hard - we simply did not have the need to add it.

I added the requests to our issue list:

Unfortunately we have a few things going on which requires much of our attention, so I canā€™t really promise to do them in the near future (next few weeks).
I am sure we will get there eventually though.
Meanwhile both the issue tracker and the repository is public, and contributions are welcome.

Hi, love the plugin so far. I was wondering if it was possible to change the text in a node with a variable, for instance putting a players name into the text itself? Iā€™ve had a look through and canā€™t seem to find a way of doing this.

Hi!

Unfortunately it is not possible yet.
We have an opened issue about it:

We might implement it in the future, but I canā€™t promise anything at the moment :frowning: Sorry about that.

This is how Iā€™m currently doing it in blueprints. So if you wanted to get the playerā€™s name, it would look something like ā€œHello [Player:Name:First Name]ā€

I forgot to mention here, but now there are new event and condition types which work directly with UProperties. You can use them to set/get normal unreal float, bool, fname, and int variables, and compare them the way you do with the participant variables. It also works with auto-complete if you set up the blueprint class for the participants in the dialogueā€™s details panel.

@Ispheria:

I just implemented your third request, it is already in the public repository and it will be included in the next marketplace update.
Iā€™ll try to take care of the rest in the near future as well.

Nice solution for the variables in text issue, thanks for sharing it.
As far as I know however it wonā€™t support localization - because you convert the text to string. Unfortunately I canā€™t really think of any better solution at the moment - I will try to look into the C++ implementation of the FText::FormatText() node and see if we can integrate something similar into the dialogue editor.

About the new feature:

We have new functions in DlgContext which provide data from the unsatisfied options as well.
New functions are GetAllOptionNum(), GetOptionTextFromAll(int32 Index), IsOptionSatisfied(int32 Index), GetOptionSpeakerStateFromAll(int32 Index). Most of the functions are like the old ones, but these expect other indices (between 0 and GetAllOptionNum() and not between 0 and GetOptionNum()).

There is also a helper function ChooseChildBasedOnAllOptionIndex() which uses this new index type. I hope it isnā€™t too confusing.

Edges now have a bIncludeInAllOptionListIfUnsatisfied bool variable, which is true by default. Set this to false if you want to stop an edge from being included and accessible.