“Sad Little War-Bot” post mortem

Posted by
December 14th, 2014 5:00 pm

Hello everyone! I wrote Sad Little War-Bot for Ludum Dare 31, and now I would like to talk about the process of creating the game. This is an exercise in reflection, and I hope my good decisions and foolish mistakes can be useful for other developers to know about as well.

I really, really, really love games. I love playing them, I love talking about them, and I love designing them (on paper). Going into the Ludum Dare, I mostly wanted to just stop making excuses and start making games. My “stretch goal”, if you will, was to make something people could enjoy, that expressed some story or emotion that they would find worthwhile.

Pre-Compo Decisions

Despite being good in general-purpose languages (C++, Python), my past attempts to write a game were all eventually shelved. Recently, though, I’d had a lot of success porting games. I recently ported both Iji and An Untitled Story to Linux and OS-X, using the open source game engine ENIGMA. Even though Unity is more industry-standard, C++ is more hardcore, and Haxe is more interesting, I figured “Well, I want to make a game, and I know ENIGMA, so I should probably use that!” And this decisions is the only reason I completed my game.

Themes and Angst

Let’s talk themes! I was not a big fan of the theme when it was announced, because it was second-to-last on my list of pre-compo theme ideas. Some items higher on that list, for reference:

  • Artificial Life, Machines  — I had this idea of a world without humans, where “AI” (advanced robots) look down on “Machines” (human-created robots) because they were only programmed to mimic awareness, while the AIs were actually self-aware. I figured our hero would be a machine who goes on a quest to construct an awareness module.
  • Chaos — I had this idea of a shooter where you could only fire grenades, and enemies would chain-explode.
  • — Based on the games I’ve seen so far, everyone kind of expected this to be the theme, and had some clever snowman-related game up their sleeves. I did too, and it’s a secret! But it involved a snowman boss jumping around an arena.

In the end, I punted on the theme, and just weaved together the three themes listed above to create Sad Little War-Bot. I guess the theme actually helped me, though, as it kept the scope of my game in control.

Time Breakdown

Here’s a timeline of development, compiled from my time-lapse video. There’s also a total breakdown of time spent.

Total Time Spent (top) and Full 48-hour Timeline (bottom)

Total Time Spent (top) and Full 48-hour Timeline (bottom)

I took a lot of small breaks, because maybe I’m getting too old to pull double all-nighters without losing my focus. 😀

Tools

Pretty standard stuff:

Early Design Evolution

Because I was upset at the theme decision, I spent the first hour generating audio. I also imported some fonts, and did some basic game engine setup tasks (plugin selection, etc.). After that, I had my first design chat, and decided to make what is basically a top-down arena shooter. I knew early on that I wanted to integrate the “chaos” theme, because escalating object interactions are pretty easy to do in ENIGMA. At this point, I had the idea: “you are a spy working as a baker who is uncovered by a spy working as a toy maker. Both of you have explosive tools related to your cover jobs”. No robots yet!

Our Hero

Our Hero

 

I started implementing the basic mechanics. I actually had a really hard time implementing collision detection, so it’s a good thing I didn’t decide to make a Zelda-esque game! Instead, I “faked it” (that’s a term the pros use) and then immediately cut from the game anything that relied on precise collision detection and movement. I then moved on to implementing the first weapon (the grenade launcher) and the first enemy (the toy ducks). I originally envisioned multiple weapon and enemy types; the latter actually happened, while the former was cut.

You get the idea...

You get the idea…

At this point, I was really unhappy with my game at a fundamental level. It felt too much like an excuse plot to remake Hyper Princess Pitch. Call it artistic integrity or plain old stubbornness, but I didn’t want to even submit the game if I wasn’t proud of it. So, I reviewed my list of pre-compo ideas, and decided to tell my Machines vs. AIs story, but with a twist: you’d control a robot designed for war that was to be decommissioned, and your only means of defense was an over-the-top grenade launcher. I was significantly happier with this idea, and it also let me shake up the enemy types a bit. I figured the AIs could be using merchandise from various mall shops to attack you in the courtyard. Thus, a toy shop, a gardening shop, and another shop –at the time, I figured some kind of hardware shop that had tiny robots (this eventually became the comic book store). I had the idea that if you killed enemies (rather than, say, them killing themselves with explosions) then you would get a star, and that the north wall of the room would contain vending machines that you could buy health from with stars. I also wanted it to be possible for you to complete the entire game without killing anyone yourself, and that would change the ending. I didn’t have time for the latter, and I removed the vending machines (in favor of the “beam of death”) for another reason, explained in the next section.

