Ludum Dare 50

It’s been a while since I tried a Ludum Dare and even longer since I managed to submit something to one. This one rather stuck up on me but I found myself with a want to work on a short project so I looked at the finalist theme list. Writing down some quick ideas for each I voted appropriately and hoped that one of my picks would be chosen for the theme, something that has maybe happened once or twice in my game jam theme voting history.

I was a little deflated when the theme was revealed and it turned out to be one of the themes for which I hadn’t thought of an initial idea but I still fancied taking part so I took a while to force a few ideas out.

Ideas

The theme for Ludum Dare 50 was Delay the Inevitable. With this in mind I wracked my head for ideas around the theme.

The first was an infinite runner where you try to outrun the dark side of the moon after crash landing. On the way you have to dodge obstacles such as craters and debris and you have to try and pick up food and energy drinks to keep your strength up… but eventually the inevitable freezing will occur. I wasn’t too keen on this idea as it was very similar to a jam game I’d made before. I would have been okay making it, that game was one of the very first I made with Godot back in 2018 and it was ROUGH, it would have been interesting to see what several years experience with the engine and improved game design would bring to the concept.

The second was a game where you have to exercise to stave off old age, they say every hour of exercise adds 4 to your life, after all. The game would play a bit like a rhythm game, making you press button combinations to make the player contort into the exercise forms.

The third was a horror story game idea where you try to keep an eldritch horror talking as long as possible to prevent them from breaking free and wreaking havoc on the world. Only your sanity and conversation skills will prevent the inevitable. I really liked this idea but I have very rudimentary experience with dialogue and trying to make a convincing narrative path, along with artwork and then coding AROUND the story I felt would be too hard.

The fourth and final idea was a bad roadwork simulator where you play as the WORST road worker, disrupting traffic and the job as much as possible. In this case the inevitability would be the roadworks actually being finished (or you getting fired). Again, I liked this idea but I feel like it would be too reliant on physics and like it would be a worse version of Untitled Goose Game.

Chosen Idea

As you may have guessed from the way I described the ideas, I decided to work on the exercise game. I left myself a bit of wiggle room to pivot to one of the other ideas, most likely the infinite runner, but as it turned out that wasn’t necessary.

Day 1

I started with the idea of having a character on screen, mimicking the shape of the keys that the player would have to press. As I wanted to stream the development but wasn’t quite ready, I decided to work on a basic title menu and some character design art.

[Picture of the prototype art]

The idea of the game would be that players are given a set of exercises to do, having to rhythmically respond to the prompts in time. As time marches ever on the age of the character increases and the player character would update to reflect this age.
As the day wore on, I began streaming and started to flesh out the basic skeleton of the game. It was a bit slow going but by the end of the first day I had a game that would respond to button presses from the user and respond visually, as well as a basic prompt mechanic for generating the “challenge” of the game, though this wasn’t actually functional yet. Off-steam I continued to work a little longer, starting by fleshing out the exercises that the player would have to do and then moving them into their own scripts to make.

Day 2

I picked up the game again, adding a node to the game scene to evaluate how well timed the player inputs are.

I realised that I should probably work on a little story scene to set the expectation for the game. This was both a simple undertaking and one that came together quite quickly. I created a basic dialogue tree and added some basic scripting to allow for forwarding the story or skipping it.

I then went back to the core game and made a basic animated stick figure indicator to show the current/upcoming exercise. This took a surprising amount of time to get right and I realised that my original idea of doing similar animations for the player character, updating based on the currently pressed key/step would likely take me too long. With this, I scaled the game back a little, discarding the full body player character in favour of a layered head model that would age as time went on. This took a sizeable amount of time but it was worth it.

I was hopeful that I might get the game in for the compo but I was somewhat hesitant to do so as it didn’t feel finished. It ended up being a bit of a moot point as one refactor ended up breaking the game. I changed the way the prompt/key inputs were evaluated, to better allow for use of that evaluation around the rest of the game, and I spent quite a while fruitlessly trying to bring it back to a working state.

Disappointed that my core mechanic was broken I resigned myself to a 3 day jam entry instead.

Day 3

