I played a game once
Not unusually for a child of the 90s and early 2000s, I had a GameBoy (a Pocket and then an Advance). King among those handheld games for me were the first 3 generations of Pokémon games, and the GameBoy Color Zelda games. The charm of the expressive pixel art and the surprising intensity and depth of the chiptune music exuded care, and among the sensory experience were engaging stories and gameplay. I have recently replayed Zelda: Oracle of Ages and not only have I gotten further than I ever did as a kid, I still hold that it is a fantastically crafted and fun game.

Playing the Harp of Ages for the Maku tree, source
Video games remain a part of my life though not in any especially remarkable way for someone with my demographics. We had a conveyor belt of consoles growing up; PS1, GameCube, PS2, Wii, and now I own a Switch (not to mention my teenage obsessions with The Sims 2 and Civilization 4 on the PC). I have played a handful of the most popular Nintendo and indie games of the past 10 years, I consume a lot of game-related content on Youtube and Twitch, and (admittedly more remarkably) I have an OSRS (Old School RuneScape) account with 5000 hours playtime. So I’m a certified Gamer™️.
Maybe I could do this too
In my day-to-day life, I am a ⭐professional⭐ software developer (CV not attached) and it’s this career path that partially catalysed my interest in games beyond just the aesthetics. I am a backend developer, which I explain to my 93 year-old grandfather with this analogy: if I was working for a car manufacturer I’d be building the engine and the drivetrain, and please don’t ask me about upholstery or buttons1. Coming from this angle, its natural that while interacting with a piece of software it might strike me as interesting to understand what is going on under the hood.
To further push this burgeoning interest, a large proportion of my Youtube algorithm is related to gaming, in particular speedrunning. Speedrunning is completing a game (you guessed it) as fast as possible, and competing for rankings on community leaderboards. Not only are speedrunners experts at execution within their chosen game, but almost invariably the fastest way to complete a game involves them intentionally triggering bugs and exploiting the unseen mechanics of the game’s software. I now know an absurd amount about games I haven’t even played, from watching world record history videos from channels like Summoning Salt, or learning about the intricacies of Super Mario Bros for the NES from channels like Kosmic.
So yes, I like video games, and have more than passing curiosity about how they work. But, it was only last year that I was struck by any desire to try and make one myself. A couple of creators managed to turn my head. Special mention to Reubs, who’s youtube series where he recreated The Simpsons Hit and Run from scratch gave me an entertaining view behind the curtain into what modern game design can look like. Then there was Pirate Software. This turns out to be rather embarrassing to admit as he is reportedly a massive man-child and narcissist, but his rallying cry across his content that anybody can make a game, just give it a go and see what happens seemed to stir something in me.
"What skills do [you] need? What if I told you that you didn't need any? Well guess what. You don't. We live in a time where you can learn anything you need to make a game with relative ease. Despite what you may think none of that comes from natural talent. We all just pour our hours into getting better at what we do. You can do the same."
And finally I remember reading about Toby Fox, the solo creator of Undertale, which is one of the most popular and lauded indie games of recent years. I am under no false pretenses that what I produce will be Great, but the simple fact that a solo dev can release a finished game was enough to give me an additional kickstart.
I’m gonna do it
That settled it then, I am going to make a game. It seemed to me that there were two main questions to answer; what kind of game do I want to make, and what tools do I want to use to make it?
The first was an easy realisation to come to - I wanted to make a game that I would want to play, and one that I felt was comparatively easy to make. Keen-eyed readers might now guess from where I have taken my strongest inspiration - my game will be a top-down 2D adventure RPG with pixel art, just like the GameBoy Zelda games I love so much. Thinking about the theme and story would come later, but for the time-being that was enough to work with.
Now for the tools; I needed a game engine. I would say I’m rather unique among developers in that I have almost exclusively used the quite niche programming language Scala, both at work and for personal projects. I am not opposed to writing other languages; I’ve had to dabble with JS, Python, Go, Elm, Java, and Kotlin over the years, but the prospect of both learning the ins-and-outs of game development while also trying to learn a new programming language was daunting to me, and almost enough to put me off the idea altogether. But that really seemed like an inevitability with what I saw folks recommending, as most of the well-known engines use something like C# or a custom scripting language. I wanted my limited attention towards learning to be focussed on “how do games work”, not “how do I do this thing I already know how to do just in a different language”.
I love my rock and my hard place
Scala on its own just seemed like a bad idea2. But my workflow with Scala is just so comfy, I had blinders on and couldn’t see anyway forward other than finding a way to use it. This may be a case of “if all you have is a hammer, everything looks like a nail”, but what if you just really like using your hammer? Yes I can see your toolbox over there looks very nice, and lots of people use it, but I already know all the minutiae and quirks of my toolbox!
There was also a part of me that wanted this to be harder than it had to be - trying to do something with completely the wrong tools for the job is actually a fantastic route towards learning how that thing works. Reinventing the wheel at work deserves a slap on the wrist for wasting everyone’s valuable time, but your personal workshop can be full of homemade Franken-wheels. Making a square peg fit in a round hole is so much fun and teaches you a lot about the nature of both squares and circles. If you’ve ever looked at a mountain and thought the steeper, rockier route up is the one for you, I think you will appreciate this sentiment. I had this probably false impression that if I used one of these big fancy game engine programs, I wouldn’t get the chance to get down in the dirt and see how things worked close up. Taking the path less trodden has always appealed to me, from doing a quirky degree program to being a complete programming monoglot in an uncommon language. I guess I’m just not like the other boys. So come on, what did I do??
Cutting to the chase
Eventually two pieces of knowledge helped me converge on a solution. Firstly, I was aware that there was a period where it was not uncommon to use the programming language C in game development.3 Secondly, there is a project called Scala Native, which in short allows you to easily use C libraries from within Scala, and run your code in the same way that you would run C code.4 I googled “C game engine” and clicked on the first result (an inaccurate dramatic reenactment). That’s how I discovered Raylib (charmingly named not after the computer graphics technique “ray-tracing”, but after its creator, Raymond) and my esoteric game development pipeline was born. Scala Native + Raylib is my ugly hammer and I am having so much fun with it, and learning every time I open my IDE.
Raylib is very barebones by design, at its core all it really does for you is draw things on screen, listen for user input, and play audio files. It doesn't even have a user-interface. The rest is up to you to figure out.
Looking back at the games I played on my GameBoy with the eyes of a software developer and the knowledge I’ve picked up from following the speedrunning community, I am astounded by the fact that developers of those days could do so much with so little computing power, and the equivalent of rocks tied to sticks compared to the development tools that we use in modern programming. Getting to use C (albeit tangentially), and getting closer to the machine than I’ve ever been feels like I get to experience a little bit of that pioneering time.5 Raylib puts just enough distance between me and the overwhelming complexities of modern game development for me to be productive, while leaving enough space for me to get into the nitty-gritty and make mistakes and learn about the low-level of creating a game.6
I started a career break this year and have been working on my game fairly consistently for the past few months, and while I am sure to eat some of these words down the line I am very happy with the choices I have made to this point. I’m very much of the mind that methods don’t matter as much as actually rolling up your sleeves and giving things an honest try. I like using my hammer, and I will squint until everything looks like a nail and give it a good bonk.
-
Like all analogies it leaves much unsaid and leaves no room for nuance; to my frontend friends, I love you, I could not do what you do. ↩
-
So, Java does have some pedigree in major game development with RuneScape and Minecraft, and one of my earliest forays into coding was the following Stanford CS101 course on Youtube which involved writing a Breakout game in Java. Scala compiles to JVM bytecode and can use all of Java so I knew it was technically possible to use vanilla Scala, but my experience with working on the JVM make me think that down the line I might run into problems, and frankly the tooling didn’t look all that attractive. However there is in fact a wonderful game engine written for Scala called Indigo, created by my old boss Dave Smith - his demo of the engine at a Scala In The City event a few years ago is one of the few coding talks that could actually hold my attention for its duration. The single constraint that I felt was too much of a burden for my project was that it only targets the browser, and I have lofty dreams of my game being cross-platform. I love writing Scala, but 2/3 of its target runtimes didn’t make sense to me for this project (spoiler, the one runtime I haven’t mentioned turns out to be the key!). ↩
-
User Fizz on pokemondb.net reports here that the GameBoy Advance and DS era of pokemon games were written in C. I haven’t been able to find anything about those GameBoy Zelda games, but its most likely they were written in Assembly, with possibly some C used to aid development. There is a community of developers who are making GameBoy games over at gbdev.io, and C is one of their recommended tools for trying it for yourself. ↩
-
My naïve understanding of the “native” in the name means that the code runs directly on your machines hardware, rather than it running via a “virtual machine” that sits between your code and the bare metal. ↩
-
I realise this makes it sounds like C is some stone-age language, but in reality its just a lot more low-level than I am used to. The biggest learning curve I have found so far is thinking for the first time about memory allocation, something that comes up rarely if ever when programming on the JVM. ↩
-
And none of this is to say that Raylib isn't a modern game engine, a look at the examples page on the website is enough to show that you can make games with Raylib that look nothing like the GameBoy games I've mentioned. ↩