What I learned in Ludum Dare 54

Game Jams have always struck me as something inherently odd. As an individual or small group, you decide to take the weekend which is a time usually reserved for relaxation and unwinding, and opt to place yourself under a phenomenal amount of stress as well as typically ruin your sleep pattern in exchange for making a game. The worst part of which is it always ends up being great fun, and I would happily do it all again no matter how much of a pain it can be. This one was not a pain. The duo who joined me and became a team were two very dear friends, and we had a great time developing what came to be “Oort’s Orbital Postal Service.”

There’s a lot to unpack from this weekend and my experiences. That’s the sort of sentence that’s usually followed by a quantified saying “the highs and the lows”, but there really wasn’t much in the way of lows. That doesn’t mean there’s nothing to learn. This was my first game jam in 10 years and my first one at all where I had any modicum of experience at programming anything more than a Python command line app, so safe to say I had a lot of takeaways.

So, what did you make?

Poster of the game showing a spaceship/mailvan, some asteroids, and a logo in blue text saying Oops

We made this! It’s a game in which you deliver parcels, in space. Not the most thrilling premise but then again one of the best games I’ve ever played has you role playing as a Soviet border guard, so let’s judge it on its gameplay. It's called "Oort's Orbital Postal Service". You play as Oort, a space travelling delivery driver, working for the Orbital Postal Service. Your job is to deliver parcels to people living on nearby moons, planets, and asteroids.

The theme for this Ludum Dare was “Limited Space”, so the first thing the 3 of us did was hop in Discord, and start chatting the shit. Bit of an odd scenario for me as the two I dragged along to this fiasco, Pax and Jordan, I knew individually, but they had never so much as seen each other, or interacted beyond the occasional message on Twitch chats. I had no doubt they’d get along, but it was a strange experience having 2 people from very different parts of my life meet each other.

Day 0 - Ok, now what?

At about 11pm UK time, the theme was announced. Unlike those on the western side of the Atlantic who got to start at a reasonable time based on their time zone, Ludum Dare 54 kicked off at 1 hour before midnight for us. The theme was announced, and we began, sat in a Discord server, immediately hit by the fact we had no idea what to do with the words we were given.

We threw some ideas around, mostly puns about space given we are all giant nerds, and discussed a few different ideas regarding Tetris style packing boxes, and eventually arrived at the idea of using the limited space in a van for moving, earning points based on how quickly you deliver a parcel in a limited time. There was some discussion about characterization and art style, as well as how to make planets. We were acutely aware of the concepts of gravity, given that at this point it was about 11:45pm on a Friday, and gravity was doing its work on our eyelids. Eventually we decided the best approach was something Pax termed “Futurama logic” meaning that, unless explicitly stated or shown otherwise, Futurama generally assumes that a planet has a) a habitable environment for all creatures and b) a similar gravity to Earth, regardless of if it’s an asteroid, a moon, or a super giant planet. This worked for us, as we wanted to lean into a cutesy animated art style anyway. So with the basic rules of the universe established, and a gameplay loop decided, we had to make the thing.

I pulled out my usual approach to problems and threw a basic Kanban board out there on Trello, as I’m one of those people who can’t operate without lists. Gave Jordan and Pax access, and started breaking down the gameplay. Once we had a semi-passable list of things, I called it an evening and decided to start fresh eyed in the morning.

Day 1 - The basics

Around 10am, get up, play with the cats, drink a coffee and think about the Herculean task ahead of me today. I program 5 days a week for 8 hours a day and I’m good enough at that to be paid for it, surely this will be fine, right? Right?! Well, yes, and those skills will come in handy, however… In an engine I’d never worked with before Using GDScript, which I had never worked with before Working with 2 people who are good friends, who I did not want to either let down or piss off.

Not to mention the hardest part of any project is where to start. Everything has to start from something, so where do we go with that? In my case, I decided that I’d focus on getting our beloved Oort moving, and being able to get in and out of their ship. It seemed a good place to start, and I made a hell of a dent in it. Even worked out that this would be a great place to implement a state machine pattern. Of course I figured that out way later than I needed to to avoid rewriting a lot of code, and I had no idea how to implement a state machine in GDScript, so as spaghetti code it stayed.

Next was a smooth camera transition. This is where Google really came in handy, or more specifically YouTube. I can’t remember the tutorial I followed off the top of my head, but this is where I got to really appreciate the hell out of the way Godot handles what I used to use as prefabs, by having everything be a scene. So I use a signal to trigger that Oort is getting in or out of their ship, and use a third camera that takes the position of the source, smoothly sets itself to the position of the target, and switches the target camera to current. Hook up the signals with the correct parameters passed, and boom. The camera moves. I also did a whole lot of other bits including contributing to movement mechanics. In the meantime, Pax cranked out some fucking phenomenal artwork, and Jordan did the movement for the ship. Given that was physics based and traversing 3D space, I was stunned at how well it worked and how quickly it got done. That was one of the first PRs to the repo.

