8 years ago, I took my first real steps as a game developer by learning Game Maker (for those who don’t know what kind of software it is, just think of it like Photoshop or Ableton but for games). Certain developers I admired at the time (in fact, most of them) had seen great success with it, and the kind of games I wanted to make didn’t seem to require anything that anyone else was offering, so I figured it was a safe bet. And it certainly paid off! It had everything one needed built-in; it was approachable enough to learn quickly and yet, almost paradoxically, hands-off enough that, used in the right way, one could learn a great deal of universally applicable game dev knowledge and make some really great stuff. I truly loved it, and, while I dabbled with all sorts of other tools, Game Maker quickly became my specialty. It’s been with me my entire career, including on all the commercial games I’ve worked on. And now, after nearly 3 years of tackling my biggest project ever with it, I can confidently say:
It chafes!!!
Constant tiny annoyances! Endless compile times! Crappy tools that get utterly crushed by literally any specialized alternative! An IDE so laggy I don’t even use it anymore1! Pathetic performance un-helped by a pitiful profiler! Literally as I am writing this github desktop is chugging away trying to revert a mountain of files that got messed up after an update.
It’s still the engine I know and love, but on a project this size every flaw is exacerbated, and every annoyance gives strength to the voice. What voice, you ask? The voice of my pride, as an engineer! The voice telling me that I won’t be a true sage until I roll my own CPU out of sand and grit. The voice that won’t be chained to the prescribed toolset of a company, no matter how nice their head of product is2! The voice that wants to know what’s going on in memory! But most importantly, it’s the voice that belongs to Jon Blow wants me to grow, take on the challenges that yesterday’s me couldn’t!
And so, what is left to do when my tools no longer fit my hands but to roll up my sleeves and make ones that do? I have about half a year until the end of my current project and the start of something new. Will I, in that time, manage to make something production-ready, or will I be forced back into Game Maker’s abrasive embrace? Only I can decide, that’s the Handmade spirit! Or something.
What are you doing exactly?
Let’s take a step back. Earlier, I drew an analogy between Game Maker and software like Photoshop, but what does that mean? Essentially, “Game Engines” like GM and similar software (Unity, Godot, etc.) are collections of tools for making games, like a level editor and asset browser, built around central software framework that makes it easy to write only that code which your specific game needs (by providing certain code abstractions, seamlessly interfacing with aforementioned tools, and handling low-level tasks like drawing to the screen or getting user input). My goal is to replicate that entire stack of tools with a combination of specialized third-party software and code libraries alongside a mountain of my own custom code.
Isn’t that, like, really hard?
When I was starting out as a game dev, I was pretty adamant about avoiding engine development. I would hear (horror?) stories of developers spending 6+ years endlessly working on the same project, just building and rebuilding their stack. I was an artist, and I wanted to make games dammit, not waste my youth fiddling with some backend. And this attitude was and still is reinforced by the community at large, on both sides of the aisle: engine development is something engineers do for its own sake, not something worth attempting if your main goal was to produce an artful end product in a timely manner.
But after 8 years, from my current perspective, a project like this seems extremely doable, even on this timeframe! And for all the reasons listed above and more, there’s plenty of benefits to doing this beyond just my self-satisfaction as a software engineer3. Plus, that’s not just a crazy inside view opinion, there are a bunch of examples of experienced developers producing great works without the help of a third-party engine (Braid and FTL come to mind, both are games which were made mostly from scratch in 1-2 years).
So what explains the discrepancy? Well, I’ve got a lot of things going for me:
I have years of experience pushing an existing engine to its limits, trying to make as comfortable as possible to work with. This has given me a very, very clear vision of what I’m trying to make for myself.
I’ll be working almost entirely in 2D, which is a huge load off. True 3D development is an entirely different beast which I very much do not have the confidence or interest in tackling.
As mentioned, I have a very precise idea of what kind of games I’ll be making with the engine, but will nonetheless not be making a full commercial game with it from the start. Certainly some test prototypes, but they will be quickly discarded. This will let me focus on the engine itself until it’s in a fairly stable state without the aimlessness that typically comes with such an approach.
I’ll be using existing libraries and tools like SDL and LDtk as much as possible to handle difficult problems that would take too long to solve myself. I’ll talk more about what this means exactly in later posts.
It’s 2024. The amount of support and tools available to developers nowadays is enormous compared to even 10 years ago. As a research tool, ChatGPT alone has been a tremendous help in my work on this so far (though not without its fair share of frustrations).
I would still not recommend this approach to anyone starting out in game dev and, in fact, I still think Game Maker is a great tool for beginners, even those setting out to make a commercial product. But for those with enough experience, something like this is certainly not as daunting as some make it out to be, and can be a great way to improve yourself, your working environment, and your ultimate product. At least, I think. Maybe I’ll change my tune in 6 months.
Why blog about this? Who is this for?
Engine development is a complicated winding path that will require a lot of careful design decisions. I feel like sorting out my thoughts on things to the point that I can explain them to a layman will be a useful exercise. As the title suggests, this series is intended to be legible for non-programmers, though it should hopefully also be of interest to programmers of any experience level. Basically, it’s my hope that anyone interested in this part of the game development process, even just as a consumer, will come away with something valuable after reading this series.
Also, I’ll be figuring things out as I go, and I think that’s the best state to be in when writing something like this. Often, those who’ve walked far along the path can find it difficult to relay that knowledge back to those just starting out, as so much of it has been compressed into intuitions and shorthand. As someone who’s just slightly ahead of those starting out, there’s no better time to wave back at them and point out where next to walk.
And who knows, maybe I’ll get a bit of fame and status out of this. For what other reason does anyone do anything?
Where are you at now?
As of a few days ago, I managed to compile and run a test app I made, using the ODIN language and SDL, on the Nintendo Switch (it’s got a moving character and everything, wow!). This gives me the confidence I need to move forward with these tools, and I’ve got a big ol’ todo list that I’m ready to start churning through (there’s a couple dozen list items and each one will probably get its own post… yay…). In my next post, I’ll talk about how I ended up choosing the ODIN language, so look forward to that!
Thanks to GMEdit!
Sorry Russell
I want to emphasize this point somewhat. So often, I hear that it’s fine to make your own engine… if you’re trying to learn, get better as a software engineer. But if this was the only reason I would not be tackling this project. I want to make something that will improve the game development experience for me, that’s my primary driving force, and in my opinion, it should be yours too.
as someone who's only dabbled in gamedev (never made a complete product per se, but have created an executable using C++ and SDL where a character moved, had some animations, hit bad guys, and such), I'd love it if you explained how to run on the Switch!
Good job explaining to the layman: I understood everything! :))