Developing the best story-driven rblx game ever made completely solo, from scratch

Project Start Date

2024-07-02T04:00:00Z

Hey,

So, where exactly do I begin well I’ve always just loved story/adventure games with a narrative whether that be Telltales The Walking Dead to even simple games like get a snack games to Need More Heat to even Break In stuff like that. Even found out about a cool game called Nocturnals today which is similair to Telltales The Walking Dead

What I’m going to create is not a game similiar to any one of those in particular but also not exactly a combination of all of them either, I want it to be it’s own thing but still in the realm of story-driven games but just a much higher caliber which will most definitely set it apart from the rest

Project Overview

Luckily, I didn’t need to completely create the idea from scratch as I got some inspiration from this movie I watched a couple days ago which actually sparked the idea to create this sort of game

So story follows a dishonest arrogant but confident car salesman, whos past actions finally catch up with him when one day his boss has finally had enough and fires him, (this next part im still unsure how i wanna implement it into the story but yeah i’ll still say it) so now jobless he returns back home to his girlfriend, forgetting it was their anniversary and ontop of the losing his job, she kicks him out of the house! Now homeless he has to resort to sleeping in his car for the time being, the next day he’s on a walk and finds a sheet of paper nailed to an electrical post where a real estate agency is hiring salespeople, later that day hes interviewing for the position with a man called Mr.Bendt who has some of the most unsellable properties in the state, the salesman being the overconfident person he is thinks hes up for the challenge so Mr.Bendt gives tasks him with selling one of the properties which has a… interesting history to say the least (hes vague about it), but the house has a history of murders (salesman doesnt know that at this point in the story), eager to start he asks if he can go check it out so Mr.Bendt says he’ll have his assistant set him up with the paperwork and keys!

And that’s where I’m going to stop for now since, I’m not even close to that point in the development and won’t spoil too much of it either!

Genre & Scope

So if you’ve ready the overview you would know this game is going to be horror but not like anything super scary more like a comedy-horror but of course not trying too hard though on either side, you could also probably imagine that this game is probably going to have an insanely big scope which actually won’t be the case, I’m going to try to just have everything narrative wise be the most focused part of the project, the goal is not to overwhelm with mechanics, but to immerse the players in a captivating storyline

Execution Plans

Since, I’ll be doing everything solo I need to prioritize what I actually need to start the making this idea become a reality so this means not focusing on art or building or even animating just yet, but implementing the crucial game mechanics that’ll help me achieve that captivating story so programming is going to be my best friend in this super early stage of development

Conclusion & Progress Made

And yeah, that’s pretty much it for now if you got this far thanks for reading and I think you’re going to really enjoy me directing this game and everything, I have made some progress but it’s currently 12am and yeah I should really head to bed right now so I’m going to update in the morning, bye!

5 Likes

you better not loose motivation and fall to other projects
ive suffered this fate many times

2 Likes

Day #6

2024-07-05T04:00:00Z

Alright, feeling pumped let’s do this, SO EXCITED!

One thing I also have to make clear is that I need to have a strong focus on creating systems that are modular and expandable and can interact with other systems seamlessly and effortlessly, this way it’ll make the game development flow so much easier being that I’m making this solo and I need to prioritize everything equally, and I don’t wanna be let’s say modeling for a few days and come back and have no idea what my code does, so it’s very important that I keep my stuff very well organized and neat.

Okay, so for this project one of the very first mechanics that is most definitely going to be needed is a way for the player to talk to the characters within the story, in other words dialogue!

So I started working on the dialogue system about 5 days ago, and it’s actually pretty much complete.
What I needed to make sure of was that it was expandable and easily managable and what better way to do that then with OOP (Object Oriented Programming).

The structure of how I want scenes in the game to go are as follows

Cutscenes → Dialogue → Optional DIalogue Choices

In this game a cutscene basically encapsulates dialogue and then of course that dialogue can have dialogue choices within it which are opttional of course, think of it like a parent-child sort of thing, so each scene in the game is going to be triggered by me starting a cutscene and within those cutscenes are dialogue; cutscenes in this context are just holders for everything. Honestly just a super good way to just keep things organized under a familiar term.

I had to create 3 seperate classes, a Cutscene Class, a Dialogue Class and a Choice Class

Cutscene Class

This class basically takes in a part to start at which is just where the cutscene will place the player when it’s supposed to start, a dialogue object basically the class that holds all the dialogue and also optional dialogue choices, and then a BindableEvent called Completed that’ll be used to tell me when a Cutscene is over!

Dialogue Class

The dialogue class is pretty simple it literally just takes in a chain of nodes which store different thigns about that piece of dialogue!

Choice Class

