Another Ludum Dare down! This was a tough one for me. Nothing in particular made it tough by design, but I struggled more than ever. I’m going to keep this post-mortem brief, unlike my usual!
The GOOD 👍
Music
The music of Tribulation played out fantastically. I ended up using Strofe, an AI system that generates music based on a few basic inputs. I was able to get music generated in roughly the style I was looking for, then use some basic editing with Audacity to tune it to exactly what I wanted. In addition to the music, I have pitch changes occur when the player enters “insanity mode” (more on that later), and it was a really great touch to set the mood throughout the game.
Leaderboard
This time around I utilized a proprietary leaderboard system I had built previously for some “jam series” games that is titled “EzLB”. This made it very easy for me to incorporate the leaderboard at the very end. While I could have spent more time on the board itself, plugging in a high score system was effortless which was a huge pain point in my previous entry for Ludum Dare 45 (Planet Jumpers).
Art and environment
My art style is continuing to grow. While I’m nowhere near the level I want to achieve, my overall style is becoming more and more consistent. I’ve been participating in Pixel Dailies on Twitter for a few months now, and the practice is showing through. I spent less time than usual on my art, but the game feels clean on that front. On the last day, I set aside time to draw cosmetic objects to scatter throughout the levels and it made a huge difference in the feel of the levels. They went from empty hallways to places with history. I’m happy with my style as it’s maturing, and I’m excited to continue practicing! Look at the environment!
The boss fight
I had recently practiced some basic boss fights in other “jam series” games, so this was a fresh one. My approach to boss designs seemed to go well for this game. Using timers to flip between attack modes, and then multiple “phases” of the boss based on amount of health to make the second half of the fight different. I had a lot of cool ideas for this fight that I had to cut, such as the boss consuming monsters for health or having a duplicate nightmare version of itself in insanity mode. I only allocated 3 hours for the boss development, and it took me about 5. Next time I will make sure I plan for more time, so I can build it out more complete. In the end, even with a lot of cuts, the boss fight felt pretty good. Final boss fight
Insanity mechanic
I was a little on the fence about how this mechanic would play out in practice, but it felt really good once implemented. The approach to replace tilemaps with insanity change was not as complicated as I thought it might be, and generally worked pretty smooth. I wish I had time to add an alternative tileset for when insanity mode, to really make it creepy. Even without that the music and border effects were enough to give that unsettling feeling.
Multiple endings
At the last second, I was able to add a second ending to the game. This included 5 secrets hidden throughout the game, and a secret wall to clear on level 4. The second ending completed the “message” of the game itself, which I was satisfied to accomplish. Ending 1
Build and deploy pipelines
This was the biggest change from my last Ludum Dare. I setup pipelines using Gitlab, so that I could simply push my code out and it would auto build and deploy to Itch.io and my Gitlab pages URL. This made it very simple to push out new builds for people to play test for me as I was developing. Between this and my use of EzLB I was able to save a couple hours worth of effort. Build pipelines in all their glory
The BAD 👎
The lighting
I had originally planned to implement a lighting system. I wanted the player to use some form of flashlight, and interact with lightsources throughout the levels to make things not only creepy but more challenging as you look around for enemies hidden in the corners of the map. Without this the game feels entirely too bright, and I think a proper lighting system would have made a HUGE difference in the final product.
How-to & Tutorial
This time around I didn’t allocate enough time for a tutorial. While it was important for me with Planet Jumpers, I underestimated the effort it was going to require. This put me in a position where I had to do the low-effort “how to/controls” on the menu itself. While it “sorta works”, I don’t think it did me any favors with people that already felt the game was difficult. I started out good with the pipe + wood barricade to teach the player through gameplay, but quickly fell off. Level 2 shows people they can see different things while insane, but there’s nowhere in the game that explains the increased damage with insanity mode or the fact that enemies can be stunned. Next time I will make sure to set more time aside for a tutorial or better teaching through gameplay.
Gross how-to on the menu
Enemies aren’t that fun
Something I have struggled to emulate since my debut game, Mutoid. The enemies in Tribulation didn’t end up feeling very satisfying to fight. The runner type enemies end up just being kited, and the ranged enemies are too easy to get one-tapped by. I could have used more knockback against the runner enemies, to give the pipe more “oomph”. The player health was okay, but the enemies needed to deal a little less damage. More enemies doing less damage would have made the game feel more technical. Or alternatively I should have made the weapons compliment eachother better so that swapping between the pipe and pistol made more sense to quickly clear a room. Generally it just needed to feel more dynamic, more engaging and challenging for the player.
Pipe attack, notice the lack of “engagement”
Pivoting my game… scope…
I lost 4 hours this jam due to the most basic mistake. I picked a game with too large of a scope. Well, maybe the scope itself wasn’t too big, but my experience at making RTS games was certainly not up to the task.
My original game idea, which I will write about another day, was an RTS where the player is a god indirectly influencing various tribes across a world. Very cool idea on paper, but as I worked more and more I realized I didn’t have the technical chops to pull it off. Even though I wrote “make it fun” and “tight game loop” on my whiteboard, I still missed the mark on my initial idea.
Ending 2 is too difficult
While I did get to add ending 2 to the game, I made the secrets a little too tough to find. Nobody has gotten it naturally yet, but people have come very close. There is 1 secret on every level that must be collected. In order to collect the secret on level 4 you must not pickup any gun weapons (pistol/rifle) with the exception of the ones on level 5.
Somebody please clear this thing already
Spaghetti code
Unlike Planet Jumpers where the foundation of the code was easy to extend and modify, Tribulation has a jumble of code. I am not sure how I ended up there, maybe something about my panic as I pivoted 4 hours into the competition.
Tribulation is one of my buggier games, and proved a constant time sink to do things I expected to be simple and fast. This definitely played a part in my final product as I struggled to estimate effort on the final day. Next time around I will take the Planet Jumpers approach and build better foundational nodes/classes upfront so that the second half of the competition I can add more features with less time.
LD49 Conclusion
I will update this post with the scores once they go live. I don’t expect Tribulation to be my #1 rated LD game, but I think it will do well in a few categories. Not my finest showing, but one I learned a lot from. I need to shrink the scope next time and focus on making it fun first.
Next up 🤘
Ludum Dare is a great place for me to learn and iterate on skills in such a tight timeframe. I can’t thank the folks at LD enough for running such a great event.
My style is maturing. My game dev ability is improving. I’m really excited to continue growing the “Garrett Makes Games” brand, and lean into the indie dev scene more and more.