Boiler Room Defense: A much too long and detailed Post Mortem

So I've written a detailed Post-mortem for my LD40 game that I wanted to share. Sorry for the verbosity ;)

After I had made a fairly successful game in Ludum Dare 38 , I have been dreaming of maybe, just maybe, I might be able to reach the top 100 one day.

Apart from that long-term goal, I had some things I wanted to achieve: - make an atmospheric orchestral soundtrack using the knowledge from the piano lessions I had been taking for about a year now - record voice work (possibly a narrator since I suck at acting) - make a game that is more unique than anything I had done before.

Now let's see how that played out.

Preparation

Normally my family is kind enough to plan a weekend trip during LD. However this time it wasn't possible, so we had to find a way to allow me to work without interruptions because I get distracted easily with people around me. It wasn't ideal but I'm happy that they give me the time to do this once or twice a year.

I did my grocery shopping the day before and made sure all my tools work (midi keyboard, Wacom, GameMaker, etc.) I also prepared some boilerplate code (https://github.com/Cerno-b/gamemakerstartupproject) that had some useful routines in place (controller support, generic title screen, etc.) Before going to bed, I read all the theme candidates and picked one as an exercise to see what kind of game I would make out of it (it was A Single Resource).

Day 1

6:00

After waking up, my initial feelings about the choice of theme were mixed. I had given it a +1 in round 3 but a 0 in the final round. It is a very good theme because it is neither too specific nor too vague, but I struggled with an idea that would lend itself to my goals.

I knew from the start that I didn't want to make a game with the concept of "collect x and the game gets faster/harder". I also didn't want to equate "worse" with "more boring", as in "the game gets slower as you progress", as I thought I might struggle with making it fun to play.

Some early concepts fell by the wayside:

  • A "Choose your own adventure" game about getting infinite wishes from a genie. You make choices for your next wish, but every wish gets corrupted. You have to outsmart the genie and use his wishes against him. Perfect for narration, but I was afraid it would be too ambitious for my writing skills
  • A Runner game where coins you collect increase the speed (but give no other benefits). When you collect coin magnets, chaos ensues. Procedurally generated terrain. Didn't make it because the premise was too simple.
  • You control a biological organism that grows appendices which let you fight off waves of attackers. You attack using keyboard keys. Each appendix is controlled by a different keyboard key (the fun starts at more than 10 appendices).
  • You can inject yourself with a brain-growing drug, but your head will get larger and larger so your character will get more and more top-heavy and harder to control.

After two hours of brain-racking I decided on the idea of having bullets stick to the wall so that you have to be careful about not missing your opponents. Clearly I had to give up on my original plan of using an orchestral score for that idea.

8:00

Although I had some boilerplate Game Maker code ready in advance, I struggled with a few things before I got into the flow again (the with/self/other mechanics are kind of unintuitive to me). I stumbled upon the suggestion to increase the frame rate from 30 to 60 in GameMaker and it made a huge difference.

prototype_0.gif

9:30

Soon I got into the flow and made good progress on the game mechanics. Previous experience on steering behavior accelerated the process a lot (reading tip: https://www.red3d.com/cwr/steer/gdc99/).

11:30

Originally I wanted a classic 3 lives setting where an enemy or wall hit would cost you one life. That posed a number of problems though: First, the game was too chaotic for this to be fair and I didn't want to slow it down too much. Also it took too long for the walls to accumulate enough shots to be an actual threat, which would defeat the core idea and go against the theme too much.

So I decided to make the player invincible to enemies but die immediately when crashing into the walls. To make it more interesting, I had the walls grow each time you are hit by an enemy:

prototype_01.gif

12:00

I wanted to increase the difficulty based on how many shots had accumulated on the walls, so I spawned a number of flies based on the number of shots on the walls after each wave. I only had to change the parameters of the steering code I already had in place and was ready to go:

prototype_03.gif

13:00

Next, I wanted to add some powerups because they are a staple in shmup games. But with the shots sticking to the wall I wanted the powerups to be a blessing and a curse, allowing the player to defeat enemies faster (and thus preventing the wall-shots from growing) but at the same time increasing the risk of collecting more shots on the walls.

Since the powerups were a bit of a disadvantage and the player could easily avoid them when they appeared, I wanted to balance this by converting wall-shots to collectibles over time so the player could take the bad powerup but would remove wall-shots from the playing field in the process. After implementing that I quickly realized this idea would not work. First, the player motion was so fast that trying to get close to the wall-shots was too dangerous for a one-life game. And second, new shots would accumulate around the powerups, preventing the player from picking them up at all.

Therefore I modified the idea so that some wall-shots would periodically convert to powerups that drift around the play field. This decision removed the tradeoff between collecting a potentially dangerous upgrade and getting more space so that the player could simply avoid the powerups and gain space for free. I thought about making uncollected powerups return to become wall-shots again, but in the end the game worked well as it was so I scrapped that idea.

With that, I had all main gameplay mechanics in place:

prototype_04.gif

This picture seemed to resonate with a lot of people and it received 25 hearts. I was exhilarated. @random-wizard suggested to use a space setting and make the walls out of ice. At that point I had considered to make this more of an insect/nature setting, because of the flies and such. I thought I would have a hard time to make the game stand out visually as a space shooter, because it's such a well-explored genre. But in the end I stuck with the space/ice idea.

17:00

With all the gameplay mechanics in place and still a lot of time on the clock, I decided to add online leaderboards. It was a cool concept that I hadn't tried before. But more importantly, since the game is open ended, I wanted to add more replay value. After fiddling around with a tutorial on the matter and trying to debug PHP code (a language that I neither like nor know well), it took me almost four hours to get the leaderboards running. It was quite a chunk of time, but I think it was worth it in the end.

The idea of the Game Over screen was a happy accident: I had left the game running before checking the Ludum Dare website and when I returned, I saw my character surrounded by enemies who were pummeling him with attacks. Adding that to the game over screen was fairly simple:

prototype_05.gif

21:30

With the core game mechanics and leaderboards working, I decided to call it a day.

Day 2

06:45

After a very successful and productive first day, it was now time to add graphics and polish. This was my first Ludum Dare where the game was actually completely enjoyable on Day 1 and I had a full second day to make everything pretty.

However, I started to worry. After everything went smoothly on day 1 with a some very positive feedback, I felt the pressure rising. Between the state of the game as it was and my desire to maybe crack the top 100, I was worried that any design decision I made from now on might mess up what I had achieved so far, especially since I still don't feel very confident in my drawing and composing skills.

11:15

It took me 4.5 hours to draw the backdrop. Turned out pretty well I think. I would do the shading later to be able to drop it in case something goes wrong somewhere.

prototype_06.gif

During lunchtime, I refined the visual concept to tie it into the game mechanics: You play a maintenance bot on a spaceship that has to defend itself using a water cannon (for whatever reason). Since space is cold, any missed shots freeze on the wall. Whenever the bot is hit, it loses control over the heating system bit by bit which causes the ice to grow. It sounds a bit far-fetched and a more skilled artist may have communicated this better visually, but here we are. Reading the comments so far I think I completely failed to get this idea across.

Anyway, this is my initial doodle of the bot that I did over lunch:

sketch.png

Turned out that you lose a lot of detail when you have to reduce your drawing to 32x32. Also I changed the design to make the bot match the round hitbox better. The old-school smokestack was a nice touch and I'm still a bit sad I had to get rid of it favor of the more round-ish design.

12:00

Now I had replaced all the placeholder graphics: the bot, the ice, the enemies, the powerups, the rotating cannon mechanic and a prettier version of the start and end backdrop (originally planned as a placeholder but it remained in the game due to time constraints).

final.gif

15:30

Sound effects time. I tried a new generator: Chiptone (http://sfbgames.com/chiptone/). It's pretty neat and I was able to create some cool effects with it. I had problems getting the squish and buzz sounds for the flies right, so I recorded them myself using Reaper. Turned out pretty well I think. I might consider doing more effects that way in the future.

17:00

Now came the issue I had been putting off all the time: Writing the music. I had been listening to some cool chiptune compilations while coding. This collection is highly recommended:

https://www.youtube.com/watch?v=GH7eUlri4yM

Inspired by its awesomeness, I was toying with the idea of doing something similar.

I knew that tools like Modtracker had a steep learning curve, so I looked at tutorials about alternatives. Around this time I completely panicked. Nothing I attempted seemed to be a viable solution. I went from Reaper with Chiptune VSTs to Bosca Ceoil to doing orchestral stuff with Miroslav Philharmonik to actually downloading the FLStudio trial, then back to Chiptune VSTs, and finally ended up falling back to Bosca Ceoil. It took me over two hours fussing about what tool to finally use and another hour to actually write the music. What a waste. It felt much longer than that and was very frustrating. Note to self: Be prepared better in advance and don't try to learn new music tools during the Compo.

20:30

With the music fiasco over, I looked at my list of things to fix/add and realized that I had totally forgotten about actually having a dialog for entering text for the highscores. Unfortunately text processing is not very convenient to pull off in GameMaker, but I found some good example code that helped me get started. Including the previous session, the whole highscore thing cost me about 6 hours. It's a lot, but I felt it was worth it. I learned a lot from that experience and should be able to pull off similar stuff much faster in the future.

22:30

I had everything in place now. At the very least I would be able to ship the game in this state. With the clock winding down I made a list of things that I wanted to put in to improve the whole experience.

From that list, these things made it into the game on time:

  • Shading the pipes in the background room (I messed up and lost some detail on the gauges which I only realized after release)
  • Rotating star backdrop (Something I learned in LD37 and LD38, pretty neat)
  • Simple explosion gfx (I learned that one from Nijman's The Art of Screenshake)
  • Adapting the audio levels in reaper (music was way too low, some sfx were too loud)
  • Game balancing
  • Finding an actual name

These things didn't make it:

  • Fix a memory leak on the game over screen (something to do with destroying a ds_list, but I couldn't figure out where the problem was)
  • A visual cue that shows how the ice is growing when the player gets hit
  • Custom mouse pointer with fixed radius
  • Custom title screen with game logo
  • Screenshake effect and pause frames on enemy death
  • More background animation (moving dials, etc.)
  • Visual effects that make back-and-forth motion of the enemies more logical
  • Fix the font that GameMaker crapped up
  • Controller support

I stopped working on the game at about 02:45 and started packing up and submitting everything with the usual last minute panic. "Is there really going to be an extra submission hour? Did I get the time zone right?" (gets me every time)

In total, I think I spent about 30 hours actually making the game (I always try to sleep 7-8 hours each night despite the crunch).

You can watch the entire process here:

https://www.youtube.com/watch?v=nwfYEpBVX3k

Looking back: What went well, what didn't?

First of all, I made the game, and it turned out pretty well, I think. It took me a lot of work but I'm proud of what I achieved.

Specific achievements I am proud of: I realize that I made a lot of progress over my last four Ludum Dares. I have become better at scoping, at drawing, and I tend to figure out bugs faster. I established a viable workflow from concept to finished product that seems to work well. I can find conceptual solutions to game design problems fairly quickly (writing extensive comments on other games to try and improve some design aspects helped a lot to hone that skill). I've become better at deciding which assets can be omitted or simplified because some details won't matter in the end anyway. Overall I feel like I've come a long way as a game designer, even though I know that I still have a long way ahead.

Area most in need of improvement: Definitely composing. I wanted to write music using a midi keyboard, but ended up placing notes by hand again. A lesson learned is definitely to be prepared for two cases: Atmospheric orchestral music for a calm, moody game and upbeat retro chiptune sounds for arcade games. I might have to learn to use tracker software properly before my next attempt. Looking at the quality of the composition, there was almost no progress there compared to my previous LD.

Biggest regret: I realized that I didn't communicate clearly that the player is invincible to enemies, but that getting hit makes the ice grow instead. I completely forgot to put myself in the shoes of someone who plays the game for the first time, and I messed this up.

What took the longest: Hands down the online leaderboards. It is an important feature and I was willing to pay the price for it, but man, 6 hours is a lot for something that seems such a small part of the game. At least I received some very positive feedback on this part, so it was worth it in the end.

Overall it has been an awesome Ludum Dare for me. Thanks for reading all this and good luck.

Play Boiler Room Defense here!