Ludum Dare: The Game Post-mortem

This time around I entered the compo division and decided to spend my 48-hour LD making a game about...making a game in 48 hours for LD. So meta! xD It's lightly inspired by Game Dev Story, but certainly has its own unique spin on things.

I came up with a couple of other ideas for the "One Room" theme, including some sort of game where you need to tetris-pack furniture pieces into a gridded room, but the LD game seemed particularly exciting to me and I was already coming up with a bunch of ideas that I wanted to implement for it, so it was a no-brainer that I should run with it. It was a relatively obvious play on the theme -- I mean, there I was in my room thinking "Hmm...if there's only one room, what kind of room could it be? ...oh, what about the one I'm literally in right now?"...but even so, I decided that I should just go with it and not overthink things too much.

Overall I'm really happy with how the game turned out! It's a completely new style of game for me and is heavily UI-focused -- you play the game using your mouse only, which I've never done for LD before! Getting to branch out and try something new was pretty fun, and although I definitely ran into some troubles and rough spots (more on that later), everything turned out alright in the end. I also managed to achieve my goals for this LD, which were pretty simple -- to take care of myself, do a good job, and have fun!

As always, let's take a look over what went well and what didn't go as well.

What went well

Game idea

The "LD game" game idea was one of the first main ones that I came up with and even before I had settled on it my mind was already buzzing with different interesting ideas that I wanted to incorporate. Sometimes you get a good idea and you just feel great about it! There are actually a ton of unused ideas that I would have loved to include but didn't have time to implement, including:

As a result of me being so hyped about the game idea, I actually did a record-breaking amount of work on Friday night. Usually I spend Friday night purely on brainstorming as well as setting up a basic project and then going to bed, but this time around I kept chugging along until pretty late in the night doing artwork and implementing things. Here's what I had at the end of Friday night already:

While none of the actual gameplay is there, the basic room is already fully drawn, the dialogs are working, and all of the basic tech is in place! That's pretty good for Friday night!

Unity (specifically, coroutines and UI implementation)

Holy cow, I would NOT have been able to pull off this game using my old Haxe toolchain. This was my first time using Unity for a solo compo entry, and it overperformed again! For this game I needed to create a whole bunch of different UI dialogs, complete with word-wrapping, 9-slice background images, etc. and doing all of that programatically would have been a legitimate nightmare -- having to deal with a full compile cycle every time I wanted to tweak the positioning of a UI element would just take way too long. Thankfully the Unity 5 UI system worked out really nicely and I was able to just place everything using my visual editor. Whee!

I also made =extensive= use of coroutines, which are basically a way for you to have a function yield and execute across multiple frames. A lot of the flows in my game were time-based, so it made much more sense to write something like:

// Displays a dialog box, then waits until it closes.
yield return DialogBox.Show("Starting a new atcion!");
// Start playing sounds, etc.
...
// Wait for 5 seconds until action completes.
yield return new WaitForSeconds(5.0f);
// Show results, then wait until results display is closed.
yield return ResultsBox.Show(
 "I finished!",
 new[] { string.Format("+{0} Art", art) },
 new[] { "icon_art" }
);
// Cleanup, stop playing sounds, etc.
...

There was a little bit of trickiness around making sure that there were no messy interactions between different flows (I used simple locks to guarantee that only one dialog sequence could be showing at a time), and making sure that you could interrupt a flow if you decided to start a different action (in that case, I needed to ensure that we still did the appropriate cleanup for the old action, stopped playing any action-related sounds, etc.).

One thing I did miss slightly was the ability to get return values from coroutines. I had a common case in my game where I needed to show some sort of selection UI, such as picking between two choices, or selecting a new action to do, and it would have been nice to write:

// Yield on a coroutine that returns an int value.
var myCoroutine = StartCoroutine(ChoiceBox.Show("Which thing should I do?", "Do this thing", "Do that other thing"));
yield return myCoroutine.coroutine;
// Use the int value for something.
int selectedChoice = myCoroutine.returnValue;

While you can't do this out-of-the-box with Unity, you can write your own coroutine extension methods that will allow you to achieve the same thing. There are several different proposed extensions, and I've actually used this particular one before to achieve exactly what I described above, but unfortunately I just didn't have that tech set up and I couldn't be bothered to re-implement it again during the compo. Instead I had a rather janky approach where I passed in an anonymous lambda method into the coroutine which it would invoke with the return value:

// Pass anonymous method to set selectedChoice to either 0 or 1.
int selectedChoice = -1;
yield return ChoiceBox.Show("What thing should I do?", "Do this thing", "Do that other thing", {val => selectedChoice = val; });
// Use the int value for something.
...

This is a bit uglier, but works just fine in practice.

Overall gameplay

While there are a bunch of things I'm not quite as happy with about the gameplay (more on that later) and a bunch of things that I didn't have time to implement, the gameplay and content of the game turned out to be pretty fun overall despite its rough edges, and the feedback that I've received so far indicates that people are having a good time with it. I think the main thing is that it's just FUN to think about trying to manage your time by doing these different things and seeing the results that happen. When you first start playing the game you don't really know in advance what kinds of benefits or disadvantages each action has, but I think that's sort of the fun itself in that you're sort of exploring the different options available to you. This also gives the game a bit more replay value as when you play it a second time you've got a better handle on what needs to be done and what options are important.

I also learned my lesson from Grow Your Love (which was way too punishing with its grading) and ended up with a completion/grading scale that I think people will have an easier time with. It's always hard to balance your own games because you're always the foremost expert on them and as such have such a huge leg up on everybody else, but I came up with the "requirements" system that would serve as a rough difficulty adjuster, and then made it so that you could aim for a higher overall score on subsequent playthroughs.

