A bit about me
Hi, I’m Numi. I’m a full-time software developer in the southeastern US, and I decided to join PirateSoftware’s GameJam 15 at the last possible moment. I happened to catch a bit of Thor’s birthday stream during my lunch break at work, saw the theme vote, and happened to have a loose idea forming in my brain. I’ve watched Thor’s shorts and bits of streams for several months now, so I was already curious about starting into game dev, but hadn’t particularly made any effort to work towards that end as of yet.
On the way home from work, I decided to start filling in the GDD template, just to see how the ideas came together. I got it half-filled when I realized that the ideas I wanted to make were going to largely depend on how quickly I could figure out the tools, and also how much time I could manage to spend on the project. As I already mentioned, I work full-time, and in my mind, any gamejams that are longer than a weekend are meant for high-school/college students with enough free time to actually get some serious work done on the project, not for adults with a job and various duties to take care of. After running some numbers, I figured I could get close to of work done across the two weekends, and probably another 25 hours during workday evenings. (I didn’t track my time particularly closely, but I think I came pretty close on those estimates.) Based on that, I decided to give the gamejam a shot.
Oh how I underestimated things :D
Since this is a post-mortem, I’ll be putting the lessons I learn into these quote blocks. I’ll summarize some of them at the end as well.
The Plan
First off, let’s take a look at how insane I was when I first started planning this. I needed to:
- Learn Godot, since I’ve never used any game engine prior to this.
- Learn GDScript, because the C#/DotNet version of Godot doesn’t allow you to compile to web. I didn’t know this initially, which meant my assumption that I could, at the very least, use a familiar programming language for the project, disappeared almost immediately.
- Find a low-poly modeling software, learn to use it, and create all the art assets for my game. I tried looking for some stock assets, but I found that not only are quality, free stock assets hard to find, none of them really meshed well, so unless I wanted to make a game only with the free assets I could find, i was going to need to make my own.
- Compose my own soundtrack. This was perhaps the only bit that went almost flawlessly - I already had Waveform 11 installed on my computer from my prior attempts at sound design, so all I had to do was dig out an old MIDI keyboard and bang out some simple chiptunes.
- Design enough levels to play through. This one, clearly, didn’t really happen, but we’ll get to that later.
- Make the game fun. This one also didn’t really happen, but hey, it’s a prototype, right?
I spent the first day putting together this loose list in an attempt to put a timeline into my GDD, before realizing that most of these were so abstract and I knew so little about them, that I had no idea how long any single piece would take. “Learn Godot”? What is there to learn? How much do I need to know to get a game going? How much of that is going to be research vs hands-on practice?
To keep myself from getting hung up on this, I figured I’d be better off simply diving in and seeing where things went, so I did. The first two days were mostly spent reading documentation, watching a few videos, building up a general “vibe” for the game through Spotify soundtracks and Pinterest image boards, and generally creating this mental image in as many ways as possible. I wanted the end result to be a natural outpouring of immersion into the feeling of the world I had already started fleshing out inside my brain.
In retrospect, I should have known at the time that the scale of my plans as outlined in the GDD and the time scope I had for the gamejam were not just “a little ambitious”, they were absurdly out of wack. Orders of magnitude too big for the estimated timeframe. Even if I knew every tool inside and out, that sort of concept would take months to build, and I had no idea what I was doing. So, lesson learned: keep the scope of the idea proportional to the timeframe and don’t assume you can cut things later while still preserving the original idea.
The Pitfalls
Tool Troubles
The problems started pretty quickly when I realized that modeling was going to be a huge issue. Since I knew I wanted low-poly models, I decided to use Blockbench, a popular software for the task. It’s used by Mojang for building Minecraft assets, surely it’s a good tool, right? Well, I have no idea. Because it has no documentation.
Wait…what? That can’t be right.
But it IS right. Their own website contains some cursory API documentation for if you want to build an extension for Blockbench, but as far as actually using the software? There’s a quickstart guide that points you at various Youtube channels run by the community, and a link to the Blockbench Discord, but no actual manual, no official tutorials, nothing. The tool used by some of the biggest low-poly game devs has no official docs.
I thought for a while I’d be fine - the program is, seemingly, quite intuitive. And for a while, I managed. Until I got to texturing, where the textures kept disappearing for no reason, the files wouldn’t map onto the faces correctly, the scaling was wrong, importing textures gave me jumbled-up garbage, etc etc. With no manual to consult and so little idea what was going wrong that I wasn’t even sure what questions to ask, I decided to switch tracks and use a different piece of software. I actually switched twice (Blockbench -> MagicaVoxel -> Goxel) when the intermediate software didn’t export data the way Godot expected, so that was an additional waste of time.
Unfortunately, this change meant losing out on features that only Blockbench had, like animations. While I could’ve done some loose animation work inside of Godot, it’s not nearly the same as putting those animations into the model data itself.
The lesson here is to pick the right tools. Changing at the last minute not only has retooling costs since you have to learn a new system, but also might not give you as many options as if you’d used the better tool for the job.
Data Loss
So…this one still baffles me to this day. As I was setting up a Git repo - ironically, to ensure that I wouldn’t lose any data - I somehow managed to delete or corrupt my entire Godot project folder. I still haven’t the slightest idea how I did this. My best and only guess is that I had something open in the background - maybe a running copy of Godot - that had read locks on the files, so when Git tried to start poking around it spazzed and corrupted some data. Even that is a weak and improbable explanation, but I have no clue what else to even hypothesize.
There’s not much of a lesson here - I was actually trying to do the right thing and keep backups - but still: backup, backup, backup your work. Save early and often, keep redundancies, use “save as” instead of “save” to keep old versions of works, all that jazz. You never know when you might need to cannibalize some code, and you’ll be grateful that you kept a copy instead of deleting it entirely.
GridMaps and Export Woes
Godot has this interesting concept called a GridMap. It’s like a tilemap, but for 3D objects. I figured this would be pretty simple - just slap in some basic objects and load it in like a level editor.
Yeah. That’s the theory at least. In reality, it’s much trickier than that, especially when your programs export everything at JUMBO SIZE and you have to rescale every model to fit the grid. Also, it’s tricky to think in 3D the way Godot expects you to, sometimes. Certain things are just not explained (perhaps because Godot expects you to have some experience in programs like Blender where you’re used to having a 3D workspace) and my tiny brain struggled to keep pace with some of the intricacies.
One of the big things I didn’t figure out until way too late in the process is this: models and physics objects are usually not meant to be added directly to a map, they’re meant to be added to a scene, combined with other elements like collision boxes, and then that scene gets added to your map. I did not quite understand that at first, and by the time my brain made the connection, it required me to repeatedly go back and redo work.
The takeaway here is to consider your tooling. Godot has plugin support for external level editors like Trenchbroom, and I probably should have used them. It also requires you to think about things a bit differently - get used to wrapping your brain around the expectations the engine places upon you before you go trying to do something fancy.
Fatigue and Perfectionism
This one isn’t a technical hurdle, but a personal one. I am, and always have been, a bit of a perfectionist. I grew up with the “don’t half-ass anything, give 110%, good enough is not good enough” mindset - if it’s worth doing, it’s worth doing right, right?
Well…sometimes. And sometimes, having that mentality - especially coupled with other traits like overambition, poor time awareness, and probably some undiagnosed ADHD - is just a recipe for burnout and disaster.
After the data loss, and then again after the second weekend wrapped up and I realized just how little progress I had made compared to what I wanted to accomplish, I felt very worn out. I considered dropping out of the gamejam. I didn’t even want to put my name on the project, because I didn’t consider it up to my own standards.
However, sometimes “good enough” really is good enough. Statistically speaking, the fact that I managed to submit a working deliverable at all puts me in at least the top 20% of all gamejam participants based on the numbers I gathered from the community. Finishing the product and turning in literally anything functional means surpassing everyone who gave up and didn’t complete their project, for whatever reason.
A small side-note: I don’t say this to belittle or degrade anyone who didn’t complete their gamejam submission - stuff happens! There’s nothing wrong with putting a pause on a project and continuing it later. This is more just a local application of a broader bit of wisdom, which is that sometimes just getting to the finish line, really is good enough.
Also…I like to keep in mind how many things I learned along the way, and how many “local highs” I hit during the journey. I was unreasonably ecstatic when I first got my little character to wander around the screen. Implementing dialogue felt like a monumental accomplishment. Looking back into my assets folder and seeing 25 art assets was like walking on cloud nine. These are things that if you had even suggested them to me a few months ago, I would have laughed at. “I’m not an artist/composer/designer, I’m a code guy,” I would’ve told you.
Well, past me, read ’em and weep. No holding back now.
There’s plenty more things that happened during the gamejam that I could ramble on about, but I feel as though I’m beleaguering the point a bit now.
The Wrap-up
The last day was rough. I was so exhausted from the previous weekend and subsequent long nights that I took a nap after coming home from work. I did nothing but code and model and design up until midnight, at which point I tested everything and posted my work to itch. I am currently writing this postmortem as part of my submission at 1:15 AM. I have work in the morning at 8 AM. Future me is going to hate present me for doing this write-up instead of sleeping.
But I thought it was important - for myself, for the judges, and for anyone who happens to read this - to take a peek into what the gamejam was like for me, and the lessons I learned along the way. This was an amazing journey, one I hope to repeat in a slightly more reasonable fashion at some point in the future.
Am I proud of my submission? Not exactly. I still think the end result is a steaming pile of garbage. It’s ugly, it has massive, glaring bugs, it’s barely functional…you can really only call it a “game” if you squint your eyes, are massively drunk, and kinda gaslight yourself a bit in advance.
But I am proud of the journey I took to get here. I’m proud of the fact that I alone managed to accomplish so much with so little time, even if no one besides another game-jammer would really understand how monumental some of these hurdles were to overcome. I’m proud that I took the initiative to join the gamejam at all, and that despite setbacks, I didn’t give up, and I managed to submit something that works…sorta :D
So that’s it!
If you’re reading this, Thor, I appreciate you and everything you do for the tech/gaming community as a whole. Your motivational shorts have been a great help in reframing failures as progress towards future successes, and I hope that one day I have the chance to gnome you face-to-face.
~ Numi
>> Home