Customisable Undertale Dialogue System (With Undertale's fonts, text effects, etc)

Hello!! I’ve been working on a dialogue system in Roblox studio for a few days with the goal of making one just as customisable as the one in Undertale!
It has compatibility for all screen sizes(though text will act weird when the screen size is changed, e.g. through resizing the window), and has support for individual word and individual character configuration.
In order to achieve this, I used spritesheets for each font and made use of the ImageRectOffset value to show individual characters. Unfortunately, this reduces the amount of characters that you can use. If you use an unsupported character, 3 question marks should appear and the console should contain a warning stating that an unsupported character was used.

(Old Video before sequences and wave effect was made)

To use this dialogue system, a dictionary named dialogue has to be made, containing lines and config. Here’s an example:

local dialogue = {
		lines = {
			"* Hello! This is the first line of dialogue!",
			"* Hi again! This is the second line of dialogue!"
		}, 
		config = {
			lines = {
				["1"] = {
					Persistent = true -- Having Persistent set to true means that the configuration for the first line will be used for the next line, unless the next line already has configuration set.
					colors = {
						["1"] = Color3.fromRGB(255, 255, 255),
					},
					sounds = {
						["1"] = game.SoundService["snd_txtsans"]
					},
					speeds = {
						["1"] = 0.05
					},
					effects = {
						["1"] = "normal"
					},
					fonts = {
						["1"] = "Sans"
					}
				}
			}
		}					
	}

Additionally, regarding configuration, tables containing values such as sounds, colours or numbers for speeds can be used. This is called a sequence, and it will basically loop a configuration. Here’s an example of a sequence for colour:

colors = {
	["1"] = {
		["1"] = Color3.fromRGB(0, 249, 0),
		["2"] = Color3.fromRGB(142, 250, 0),
		["3"] = Color3.fromRGB(255, 251, 0),
		["4"] = Color3.fromRGB(142, 250, 0),
		["5"] = Color3.fromRGB(0, 249, 0)
	}
},

Then, this table will be fired to a client through a remote.

game:GetService("ReplicatedStorage")["Customisable Dialogue System Resources"].ActivateDialogueSystem:FireAllClients(dialogue) -- This will make all players see dialogue.

After the remote is fired, a Localscript inside the dialogue GUI handles the construction of text. It shouldn’t need to be changed unless you want to add your own effect or change how the system works. Also, if you wish to use this then you will need to go into the Localscript and set the default values for sound to a sound that exists in your game.

These are the configurable properties:

  • Text Colour
  • Text Sound Effect
  • Text Speed(how long of a delay there is for the next character to appear)
  • Text Effect (An effect for text characters. Effects work through localscripts. Currently, there is only a wavy text effect and a shaky text effect.)

(A very important limitation is that only a single font can be used in 1 line of dialogue.)

I hope that you can find this of some use! Here is the uncopylocked place containing the dialogue system.
(If you have any questions or concerns, just reply and I’ll get back to you as soon as I can!)

27 Likes
2 Likes

Interesting, will look into it.

Do you have any plan to update this? If yes, may I suggest to add choices? Thanks!

Just a reminder that Index’s are already put automatically, depending on the position of the item in the array

1 Like

Cool! Here’s some text effect ideas:

  • Shake (random jittery motion) :white_check_mark:
  • Wiggle (in any direction)
  • Flicker (letters randomly turn off and on)
  • Ghost (letter transparency driven by a sine wave)
  • Rainbow (rainbow passes through letters)
  • Highlight (background color set to any color to emphasize information)
  • Earthquake (all letters shake smoothly in the same direction)
  • Dropshadow (a darker transluent clone of the letter lays under the original)
  • Outline (UIStroke added to letters)
  • Shimmer (shine passes through letters every few seconds)
4 Likes

You can make suggestions! I’ll be making updates whenever I have free time!

1 Like

MANNN I LOVE THIS, Im actually doing an Undertale / Deltarune game myself and this chat system is far better than mine, awesome job and love it, only suggestion would be to handle questions and answers system, but honestly the cleanest undertale like system out there, awesome!

2 Likes

Hi, are you able to release the sounds in the uncopylocked place? Currently all of them are unable to be played for me.

Unfortunately, I am unable to make the audio public on Roblox, but I can upload the audio files here!
Undertale Text Sound Effects.zip (60.1 KB)

1 Like

can you explain how you made the shaky text?

I love this, but a suggestion I have is that maybe you could make it easier to change the config & add dialogues? For example, instead of doing what’s done in the example in the original post, which takes up 28 lines of code, you could do something like this;

local dialogue = "[voice:sans][font:sans]* Hello! This is the first line of dialogue!\n* Hi again! This is the second line of dialogue!"

Basically like rich text, but, uh, different, I guess? The config would be split into multiple commands, with white text at 0.05 speed and no effect or special color being the default settings, which can be changed and then changed back in the dialogue string.
For example, to reset the sans voice and font in the second line, you could add something like this after the \n:

"...dialogue!\n[voice:text][font:reset]* Hi again! This is the second line of dialogue!"

Doing something like this can make the process of creating a big dialogue sequence easier as each dialogue would only take up one or two lines of code

Also, the \n in the string is a ‘new line’ character (I think that’s what it’s called) which basically splits the text into a separate line without having it as a different string