Welcome! If you’re new here, nice to meet you! I’m Tom, and I’m making a space factory game.
I’ve started many streams lately and the above sentence is on the tip of my lips every time. With plenty of factory-like games coming out recently my concept of space factories inspires the dreamer in all us.
A “Real” Game Developer?
I started making The Recall Singularity in November 2018, remaining part-time through today. It took a shove out the door by my BFF to believe in myself and the concept right at the start. As TRS has matured so have my skills. At the beginning I held many doubts around my own ability to deliver. As the months have passed this concern has faded away, leaving me with the confidence that the future is in my hands.
Here’s a list of old concerns
- Real GameDev — I realized you just need to keep going to succeed.
- Community Building — A genuine connection and friendly approach goes a long way
- Art and 3D assets — Turns out that decades of dreaming about game development teaches you the fundamentals and a week on YouTube is enough to start.
- Computer Networking —Okay, this one is really hard. But there are great libraries to help you now. It’s kind of my career up to now, so there.
- Game Design Ideas— Once I knew the goals, ideas just started springing to mind. I thought that would be harder.
I’ve still got a few
- When to release — It’s going to be years until it’s “Done” so I decided to just release a pre-alpha “space themed chatroom” in May 2020 to dedicated fans.
- Financial pressures — Still contracting right now to pay the bills. How much time should I spend on that? What to do if suddenly I become funded and need to leave my clients in the lurch?
- When to stream? What to say? — I don’t yet really understand my audience or the best time to stream for me. But I’m learning!
- How fast can I realistically go? — I expect development will accelerate, that it will feel easier to do more. I can feel the effects begin but have to believe it’s gonna happen.
Growing a community
I’ve got hundreds of followers now across many platforms. Let me take a moment to thank every one of you. Your support means a lot, your encouraging voice helps keep the terror of a huge project from overwhelming me.
Thank-you. From the bottom of my heart. Thanks.
Initially I started growing my community by leaning into what I do well. I chose a difficult combination of tools that gives me freedom and performance — Godot and Rust. I thought I could contribute back to my community by smoothing the path to using those tools. I wrote about my technology choices conversationally and then I tutorialized the Godot+Rust combination. Hmmm, I really need to write more. So busy!
It’s quickly become apparent that my approach is “in vogue” with both Godot and Rust being growth tools at the moment. I personally think that Godot is the best “3d Engine” for rust developers and Rust is the best Scripting option for performance sensitive Godot developers. The consistent positive responses I have received from both camps seems to bear this out. I’m very excited about moving to Godot 4.0 and the gorgeous new Vulkan renderer once it is ready.
I have followed the community to various platforms. I put off starting a Twitter account until a Reddit reader explicitly asked me for one. I avoided Discord until the Twitter community was growing and vocal. Then a Discord member suggested I start streaming because he enjoys watching such streams. I’ve since embraced streaming as a low-effort way for me to give back to up and coming game developers and help foster a conversion with my fans.
You might note that my YouTube content is still amateur hour. This is kind of intentional, being a combination of my low skills here and time commitment. I don’t have much time to develop each week and making a good quality video could take upwards of a day, if not two. So like the other parts, the YouTube content is waiting for the right moment. I have big plans people! Big plans!!
Okay, lets talk progress.
Here’s what I’ve been up to the past 3 months.
I made my first progress post in Nov 2019 so we’ll start where that leaves off. That would be … colliding ships. Okay!
Early in this month I began to get sick of continually writing binding code between Godot and Rust, thinking that if every entity I added would require a custom set of Godot API calls it would slow down development. I came up with a pretty nifty set of Specs Systems which create, update and delete Godot Nodes using templates, doing things like moving them around.
I realized I could inject new components and systems into the “Specs World” from my sg_core (godot api) crate that sg_simulation (pure rust) crate didn’t know about. I simplified this example and put it into a PR for the rust gdnative bindings but that still requires more work. I’ve also begun work on a tutorial for this.
In January for the first time it became possible for players to create new ships in the game. They start empty right now, later they will be centred around an upgradable “Core.” It felt good to begin transitioning away from only hard-coded ships.
I also decided that I would take it easy over the Christmas holidays, so that’s what I did. I spent a lot more time with the kids, which was nice!
The new year started with slow progress again around Christmas and summer holidays (they are long here in NZ). You’ll be glad to know I spent a lot of time with my family.
It became possible for network peers to see each other’s movement inputs this month, when I created an “Action” called ActionInput that all peers execute in tandem. Over the next couple of months this has expanded a lot. Actions are my implementation of the standard networking approach used by most Real Time Strategy and Automation games. If you know the starting state and every thing that players did, everyone can simulate the game and agree on what is going on right now. Lock Step is the key to how we simulate the insides of even very complex spaceships.
Each spaceship is itself a world (in specs ECS) which tracks conveyors, contents, machines and construction. I’ve been primarily focused on this inner “Production Floor” world for the past year. In Jan I turned more attention to the “Space World” which is far more arcade focused. In the Space world, each ship is simplified down to its essence — position, shape, weapons, effects on other ships. The Space world is going to have its own frame-rate and fancy predictive network model.
Network synchronisation of SpaceShips happened in January, so suddenly it was possible to fly these factories around like I hoped you would be able to do. They still remain in sync when another client joins “late.” A lot of the nuts and bolts of the Space world started coming together.
Interlude — Time to Plan Game-Play not Tech-Demo
I had a key realization around the end of January that I had achieved proof of concept around each of my key technologies. I had a simple tech demo that to me already de-risked the entire project, from community to networking to factories and physics. The largest risk remaining was getting to “first playable” and proving that the game-play loop is really working from a “fun” standpoint.
My goals at this point became the following list
- Asteroids to mine (done in Feb)
- Jump in and out of ship flying mode (Also done now)
- Blast rocks off of asteroids to mine
- Rocks float in space can be picked up with “Scoops”
- Ores -> Craft-able items like plates, ingots, components
- GUI around builders on ships
- Costs to build stuff in ships.
- Network conveniences, reliability and chat.
This month I started creating asteroids from random height-maps. We take a 32x32 grid of “resources on this square” and spiral from the middle of the asteroid placing iron, gold and other resources. Per asteroid I randomly decide how much of each resource is centered at given coordinates and each square deducts some.
I found it quite interesting at the time how all procedural generation had seemed almost trivial right up to the very point that I actually tried to write my own. Then I was staring at a blank page. To make progress I decided to write a prototype using Substance Designer, which can be considered a noise and height-map engine usually used to make textures. Once I knew what I was trying to make, doing it in code suddenly seemed far easier. A quick console application that creates little PNG files expressing the height map became the easiest way forward.
Around now, yet again discord and investment in community was a savior. The same developer who suggested Twitch Streaming (WeirdConstructor) also had been working on their own Godot+Rust game and had benefited from my tutorial. Titled Space Ship Cargo Game it features voxel meshes which are procedural generated. The boon was that he’d already written a working example in Rust of collecting meshes and putting them into Godot. I made his implementation about 1000x faster and used it as a starting point for my own approach.
Like many speedups I’ve encountered, it was very easy to make it faster. There was an unexpected performance problem highlighted immediately by VTune. Turns out that Godot was wasting time initialising a massive block of memory allocated to hold vertices. For not the first time, having the Godot source code paid off.
My first foray into Shaders
If you are familiar with 3D stuff you might have noticed I am blending between several different textures (Gold, rock, iron) in the asteroids pictured above. I do this using a simple Fragment (pixel) shader, which is a little program running in your graphics card.
Turns out that making a vertex and fragment shader in Godot is very easy. I followed the Godot shader tutorial that introduces how to make progressively more complex shaders and ends with this great looking water shader:
Progress on cool procedural generation features and cool uses of Godot tends to go down well on the Godot subreddit. It’s always a pleasure to show off a recent accomplishment and be reminded that yes, your work really does have value. I highly recommend it for others like me with imposter syndrome!
More movement code
Now you can enter and leave ships and move with them. Various systems make your position relative to a spaceship you’ve entered. You can press a button and start flying, essentially becoming the ship. For a while this happened without changing camera perspective and the ships you left would keep drifting on when you got out. I thought this particular GIF explained it in quite a humorous way.
Now, when you pilot a ship When you do so, you get a simple but informative 3D GUI that shows heading goal, current heading and velocity. These things sound simple but they have huge implications. Suddenly I can feel the game start to come together.
It just keeps going, The Recall Singularity keeps gaining momentum
I’m just at an inflection point with The Recall Singularity.
It’s starting to feel less like I’m pushing a rock up a hill and more like I’m nudging it along a flat surface. Twitter keeps telling me I have new followers, a few more each day. I keep seeing new faces in our discord, today up to 160 members. Some are fans, who come to cheer me on. Some are game devs, struggling with their own projects. We’re all just dreamers together.
I posted a short YouTube clip of me demonstrating the game two days ago and it has gained so many views and upvotes already… I introduced my game to a Base building games sub-reddit and it’s so accepted. Life is really surreal and wonderful right now.
I hope that whatever you’re making that you keep taking things one step at a time, believing in yourself all the way. In the meantime, I hope you enjoy watching this all come together. After all, I do stream nearly every day.