In the beginning I had this hastily-thrown-together algorithm that would calculate your final overall score and just spit out a number with absolutely no explanation, and one of the features I decided to spend my last precious hours working on was the detailed scoring breakdown, along with revamping the scoring system itself. This was WELL worth it, as being transparent about how you're actually graded means the player actually understands why they received the rating they did and allows them to know what to change during their next playthrough. Plus it's just fun to be given a detailed report on your actions :). A lot of key changes like this happened during the later part of the compo and I'm really glad they made it in.

Artwork

While pretty much all of the artwork for the game was static (I had noooo time to put in fancy animations), I'm actually pretty happy with how the room came out, and had quite a bit of fun drawing it as well. This is probably the most intense pixeling I've done for LD (art is definitely my weakest area), and I'm happy with how the game came together stylistically. I used a few different references for the room graphics, including random pixel art rooms that I found via google, as well as Earthbound / Undertale graphics. The dialog box visuals also fit very well, as did the font that I chose.

Random names, comments, and the "refresh page" joke

One of the funnest parts of the entire creation process was developing the random game name generator, which can come up with hilarious titles such as "Tabla Hero", "Retroidvania Maker", and "Bullet Hell: Championship Edition". The generator isn't actually that complicated, as I didn't have time to make anything fancy -- it just selects from a random bank of prefixes and a random bank of suffixes and puts the two together.

Here are the prefix/suffix lists for the Rhythm Game genre, for example:

prefixes = new[] { "Bongo", "Tabla", "Dubstep", "Chiptune", "Bagpipe" };
suffixes = new[] { " Hero", " Band", " Karaoke", " Idol", " Raver" };

So you can have "Bongo Band", "Dubstep Idol", "Bagpipe Hero", and so on and so forth.

The random theme selection is a little more simple, as I just put in a list of all of the themes from the theme voting rounds for LD37 and have it randomly pick one.

The randomized comments were also fun to make, and I think add a nice touch to the final scoring. All of the comments are pre-written, but the game selects different ones to give you based on your ratings in each of the categories. Also, you get more comments if you have a better community rating (mostly from posting to the LD blog).

Finally, the "refresh page" theme announcement joke at the beginning of the game is something I just knew I wanted to have, as it's (funnily enough) such a consistent and iconic part of LD. So that made it into the game pretty early on.

Posting animated GIFs

Lastly, this is a minor point, but I have to say that posting progress updates got a lot more fun now that I can capture animated GIFs and post those as well. I'm using ScreenToGif for this at the moment and it's been working well!

What didn't go as well:

Gameplay balancing

Thankfully, I managed to do an initial rework of the gameplay balance and tweaked a lot of the numbers during that pass. Some changes I made that got into the final game:

These changes did a lot to clean up the overall gameplay. However, even after all of these changes, the game could probably still use some rebalancing. Some issues off the top of my head:

Gameplay format (?)

This one is a bit more nebulous, but at the end of Saturday I was really concerned about the direction that I had taken with the gameplay, as it didn't really seem very interesting at all. You just chose the actions that corresponded to your requirements, consistently got points (remember, there were no variations yet), and did the corresponding "need" action whenever your need levels were low. There wasn't a lot of strategy, nor was there a lot of real decision-making. More importantly, there just wasn't much zany action going on!

In the end I managed to salvage things by at least adding some interesting choices such as the variants mentioned above (which I added for coding, art, music, and design), as well as adding some more "fun" actions such as bouncing on the bed and meditating. But I wonder if it would have been better to focus more on the "storytelling" aspect of the game rather than on the strategy / time-management aspect, especially given that the time-management aspect didn't involve that many decisions (maybe it would be different if you had to play minigames for the different actions??).

So I wonder if it would have been a better call if I had come up with an experience that was a little more scripted instead. Something akin to a visual novel, perhaps, with randomized events pulled from a large set. Each choice you made would still affect your games' stats, but instead of becoming a game about looking at numbers it would be more of an interesting story with zany things happening. You'd have less control as the player, but as the creator of the game I'd be able to ensure that you experienced many more different events. It would play out similar to a choose-your-own-adventure story, I guess. Again, I'm not entirely sure that would have worked out better and by the time I was considering this option seriously I decided that it was unfortunately too late to really make that design chance.

Minor Unity audio issues

This is a really small silly one that I already knew about, but still annoys me so I'm still writing it here.

The current build of Unity has an issue with WebGL builds such that the beginning part of every sound is cut off when played back. The result is that the start of each sound sounds a little different (noticeable especially for the kick drums in the intro sequence, and the text dialog sounds), and more importantly, seamless music looping doesn't work because there's a gap. I haven't tried every possible compression type, but I DO know that making your build with an OSX machine instead of Unity on Windows does fix the issue. So it's just a platform-specific bug with the Unity build process that hasn't gotten fixed yet. Luckily I have an OSX laptop so I was able to replace the build after the fact, but this still annoys me. I'll have to file a bug report for this at some point to make sure it gets fixed.

Edit: As of now the audio bug actually exists regardless of your compilation platform =(

There was also a minor issue with a small pop/crackle effect that occurred at the end of sample playback, which was especially noticable with the text dialog sounds since I was playing so many of them each second (resulting in a buzzing noise when they all ended). Again, minor stupid things, but just annoying.

Overall this entry was a blast to make and I hope you guys enjoy it too! I don't have plans for a post-compo version, as I think I like the game enough as it stands. But thanks for reading through my detailed post-mortem!

One last note: the soundtrack for the game is also available to download for free on my Bandcamp site at https://ddrkirbyisq.bandcamp.com/album/ludum-dare-the-game-original-soundtrack. Go grab it now! :D

<< Back to "Ludum Dare: The Game"