I recently completed my seventh Ludum Dare, my first being back in 2016 for Ludum Dare 37. Each time, I’ve entered the “Compo” category, which means creating an entire game from scratch in just 48 hours. During the event, I decided I wanted to start writing these postmortems to reflect on what went well, what didn’t, and what I learned.
I’ve always appreciated the period of intense focus that comes with a 48 hour challenge. There’s something uniquely motivating about testing what you can achieve in such a short period, and Ludum Dare never fails to push those boundaries for me.
This Ludum Dare entry also served as a significant milestone: it’s the first time I would be using my own custom game engine. My previous entries were built with Lua and Love2D, both excellent tools for game jams. However, I’ve been working on a game engine to learn more about WebGL, and it finally reached a milestone where I felt it was ready to use in a Ludum Dare entry.
Idea
The theme this time around was “tiny creatures”. My first thought was to create something with ants or bees. I wanted to re-implement boids that I had used in an earlier Ludum Dare and bees felt like a better fit for that.
The concept was that the player would control a hive and manage resources to ensure the hive’s survival through winter. Players would have to balance bee production with honey reserves: too many bees would eat through the reserves too quickly, while too few would mean missing out on valuable nectar sources. Scouting for nectar became part of the challenge, as new sources would appear throughout the seasons.
Using the New Engine
One of my initial concerns for this event was that I would have overlooked some critical feature in the game engine and I wouldn’t be able to finish my submission. Fortunately, everything went better than expected! At no point throughout the event did it feel like this engine was adding friction compared to Love2D.
There were clear improvements that could be made to make it more efficient, but knowing the engine inside out made it really easy to figure out how to work around any problems.
The day before the game jam, I had planned on going through the engine and creating some helpers to help speed up common tasks. Instead, I ended up creating a very basic particle system. I’m glad I did, as it turned out to be useful and added a nice visual effect to the game when I added rain.
I did have a memory leak on the second day that caused a bit of a panic, however, I narrowed it down quite quickly to a problem in React and creating too many instances of a styled component.
Polishing & Balancing
For Ludum Dare, I usually aim to have the majority of the gameplay features in place by the end of the first day, and then use the second day for polishing visuals, balancing, and final touches. This time, however, I took a different approach: I started the first day by putting effort into polishing visuals on the first day. Working on something that looked nice kept me motivated, instead of sticking with programmer art until the second day. I might use this strategy again in future, though it would depend on the type of game I was going for.
Reflecting
Overall, I’m really happy with this submission. I liked how the game looked, the engine worked better than expected (other than a bug with the input that I still need to fix), and I managed to finish all the features I wanted to include.
Balancing this game, however, proved tricky. I haven’t worked on a management-style game before, and there were a lot of moving parts to adjust to make the game feel fun without it taking too long to complete. One of the issues I often see with Ludum Dare entries is that the game is that they’re too difficult. It’s easy to forget that most reviewers want to spend a few minutes on each game before moving on. Striking the balance between challenging and accessible is always tricky but important for keeping the game enjoyable.
Finally, I want to improve my pixel art skills. I use a pixelated style because I find it quick to create, but I’m never 100% happy with the results. After every Ludum Dare, I plan to practice between jams, but it never seems to happen. It’s probably time to make that practice a priority!