From here, I was pretty tired. I started working on a variety of different things. Code structure, movement controls, and a few minor updates. Also encountered a merge conflict in the main game scene which took me a significant amount of time to unpick. Fortunately, while I wouldn't describe the scene files as "Human Readable", they also are actually in English and can at least be vaguely interpreted. Otherwise this could have been a very long merge. All this time, Pax had been absolutely grinding away and making some fantastic art assets. How they can just create and make all this shit to such a quality so quickly is so far beyond me that it may as well be quantum physics. Actually, I have some knowledge in physics, so maybe even beyond that.

At this point we had a character that could move around the map, could get in and out of a ship, fly said ship around the map, and it all looked pretty damn good. To be honest, given that as a team of 3 where 2 of us had no experience with Godot, and one of us is a hobbyist programmer more than a professional, we had already exceeded all expectations I had when we agreed on going for a 3D game. Also it was 1AM and I'd been working since about 11 with breaks for food and the occasional cat playtime. I decided to call it time, and get some more rest.

Day 2 - Tying it all together

I woke up on Sunday and did basically the same thing I did on Saturday. Coffee, cats, freshen myself up, and figure out what's next. For me, it was the loading and unloading the truck. So, I got to work. I'd not really worked with colliders very much, even in Unity. Simple City had no need for any physics at this point so box colliders were only there for clickable objects. Also, everything there was 2D, so I was messing with a whole other dimension. I worked on collision masks and layers, learning about the fact they were labelled and counted using bits. Guess who spent half an hour wondering why things on layer 3 weren't being found in code? Jordan worked on UI elements, which then tied in nicely by having both a scoring system, and a way to indicate how full the ship was. I'll confess, after a week of programming for work and then pulling what was at minimum a 12 hour shift on Saturday, my patience and abilities were both waining. There was one moment where I merged to main and entirely killed... something. I can't remember what it was, but it resulted in this wonderful commit.

Git-Commit-Im-An-Idiot

While working on the box loading, I also discovered that the position I had Oort, our beloved courier, pick the box up to would overlap with their own collision box, resulting in this beautiful interaction.

weird-zoom-interaction

Once we had Oort getting in and out of the van, and loading parcels in and out of the van, I took overview of the code. Jordan is a front-end developer primarily, so he's also familiar with things like linting, and how good having clean code is. We were discussing the fact our code was very much spaghetti at this point and Pax was apologising for it, and I responded simply with this;

It’s a game jam. Anyone who says they use clean code in a game jam is either a senior dev with 1000s of hours of prior game making experience, or a liar. _

And to be honest, I think that's fair. Kudos to everyone who tries to keep it clean and succeeds, that's remarkably impressive, but I think I went into this full well expecting to produce enough spaghetti that Italy's GDP would drop. Oh boy did we live up to that promise.

Next step was a timer circuit. The actual game of this is to see how many parcels you can deliver in a day. Again, the way Godot handles events and signals made this super straightforward. I made this pretty quickly, along with a rudimentary "End of day" screen, that had a button that just reloaded the scene... I am not a UI designer, and boy did it show. But I soldiered on and added what I could, and fixed other bits.

As I came to the end of the day, I looked at my Godot playtime on Steam, because if I have a way to safely auto-update software, I'm going to use it, and noticed it'd racked its way up to around 21 hours. Given I didn't even open it until Saturday at 10:30am, and it was about 11pm on Sunday at this point, that meant that my PC had spent 21 of the last 36 hours on, and making games (some time was also left on when I went to make snacks). My brain was mush. I was trying to write an inventory system for the ship and decided that no, it was over for me. I had hit the wall, especially now that I had work on Monday. I apologised to Jordan and Pax who were more than understanding, and bid them goodnight. Jordan was soon to follow but Pax powered on through until the not-so-early hours of Monday morning, as they're self employed and take Monday's off.

Day 3 - The elves had been making shoes...

I woke up on the Monday feeling absolutely exhausted. I then proceeded to sign on to my work laptop and, well, work. Back into the grind of software development for an industy that was completely unrelated from game development. In some ways, falling back to familiarity was nice. But I have to say, writing tests for testing frameworks that pass and give the little serotonin boost of a green tick is no where near as satisfying as making things happen on screen in game development. Pax had left a note on our discord server explaining that overnight, they'd tied basically everything together along with some shiny new artwork. I anxiously awaited the end of my day as a simple salaryman to open up and see what had gone on, and when I did, I was blown away.