Probably my FAVORITE one out of all of them, this class is what adds choices to an existing dialogue object, the choices which is just a table of strings, and then the bindableEvent basically allows me to know when a choice has been selected, the UI function that handles populating the choices fires the bindable and let’s me know what choice was selected, then we have the most recent part of the system which is timeLeftToMakeChoice this as it’s name suggests is how much time a player will have to make a choice, and then the choice which is just a string of the selected choice, theres also a few more like responses which holds the corresponding things the NPC will say back to a choice you’ve made, then of course we have the actions which a table of functions, this is more useful when a choice explicitly needs something done like immediately and the results is basically the metrics that are influence depending on the choice you made!

Relationship Metrics

Alright so this part I don’t know, maybe might be subject to change but basically I’ve been doing research on choice mattering in story-driven games and just come across just a wide range of videos and I’ve come to a conclusion that every game has a certain narrative that it wants to tell and no matter what choice you pick it’s going to have to one way or another lead back to the path the creators of the game wanted you to take, I mean if this wasn’t the case scope for story driven games where you can make choices would be blown way out of proportion… so currently I have a mid-level system where the player has a relationship with every NPC in the game and these of course are stored somewhere I can easily access them when I need them but it’s a pretty simple module but it looks something like this

So it’s just a table with currently right now 2 metrics which are trust and respect, how it works is if you remember from before in the responses basically it’s a table of tables which have a string as the first index and then a dictionary called influence which is where the magic happens, what it doesnt do is randomly select responses oh no no, depending on the choice you pick there are obviously going to be corresponding responses, but within those responses are variants which have the different influences, an algorithm adds up compatibility score for all those responses that fall under the same index of the choice you selected, and then it sees which one is the most compatible with the relationship metrics you currently have with that NPC, it works pretty amazing and it’s probably all I’ll need really, sorry if it was a bit confusing but yeah feel free to ask questions though!

So that’s about it for all those things, they work super well and I’m really happy with how far I’ve come with all of it in the past few days!

My Current Code Setup

But let’s check out some code I have for the setup of one of the very first scenes in the game, (the car salesman getting fired by his boss)

So, uh this is pretty much the whole Client script which is in StarterCharacterScripts, all im doing is requiring the carsalesman cutscene object and then setting up an event so I know when it’s done and then literally just playing it after, it’s so simple, clean and neat. This is why OOP is so awesome!

Video Showcases

Finally what you guys probably skipped to, although I do really like going into the code bits, most people are visual so you guys need some visual stuff which I completely understand!

Full Showcase (from 2 days ago)

This video shows me going through the back and forth dialogue with the boss, sum light sum light

Metrics & Weighted Variants(from 2 days ago)

This honestly doesn’t differ much from the last video but this version had what I talked about earlier implemented which is where the game finds the variant of a response which most closely matches the relationship metrics you have for the NPC you’re speaking too, also I havent added may variant responses as I think i’ll focus on just the top level ones and I’ll come back to the ones just below that when I have more things fleshed out

Actions & Cam Cutscene

So this one got me super excited and was fun to make, basically this is when I implemented choice actions which is choices that have functions tied directly to them, unlike just a regular choice which gives back a response this one just fires a function, so I used it too give the player a choice to either sit down or stay standing, and when you chose to sit down it would play a short and sweet camera cutscene and then continue the dialogue after that action is finished, this was really a chef’s kiss moment!

Choice Timer

Up until now I thought the dialogue and choice system was simply amazing, but there was just one thing I knew it was missing which was… A TIMER, I mean it didn’t make too much sense too just let players have unlimited time to make a decision so now if you read the code from up there you’d know that each choice class has it’s own number of seconds a player has to make a choice, so this makes it so robust and I can easily change the values too what I see fit in the context of the choice options the choices are attached too!

And that wraps up everything I’ve made up until today, thanks so much for reading and hope you have a wonderful day!

3 Likes

thanks for the idea!!! + i got the skills for it 1!1!1!1!1
(just kidding, i may have the skills for it but like im working on a project of my own lol, plus i would feel bad for doing that)

1 Like

this is cool, great job, continue the stuff

1 Like

thanks man means alot!

Oh yeah I wasn’t joking when I said it’s going to be the best story-driven rblx game,

also I mean the thing is I don’t care if someone steals this idea or does something with it, honestly I would love too see someone try to execute it better then me that would bring tears of joys to my eyes that I helped someone create something so beautiful

It’s about heart, you gotta have heart

2 Likes

pretty respectable, cuz some people would just explode hearing that

1 Like

Day #7

2024-07-06T04:00:00Z

Making some good progress!

So, yesterday I wasn’t sure how exactly I wanted to move forward. I didn’t know if I should move onto like the next scene in the game’s story or if I should just keep working on the mechanics that would define the game and I decided to implement honestly another mechanic not sure if you would call it a mechanic but I realized it’s going to be crucial so that I don’t break immersion, but also it adds immersion

What I’m talking about is…

ViewCharacter (WIP)