Game Design Is Hard!

I am in no way a game design expert, but I try to be diligent. To that end, I’ve been watching Extra Creditz, which I would wholly recommend to anyone looking to design games. Every episode, they talk about how design decisions impact the player in potentially unexpected ways.

So why didn’t I make multiple weapon types? Simple: it gave the player too much choice. I put myself in the shoes of someone playing my game: I would be lucky if they gave me 5 solid minutes of attention (hey, there’s 4,000 games in my LD31 queue!). More weapons meant more controls (e.g., a “switch weapon” button, or a “buy” button for the vending machines), which meant ~1 minute spent learning mundane details. More weapons also meant more potential play-styles, some necessarily better than others. That meant the player could waste ~1 minute playing through a level in a sub-optimal (i.e., “not fun”) play-style. So that’s 2 out of 5 minutes wasted! Instead, I added variety another way, using an idea I borrowed from Super Meat Boy: don’t vary the player, vary the environment (enemy count and lineup, in my case). I think the key here is that I made the right decision for my game at its current level of scope: if I added 100 more levels, I’d probably re-examine weapon customization.

Georgi used to have a mustache.

Georgi used to have a mustache.

The inter-level cut-scenes were another time sink, but I was 100% determined to get them in there. If you’ve played the game, you probably agree: they allow me a few quick lines between each level to establish the motivations of Georgi and Dash, as well as the story of the game world itself. I also wanted a “break” between levels (but I didn’t want a pause button, since it ran counter to the chaos theme) and I wanted to give players something to look forward to after each level. I’m not a writer, but I think I was able to get people to chuckle while still drawing them into the world. Establishing Dash as the antagonist (but not a villain!) was my goal, and it was challenging!

Start! Go!

Start! Go!

As for the complicated “zoom in” level intro, part of that was me just wanting to make something fluid and engaging. But it also served a purpose: it gave a consistent pattern to each level, rather than just dumping the player into the action. This was most important for the first level, but it also built anticipation for the final level (since it seemed that “9” would fit but “10” would not) and then the final boss (the “Oh my goodness, is he actually bringing in the snowman as a boss????” moment). And, it helped you track your progress, like slide numbers on a presentation.

The decision to make grenades explode if they hit other explosions was intentional. It had to do with another decision. One of the design chats brought up the idea of either a cooldown or a limited set of ammunition. This is pretty standard in shooter design, but I was strongly against it. Again, taking the perspective of the player, ammo caps and cooldowns just aren’t fun! In, say, a survival horror game, they serve another purpose, but my game was just a fun, spammy shoot-em-up. At the same time, I didn’t want to make the gameplay too reliant on button mashing. So, I built in this mechanic where your explosions could trigger your own grenades, adding a natural feedback loop that encouraged players to exercise self-control. In the end, some people hated it and some people loved it.

The beam prevents you from shooting the cactus.

The beam prevents you from shooting the cactus.

Let’s talk about cactuses. The insane malefic nature of them served a purpose. In fact, each cardinal direction of the room had a distinct feel to its spawns. In order of creation:

  • East — Mostly harmless. No contact damage; no intentional action against the player. I tended to put them on the top and bottom of the screen in long lines, to encourage players to stay towards the middle.
  • South — Overwhelming but avoidable damage. Takes a long time to build up, then does massive damage. (I got the circle idea from Hammerwatch.)
  • West — Intelligent, focused and deadly. These guys track you, and they can’t accidentally kill each other.
  • North — Pattern-based damage. Easy to exploit, but they block your grenades, so North+West is especially dangerous (level 9).

The “hard mode” is the original mode of the game. I was worried people would be frustrated at dying and wouldn’t complete the game, so I made “easy mode” where every hit deals 1 damage. I still included “hard mode”, because I didn’t want to spoon feed the hardcore gamers who could take the difficulty spike. To unlock hard-mode, just start the game once and quit. The next time, at the title screen, press H for hard.