Pax had taken all the bits and parts that the three of us had worked so hard on, and turned them into something playable. A functional but very basic game. What we had before I started work on Monday is what I'd probably describe as a tech demo. The very fundamental basics were there in varying forms, but the work Pax did showed more "Just greenlit by the studio", or probably more accurately what a pitch proposal or tech demo is meant to look like, when done by people with actual skill.

I'm not going to show any of the finished gameplay here. For that, you'll have to go to the Ludum Dare page and go from there. I think the game is actually hosted on itch.io, but the Ludum Dare page will take you there. Pax also snuck in a patch as the first comments started rolling in. One of our control schemes included "Ctrl + W" which, given this was a browser game, caused the minor issue of killing off the tab it was running in. Oops...

Day 4 - Wait, what are you doing here?

Yes, the jam ended at 11pm on the Monday. But on the Tuesday people started playing the games and leaving feedback for each other. Including ours. We had some bug report ones to do with the accidentally closing the browser with a key combo we added, but other people in the community were so kind, and had nothing but nice things to say. I was shitting enough bricks to solve the housing crisis when we talked about getting feedback, but I'm so glad we did. The fact people recognised the effort that went in, the game we were trying to make, and also the game that we did make. As a team, we definitely had aspirations far bigger than what we could accomplish in the 72 hour window we had, at least with our skills, but words cannot express how happy seeing people leaving comments saying they enjoyed our game made me feel. It was, as the recent Barbie movie put it, SUBLIME!

What did I learn?

Well, first thing I learned came on the Monday, where I learned that if you're gonna do a game jam, book the following day off. Not that I was particularly productive on that Monday anyway, but the 8am start didn't help. But in terms of proper lessons, let's take a look.

  • Transferrable skills: My Unity knowledge did help. I have learned something over my time messing around with various game engines. The same with reading a few books on the subject, building up that knowledge has helped. Also, now that I'm a relatively experienced programmer, it really did show how having the problem solving skills that I've spent years working on have improved, and how useful they are.
  • Working with people is great, given they're the right people: There is no way in hell I could have come close to achieving what we ended up making. I'm not an artist, I'm not a UI designer, and without the work that Pax and Jordan put in, there's no way any of this would have been remotely as fun or engaging. I can't thank them enough. This weekend was a blast because of them. Not just with their skills though admittedly that made things easier from a practical standpoint, but just being able to bounce ideas and discussion off of like minded, intelligent, and all round lovely people sharing a common goal, absolute perfection.
  • Learning new stuff is hard: It's been a significant amount of time since I really learned anything from scratch, so to take on all that I did, and come out the other side with something that I'm proud to have worked on. Godot and GDScript were entirely new to me, 3D was entirely new to me, and if I'm being honest, 3D scared the hell out of me. Fucking quaternions and adding a whole new direction to vectors. Not to mention brand new data structures for things like transform objects. But I did it, and I'm better for it.
  • Support is important: If they're there for the highs, they're there for the lows. Oh my god did I feel awful on Sunday when we had put in all this work but what was there didn't really represent any part of the vision we had. Pax came in at the 11th hour and tied together all the components into a good final product. In addition, my beloved partner was the one making me all those coffees, checking up on me, and supporting life as I decided that 48 hours of my life were to be sunk into a passion project. Couldn't have done this without them either.
  • Godot is fucking great: I mean, I couldn't be much clearer? For an engine that was relatively little known until about a year or so ago, outside of some niche game development areas of the internet, it's come in and blown me away. I know one of the Godot Engine's current goals is to bring in .NET feature parity with GDScript on Godot 4.x. Once it does that, it'll be even more accessible. I mentioned in my last post that I'd likely port Simple City across to Godot when I felt I had something worth porting. I'm now very comfortable in that decision.

Final thoughts

Game jams are a wonderful experience, at any experience level. I think I've thanked Pax and Jordan about 10 times throughout this, but to them again, thank you. You can follow Pax's wonderful art on the newly launched paxlefay.com, and Jordan is around on Twitter and Github. I will definitely be doing another Ludum Dare. I'll definitely be using Godot again. I'm hoping that, between the three of us, we can actually build Oort's Orbital Postal Service out more, and maybe even release it. It's something I'd love to do. Grown quite attached to the little spacesuited friend. Oh, and to the LD community, you guys are amazing. I'll likely look at listing the repo too when I have a chance, but it might become the repo of an actual game so maybe not. Who knows?

Next Post Previous Post