UNDERTALE UI-based game in Roblox

I’m not planning on actually recreating any sections of the game itself, just thought it’d be cool to see how much of Undertale’s ‘system’ I could recreate in Roblox. Still very wip but here’s what I got done so far:

  • Accurate collisions (only rectangles/squares for now though)
  • Movement system
  • Saving stats & inventory system (it’s not exactly very demonstrated but the stats are all saved in a datastore, getting sent to the client for the menu to update them every frame using an UnreliableRemoteEvent)
  • Overworld menu (40%) (the core part of it and all the menu states are done, but I still need to make the functions for items and phone calls)
  • Textbox system (Just need to make portraits work and add some sort of “wait”/“yield” command for commas and periods, but other than that it’s basically done)
  • Interactable objects (with and without collision)

Here’s a video showing my progress (it’s over 10 MB so I had to upload it to a file hosting website, that’s why it says ‘external media’)

7 Likes

Gosh, I love recreations like this in roblox that are actually good. This is good, at least for what it looks like, so far

Noticed a thing with the movement though. Not sure if undertale had this problem, I never played it, but your movement should be normalized. If you notice, you move faster when moving diagonally, versus just one direction.
If you’re using Vector2s for the movement, don’t forget to use Vector2.Unit on it to make the movement smooth (if you’re not using vector2s, square-root both X and Y values).

Other than that, it looks very nice. I’m interested to see how the tiles are made programmatically

3 Likes

Thanks!
I did actually notice the problem with the movement (not from noticing that walking diagonally is faster, but from seeing that when walking diagonally while colliding gave the player a huge speed increase, which I used a pretty hacky method to fix), but I couldn’t really figure out how to fix that. I’ll try your suggestion, though.
As for the tiles, I made the map using a program called tiled which is used to create tilemaps and tilesets, and since it allows for exporting to .lua files, I wrote a modulescript that could read those files and then draw the tiles & objects onto the map. This is how the map looks like in the program:

For the tile layers, I made a function that loops through the width and height of the map, gets the specific tile that belongs in that spot from the ‘data’ table in tile layers, and draws it in the map.
As for the objects/collision blocks, they’re just half-transparent frames with their size and position set to the size & position of the objects in the tiled map, in pixels

6 Likes

Wow, this is really cool. Do yk if it works multi player like can 2 people move around and see each other if they were to be in the same lobby?

The website is not loading for me sadly

Could you send link to program, I’d like to see it because never heard of it

I haven’t added support for multiplayer, but I do kinda want to give it a go eventually

1 Like

Here’s the link:

But you can also get it from itch.io if you prefer:
Tiled Map Editor by Thorbjørn Lindeijer

Thank you.
And your creation is awesome

1 Like

here’s some new progress, i was able to make a pretty basic implementation for camera boundaries and cutscene blocks that’ll run a cutscene when collided with. it’s still very buggy and needs a lot of testing but i think this part is mostly done

(most of the video is just showing the testing cutscene, map bounds are shown from 0:51 onwards)

1 Like

I LOVE this!! Im also doing an undertale gui based game, but its centered on multiplayer battles (those sans vs charas games). I really love seeing people do things like this! I just wanna ask you something. How did you make the text shaky? (if you are using textboxes). Keep going with it! :heart:

Also if you need help with collisions i tweaked the [v3.0] GuiCollisionService - Gui collisions done right - #63 by 1DiamondBor module with chat gpt so it can detect rotated rectangle collisions (cuz the original is pretty bugged)

Thanks! As for shaky text, I basically just copy-pasted the function from here:

This is the code from my dialogue module:

local mag_x = data.shake_factor or 1
local mag_y = data.shake_factor or 1

local offset_x = math.round((math.random() - 0.5) * 2) * mag_x
local offset_y = math.round((math.random() - 0.5) * 2) * mag_y

data.Label.Position = UDim2.fromOffset(data.base_pos.X + offset_x, data.base_pos.Y + offset_y)

I’m not using that module anymore, but if I need any help with that I’ll let you know