I specifically made a “cute” enemy the first thing the player sees, so that the player can empathize with Georgi’s intent to avoid harming things, if possible.

I originally planned for 20 levels, but I wanted it to be obvious when you were approaching the last level. Then I planned for 16, because the robot uses hexadecimal and everyone knows that right? (I think I was sleep deprived and delusional at this point.) Then I settled on 9, because only a single digit fit in the level intro scene. (Then I added the snowman boss and custom levels.)

When I was younger, I used to chain-play RPG Maker 2000 games. I just loved how so many people expressed themselves through game design. One thing that I hated from that era was the samey feel that you get when using a game engine. So I tried really hard to add tiny customizations when I could. The neon “Toys” signs, the flashy level intro zoom, the spinning crosshairs, and the overuse of particles were all under this category.

Intuitive!

Intuitive!

The dots that “trace” to your crosshairs were an early design, and intentional. I first had the crosshairs follow the mouse, but found that it pulled the action too far away from Georgi. So then I bounded it to a circle around Georgi, but it was hard to see sometimes with all the explosions. So I added the dots and animated a path to the crosshairs. This really made it clear that the grenades were your primary means of interacting with the world. Many other games have done this kind of thing.

Ow! Ow! Ow!

Ow! Ow! Ow!

I made the damage a “string of numbers” pouring out of Georgi to give the player some idea on how bad the situation was without requiring him or her to look at the health bar, way at the top of the screen. I also played a jarring noise, to try to make it clear “this is bad, step away from the (cactus|duck|laser).”

Final Thoughts

I am extremely proud of the game I made: I was able to finish on time, and it expressed to the people who played it exactly what I wanted to express. Reading the comments, I am overwhelmed by the positive feedback, and I’m so glad that I could make something that people enjoyed playing. And thanks for your constructive comments; you all had some good suggestions for improvement.

In terms of the Ludum Dare, I feel like I budgeted my time well, and was always aware of my limitations. I think I did the best that I could given my current skill set. I will definitely enter the Ludum Dare again. I’d like to focus on tighter mechanics next time, as well as more mood-oriented environments.

Overall, this was a very positive experience for me.

 

Goofs, References, and Pure Luck

That’s it for the main post, thanks for reading this far. Here’s some random trivia:

  • The cacti are named after a character in Wandering Hamster, “The Mad Cacti”, which is also one of the OHRRPGCE’s developers.
  • “Start! Go!” is from Minecraft Bingo. I’m a big Lorgon111 fan.
  • I listened to OC Remixes, the Radiant Historia soundtrack, and the Bravely Default soundtracks while working on this game.
  • I wrote a string parser for each level, so that I could write, say, “W5:S2D:”, which translates internally to “wait 5 ticks and then spawn 2 ducks”. I did this entirely to speed up level development, but when describing it during a design chat, someone thought I was talking about a level editor. Then I thought “huh, I could just read this from a file and allow custom levels”. And voila! Custom levels almost didn’t make it in, because the game would crash upon loading them unless you built in Debug mode. So… I built in Debug mode. But it was down to the wire.
  • I totally lucked out with the OS-X port; ENIGMA can be a bit flaky across different platforms, but it only had a tiny bug on OS-X. I actually did all the development on Linux, so for both Windows and OS-X my thoughts were “well, maybe it’ll work”. Props to the ENIGMA developers: it worked just fine!
  • I had a hard time coming up with the design for Dash (the AI). At some point, someone suggested that Georgi looked like Wall-E, which then motivated Dash’s sleek design (based on EVE, of course).
  • I accidentally deleted the “screenshot” program at 2am on the first day. So my time-lapse, naturally, blips out at that point for an hour or so.
  • I took a ton of small breaks, and this helped me stay sane. Where possible, I had design discussions with various friends so that a break wasn’t entirely wasted. I also lost 2 hours going for a long walk and grabbing dinner, and 1.5 hours with an unplanned nap. I think I had a mini burnout in the middle of the compo.
  • I always tried to keep Georgi and Dash gender-less, but I sometimes slip up and call Georgi “he” and Dash “she”. But canonically, their genders are up for interpretation.
  • I only crashed the game engine once.
  • During one of my meals, I watched an HCBailly Let’s Play episode.

 


Leave a Reply

You must be logged in to post a comment.

[cache: storing page]