Dialogue Forge

A modular dialogue tool that supports any engine/framework that can read JSON files.Ver 1 is out!


Docs

About

Dialogue Forge is a modular dialogue tool that supports any engine/framework that can read JSON files. Easily expand the tool to fit your needs, no coding required!Easily create everything from branching dialogues to simple sign readings. It molds to fit your needs.


Compatibility

Dialogue Forge is available for Windows, Mac and Linux. Pay once to get access to everything including all future updates!Since the file gets exported as a JSON file, any engine/framework that can read JSON files can support this tool.This includes but is not limited to Unity, Unreal, Godot, Gamemaker, Construct, Love2D, Pygame, SDL, Raylib and Monogame.


Get Started

## Launch Dialogue Forge
Firstly, launching Dialogue Forge will greet you with a welcome page where you can choose to create a new project or open an old one.
---## Creating a New Project
Dialogue Forge will ask you what you want to name your first dialogue. Dialogue Forge shows all your dialogues in a list for easy switching, whatever you name your dialogue will act as the key used to store it in the JSON export.
NOTE: Dialogue Forge tool CANNOT read the exported file, only the save file!---## Saving Your Project
Alright, now that you've made a new project let's save it! You can use ctrl/cd + s or click File -> Save. Since this is your first time saving your project, both options will prompt you to select where you want to save it as well as what to name it. After saving the file, ctrl/cmd + s can be used to quickly save the file while going to File -> Save will allow you to save it as a separate file. Any empty dialogues will not be saved. Files are saved with the ending .minodm but in realty, it's just a JSON ;)
---## Learning About Labels
Labels are used all throughout your project. These will be what you use to know what type of data it contains when parsing the JSON file in your engine/framework of choice. Dialogue Forge comes with many built-in labels, but remember, this is a flexible text editor! You can create your own labels easily by just following the syntax.
Each label will follow this syntax: #Label NameFor example, here's what the Dialogue Label looks like:Those with a keen eye may have noticed the extra [#typeon = false] next to the label, that's called a variable! Let's look at that closer.---## Learning About Variables
Sometimes a simple label isn't enough, and we need to store some extra data. In the Dialogue Label example, it comes with a default variable called typeon. When parsing the JSON, this can be useful to know if you want to text to have a type on effect or just appear automatically.
How do we add our own variables? Easy! Just follow the syntax: [#variableName = value]NOTE: Most of the built-in labels come with default variables, you can view a comprehensive list here(FINISH THIS).---## Learning About Data
Each label has it's own data, which is stored in an array in the order it appears in. Let's continue to use our Dialogue Label as an example.
Sometimes, we want to divide up our dialogue into chunks, but the speaker never changes, it's all part of "one" dialogue. This is where the data array comes in handy.If you just have one line of dialogue you want, simply enter a new line and add a - and type your dialogue next to it. What do you do if you want to divide up your dialogue? Simply repeat the steps mentioned above.---## Creating a New Dialogue
Alright, we've made a simple dialogue but now we need another one! You can simply either use the shortcut ctrl/cmd + n to add a new dialogue or go to File -> New Dialogue. This will prompt you the same way it does when you make a new project, but now you can add multiple dialogues at once! When you're done simply press the X at the top right.
Whenever you add a new dialogue, it'll automatically open it in the editor, saving your previous dialogue so you won't lose any progress!---## Switching Dialogues
To switch between your dialogues, simply click on whichever it is you want to open. Switching dialogues automatically will save whatever you had done with the previous version.
NOTE: This does not save the actual file, only the local file the program is reading from, you still have to do ctrl/cmd + s or File -> Save to actually save the file.---## Delete a Dialogue
Let's say you want to delete a dialogue you no longer need. Simply click the - sign next to the dialogue and it'll ask you to confirm before deleting.
IF YOU ACCIDENTLY DELETE A FILE, SIMPLY CLOSE THE PROGRAM WITHOUT SAVING AND IT'LL LOAD YOUR LAST SAVED FILE.---## Supporting Translations
While you cannot do your translations directly in the editor, you can use the shortcut ctrl/cmd + t or File -> Translation to add a translation ID.
Translation IDs appear to look like a variable, which they kinda are! You can either place a translation ID on the same line as a label, making it get saved as a variable in the JSON file, or you can place it on the data line it connects to.---## How To Export Your Dialogue
Great, we've made a simple dialogue file and now we want to export it to use in our game! Let's go over that.
To export your file, you can either use the shortcut ctrl/cmd + e or you can go to File -> Export.From there you'll be asked if you want to export your files all in one or save them separately.---## How To Read The JSON File
Let's quickly go over how to read the JSON export. We'll be using the below file as out example:
In both export types, each label is one "key" in the dictionary, starting from 0. This holds a dictionary with a keys "DATA" which stores an array, "LABEL" which stores the label and "VARIABLES" which stores a dictionary of your variables, using the name as the key and the value as the... value 😅.If a dialogue is empty, it will not be saved. So in this example Empty was blank, so it will not appear.### One File JSON
In a one file JSON export, the dictionary will use the name of the dialogues as the key. In order to get easy reference to the labels used, there will also be another key added called dialogue name + _Labels. These store the label name as a key and then the line they correspond to as a value, making it easy to jump to labels.
json
{
"Intro Sign": {
"0": {
"DATA": [
"Welcome to [b]dialogue forge![/b]"
],
"LABEL": "Dialogue",
"VARIABLES": {
"typeon": "false"
}
}
},
"Intro Sign_Labels": {},
"Simple Dialogue": {
"0": {
"DATA": [
"Shopkeeper"
],
"LABEL": "Speaker",
"VARIABLES": {
"translationID": "ux4cg32y"
}
},
"1": {
"DATA": [],
"LABEL": "Portrait",
"VARIABLES": {
"file": "shopkeeper_neutral"
}
},
"2": {
"DATA": [
"Traveler, welcome to [b]dialogue forge[/b]. [#translationID = gwws2hez]",
"Would you like help with anything? [#translationID = vbq2zcd2]"
],
"LABEL": "Dialogue",
"VARIABLES": {
"typeon": "false"
}
},
"3": {
"DATA": [
"Yes, where can I learn more? [#translationID = 1sxbhiyv]",
"No thank you. [#translationID = t2jkcbzm]"
],
"LABEL": "Choice",
"VARIABLES": {
"random": "false"
}
},
"4": {
"DATA": [],
"LABEL": "Label",
"VARIABLES": {
"label": "tutorial"
}
},
"5": {
"DATA": [
"Sure, you can read more about what you can do by visiting the docs. [#translationID = 4d0kcmfw]"
],
"LABEL": "Dialogue",
"VARIABLES": {
"typeon": "false"
}
},
"6": {
"DATA": [],
"LABEL": "Label",
"VARIABLES": {
"label": "noTutorial"
}
},
"7": {
"DATA": [
"Enjoy your stay. [#translationID = jlus0x7y]"
],
"LABEL": "Dialogue",
"VARIABLES": {
"typeon": "false"
}
}
},
"Simple Dialogue_Labels": {
"noTutorial": 6,
"tutorial": 4
}
}
### Separate JSON Files
In a separate JSON file export, each dialogue will be it's own JSON file, with the JSON name being that of the dialogue. In these files, there are two keys, one named Dialogue that stores the actual dialogue data, and one named Labels to easily access labels as mentioned above in One File JSON.
Intro Sign:
json
{
"Dialogue": {
"0": {
"DATA": [
"Welcome to [b]dialogue forge![/b]"
],
"LABEL": "Dialogue",
"VARIABLES": {
"typeon": "false"
}
}
},
"Labels": {}
}
Simple Dialogue:
json
{
"Dialogue": {
"0": {
"DATA": [
"Shopkeeper"
],
"LABEL": "Speaker",
"VARIABLES": {
"translationID": "ux4cg32y"
}
},
"1": {
"DATA": [],
"LABEL": "Portrait",
"VARIABLES": {
"file": "shopkeeper_neutral"
}
},
"2": {
"DATA": [
"Traveler, welcome to [b]dialogue forge[/b]. [#translationID = gwws2hez]",
"Would you like help with anything? [#translationID = vbq2zcd2]"
],
"LABEL": "Dialogue",
"VARIABLES": {
"typeon": "false"
}
},
"3": {
"DATA": [
"Yes, where can I learn more? [#translationID = 1sxbhiyv]",
"No thank you. [#translationID = t2jkcbzm]"
],
"LABEL": "Choice",
"VARIABLES": {
"random": "false"
}
},
"4": {
"DATA": [],
"LABEL": "Label",
"VARIABLES": {
"label": "tutorial"
}
},
"5": {
"DATA": [
"Sure, you can read more about what you can do by visiting the docs. [#translationID = 4d0kcmfw]"
],
"LABEL": "Dialogue",
"VARIABLES": {
"typeon": "false"
}
},
"6": {
"DATA": [],
"LABEL": "Label",
"VARIABLES": {
"label": "noTutorial"
}
},
"7": {
"DATA": [
"Enjoy your stay. [#translationID = jlus0x7y]"
],
"LABEL": "Dialogue",
"VARIABLES": {
"typeon": "false"
}
}
},
"Labels": {
"noTutorial": 6,
"tutorial": 4
}
}


Interface

File: Where you can save, load, export and create a new dialogue, file or translation ID.Insert: Forgot all the default labels available? No problem, simply click insert and get a list of all the options. Clicking one will add it to your file.Docs: Open up the docs, aka this!Bug: Help the tools development by reporting bugs! Screenshots and gifs, as well as the save or JSON file when necessary will make the job easier.Request: Help the tools development by requesting features you think should be in the program!Info: Check the tool version and my contact information, plsu click on the logo to get taken to this website!


Default Markers

In Dialogue Forge there are tons of built-in labels for you to use, with default variables. These have been chosen based on common necessities when creating dialogues for games.This tool has no set rules besides formatting, you can use/ignore/adjust these labels as needed. Adjust them to suit your games needs, the heavy lifting will be your dialogue parser script!Let's go over the default labels and their intended values:
1. #Speaker: Meant to be used to set who the current speaker is.
2. #Portrait [#file = null]: Meant to be used to display a portrait for the speaker, or for something else. The file variable is meant to store either the file directory or key word for the desired file.
3. #Dialogue [#typeon = false]: Meant to be used to display dialogue. The typeon variable lets you easily set whether the dialogue should be typed onto the screen or if it should be automatic, defaulting to false.
4. #Text_Input: Meant to be used when you want to take in the players input, like for example, their name.
5. #Choice [#random = false]: Meant to be used to list off choices a player can choose from. The random variable can be used to, for example, randomly show one of the options rather then all of them.
6. #Animation [#animName = null] [#loop = false] [#await = false]: Meant to be used to call animations. It has a lot of variables! The animName variable is the name of the animation to play, the loop variable is whether to loop the animation or not and the await variable is to know if you should wait til the animation is finished to keep going or not.
7. #Wait [#duration = 1]: Meant to be used to have nothing happen for a set amount of time. duration is used to store the length of the wait.
8. #Call_Function: Meant to be used when you want to call some sort of function in your code, like calling a function that gives a player a quest or item.
9. #Conditional: Meant to be used when you want to have different things happen based on a certain stat. For example, have the dialogue split based on some friendship score.
10. #Set_Local_Variable: Meant to be used to store variables local to the dialogue file. Can be used to track stats, like maybe how many times someones been talked to. The variableName variable is the variable name and the value variable is the value of the variable.
11. #Set_Game_Variable: Meant to be used similar to the Set_Local_Variable label, but is local to the actual game. For example, it can be used to reference a quest in your game files and set it's completion to true. The variableName variable is the variable name and the value variable is the value of the variable.
12. #Music [#file = null] [#loop = false] [#stop = false]: Meant to be used to play (or stop) a music file. The file variable is the music file, the loop variable is whether or not to loop the music and the stop variable is if you want to stop the music rather then play it.
13. #SFX [#file = null]: Meant to be used to play a sound effect. The file variable stores the sfx file.
14. #VO [#file = null]: Meant to be used to play a voice over. The file variable stores the voice over file.
15. #Label [#label = labelName]: Meant to be used as a way to mark sections of the dialogue for easy jumping around. The label variable stores the label name.
16. #JumpToLabel [#label = labelName]: Meant to be used as a way to actual tell the program to jump to a specific label. The label variable stores this label name.
I want to reiterate these are NOT rules to follow, you can use these markers however you see fit, these are just what I was imagining when designing them. The code that will actual parse and control what all this does will be custom to your game, so mold this tool into whatever works for you!



Using In Engine

Here are some helpful resources for dealing with JSON files. If you're tool of choice doesn't appear here, a simple google search would get you your desired results.Note that engine/framework parser add-ons will be available in the future!Godot
Unity
Unreal
Construct
GameMaker Studio


License

You Can:
- Use this software to create files for your projects
- Publish the created files online (with credit given linking to this website)
- Make screenshots/videos of the software (reviews appreciated!)
You Can't:
- Sell this software or redistribute it in any way
Please respect creators rights to make money off of their products :)


Backlog

Bugs:
- [ X ] Issues with saving multiple variables for node
- [ X ] Issue seeing caret at all times
Features:
- [ X ] Translation support
- Add ability to add default variables to markers
- Add suggestion support for custom markers
- Add highlight support to custom markers
- [ X ] Add ability to have multiple files open at once for easy switching


Try Now

Thanks in advance for your support!