On day 3 I managed to work out the problem fairly quickly. A fresh set of eyes helped. In tweaking the evaluator to be more useful I had gone from an if > return structure to an if > set value > return value structure but what I hadn’t done was put the last value assignment inside its own else statement and as such the value was always being overridden, it was headsmackingly obvious as I knew it would be when I gave up the night before. However, I had a later start on the game than I had hoped and this limited the time I could utilise to finish off the feature set.

Once the game was uploaded I realised that step-based age bonuses weren’t being applied correctly and that the player could easily de-age beyond what was intended. This was because ageing is applied with frame delta time, however the step-based reverse ageing was applied as a full value, with no delta applied, this meant that players would de-age ~60x faster than they aged if they got an excellent evaluation on a step. I quickly fixed this and uploaded the patched version. I then tweaked the ageing on missed steps.

I then realised that for proper evaluation I would have to reduce the difficulty of one of the exercises, however I thought people might like to experience the game as originally intended. I quickly tweaked it so that the exercise had two modes, giving the tutorial a toggle to switch to the easier version if players struggled with it. Ideally I would have made it so that players could test the easier version before deciding but there wasn’t time for this. A final upload and I decided to end the stream and go to bed.

Day 4 and Onwards

I have spent a few days on and off stream rating jam entries and further updating the game to work out some of the kinks. One major issue with the game is that during its development I completely forgot that different keyboards can register different number of keys at once, known as rollover. My keyboard can handle at least 4 keys at once, however this seems less than common, a lot of the reviewers could do no more than 3 keys. One thought I had was maybe I could transpose the core game mechanic from keyboard input to controller input.

There was also a bug in the entry-version of the game where reps wouldn’t always increase. This, it turned out, annoyingly, was a fairly simple fix and could have been fixed pre-submission had I realised, though to be honest the fix is one of those situations where I can’t see why the original code didn’t work and am still slightly perplexed as to why it is now working. I had to move the rep increase out to its own if statement, rather than being nested under the end of step check. I don’t understand it as I’m pretty sure both blocks of code execute every time the function is called so the nesting shouldn’t really have changed anything but at least it works now.

I have since fixed this and a few other issues. I was also able to improve the ageing mechanic, allowing players to properly reverse ageing on successful steps AND reps. I also created a 3rd rep calculation. Originally the game had reps_completed (for the current prompt), best reps which would count the best consecutive reps. I then added all_reps_completed. This is essentially a buffer between reps_completed and best_reps, resetting on any failed rep and opening the way to add multiplier based de-aging for long runs of successful reps.

I have been pleasantly surprised by the feedback to this game, generally much more supportive than for previous entries while still pointing out flaws and suggesting improvements.

The game is now in a sort of limbo state. I have converted the core loop to work using controllers, with the structure in place to display different prompts depending on the controller you use. Prompt generation is a little broken as I tried to tweak some stuff but this shouldn’t be too hard to fix, however ultimately if development were to continue too much further I feel like music and better sound effects would be needed and this would probably require an additional update to prompt generation to take music tempo into account. I made the game work on a frame basis, feeling like this would be the simpler mechanic to evaluate than time based but this causes problems if the game engine hitches and as such I feel like I will have to work on moving the game back to a time-based evaluation.

Conclusion

Overall I’m quite happy with this entry. I’ve wanted to make a rhythm game for several game jams and have always chickened out, I feel it came out quite well, the reviews seem generally very positive despite the rough edges. Ultimately I do feel like there could be a future for this game. To make an actual game there would be much more to do around user feedback, such as adding lights/FX to show good/bad prompt timing, have the player and demon respond to negative and positive timings respectively. It would require the addition of music, a tweak to the prompt generation to get the timing of the exercise steps on the beat of any specific track of music and a massive overhaul to the graphics/UI but if people would be interested I’d be more than happy to work on a future implementation of the game.

If you would like to play or rate the game feel free:

Submission page

Game page

If you would like to check out any of the streams for this game entry or the ratings please head to https://twitch.tv/DrentsoftGames to catch the VODs. Failing that, all the streams were restreamed to YouTube with copies from Twitch also uploaded there so if you want to take your time with re-watching, consider heading over to YouTube. Finally if you like what I’m doing, feel free to hop on the Drentsoft Game Discord and say hi, maybe we can playtest my upcoming tabletop card game A Taste for the King.

Support This Site

If you enjoyed this content consider giving a tip on Ko-fi to help us keep producing content alongside our products.

You may also like...