You might be wondering what the heck is a ViewCharacter well it’s actually a word I made up it comes from ViewModel, it’s pretty similiar but anyways what the ViewCharacter allows me to do is have it so I can have a fake character (like in view models how you have fake arms) that sits right directly under where my camera is no matter what orientation my camera is on the X and Z axis, it only follows the camera on the Y axis ! The reason I chose to do this over having the character be under the camera like you’d think by looking at my previous progress videos that I’m in first person right? Wrong!

Well, sort of so basically in the very first few days of the project I had the ACTUAL character teleported to where the cutscene would start and then I would start my the camera animation which made it seem like we were in first person when in reality its fake, that’s why if you look closely your still able move your mouse, if we were truly in first person then the mouse would be locked.

Anyways the reason this is better then using the character is multiple reasons, one of them is that the players’ actual character is quite unpredictable, for something niche like this it made more sense to have a ViewCharacter that I could have fully control over, another reason why I switched was this way I can have animations on the ViewCharacters and it’ll always be relative to where the camera is and probably the most important one of all is that it helps me prevent breaking the immersion because now if a camera animation decides to look down youll always have a body attached so it just really gives you the nice POV without the hassle of moving your character and then just stupid stuff that happens when you try to do cool stuff with the player’s character!

Showcase

Without Body (Before)

So, I’ll be showing like a before and after for the dissapointed camera scene, where the player is dissapointed and his head drops to the floor while shaking it, I mean it doesn’t look terrible without the body but something did look a bit off though

With ViewCharacter (Now)

And here it is with a body, I think it looks way better and in most games you’re able too see your body when in first person, and games with like first person cutscenes your definitely able too see your body. So this was a super important part of the base game

The ABSOLUTELY beautiful part is that it’s such a good optical illusion it isn’t even funny, it literally looks like I just used that transparency modifier method so you can see your limbs while your in first person :joy::rofl:

Proof It’s All An Optical Illusion

And yeah, pretty sick what’s awesome aswell is that I can have animations playing on it no problem too, I do have to probably run some more tests but yeah this is looking like it’s going to be a great fit for the game going forward, thanks for reading!

4 Likes

Day 8

2024-07-09T04:00:00Z

Some difficulties but we’re pullin through…!

Alright, so it’s been a few days since the last update and the reason for that is because since the last update with the ViewCharacter well… let’s say we’ve ran into a little issue…

Basically, the ViewCharacter was working all well and fine and yeah animations would work on it but I obviously didn’t want to animate inside of studio using Moon Animator :nauseated_face: or even worse the default roblox animation editor :nauseated_face:… so of course obviously I opted for Blender :crown: since this is also the same thing my camera cutscenes use it just made sense, so now that I knew which animation software I was gonna use what was the problem? Well, you see there is of course a plugin by someone by the name of Den_S called (Blender rig exporter/animation exporter), and yeah I did test that out yesterday and imported but I didn’t play it using roblox’s regular loading it through the humanoid and stuff I had my own module that played it dependent on the frame rate so this made things sync up exactly how they were in Blender, but nah that just wasn’t to my liking enough and yeah it was working but I just wanted to use the addon I was using to export my camera animations just to streamline the whole process and be able to do everything in just one program!

So, that leads us to today so I was having a hard to thinking about like how I was going to have the viewcharacter and also animate the arms without any use of Motor6Ds because my module only supported CFrame animations which I guess the Motor6Ds could be manipulated by CFrames with their C0 and C1 and stuff but that stuff was too complicated man and I already had a working system but I did have to make a few adjustments though… really just one but before I was getting some wonky angles and stuff just wasn’t correct so I had to change the rotation style I was using which made me switch to Quaternions!

Honestly, still don’t understand what they are but I’m gonna let Blender do the heavy lifting for me so, all I needed to do was change the rotation from taking in XYZ angles to XYZW quaternion

image

The super cool thing about quaternions though is that you won’t experience gimbal lock like with euler angles and also since I was exporting rotation data from blender to roblox studio before I had to like negate the X by like 90 degrees since for some odd reason Blender uses a Z-Up coordinate system but since I’m using Quaternions I don’t think I have to do that anymore and the rotations are more accurate then before!

Tests

Let’s get into some tests, so here we just have one arm animation while the camera is looking down (also an animation for testing), it may not see like much but you’ll see the power of it probably in the next development log

So I made just a pretty simple rig, also don’t mind the legs not being there… anyway I just added a child of constraint to both of the arms but this test only uses one arm though

image

And this is the code for it

So as you can see I get the viewcharacter and load them in using the load function which makes the ViewCharacter always appear where your body would be if you were too look down in first person, then I make the camera scriptable and play the arm animation I exported from Blender!

Next Steps

Probably going to keep running a few tests with this system and see what’s up and if this keeps working out the way I like it then I may be able to create all my animations using this method but that’s pretty far out right now since we’re still in very early stages of development but you guys can expect a smooth arm cutscene animation soon though within the dialogue, thanks for readin!

4 Likes