Archive for March, 2011

Date: March 30th, 2011
Cate: development
7 msgs

Card Shark

Atom Zombie Smasher was recently released on Steam.  As a result of that, my backlog of feature requests and bug reports has shot up by a bajoolion percent.  I thought I’d take a minute to breathe and talk about how I handled task management.

This picture shows the ancient technique used on Flotilla and Air Forte: index cards and a pink tissue box.

What powers this infernal machine? Here’s how it works:

  • When I think of a new task or notice a bug, I write it on an index card. Example: “Make walk animation.”
  • The card is placed next to its friends on my heater.
  • When I need something to do, I take a look and decide which card to tackle.
  • When I complete the task, I toss it into the tissue box.


That’s it. You might be thinking, “Wait a minute! That’s nothing more than a to-do list. I’ve been hoodwinked!”  To which I answer: you’re not that far off.  Though, I did end up ultimately preferring the index cards over a traditional list, for reasons I’ll get into later.

For reference’s sake, here’s the size of the final deck from Flotilla:

For those playing at home: the top card reads, “Only start skirmish if all players have ships.”  At some point, Flotilla had a bug where a player could start a skirmish battle with no ships in his fleet. This resulted in extremely brief battles.

(For Lean and Agile development fans: if you squint really, really, really hard, you’ll find this was all very loosely inspired by the Kanban board technique, which we used to great effect at Pandemic. If you have a medium-to-big team, do investigate it.)

The Age of Notepad.exe

For Atom Zombie Smasher, I decided to go a different direction and used notepad.exe to keep track of all my tasks.  Here’s how that text file ended up: click here to read it

I wrote tasks down, and when I completed them I appended “XXXXXX” in front of them; the equivalent of throwing them into the tissue box.  I assumed it would be a 21st century digital version of my index cards. But I felt it didn’t work out nearly as well.

For one, just take a look at the file.  It looks like someone barfed out letter soup.  There are code snippets, crash logs, half-baked sentences.  I fell prey to using this file as a junk drawer.

On Analog

Something has to be said about analog vs. digital.  I was fortunate to have once edited a film project on a musty old Moviola flatbed machine.  By this time, digital editing was the norm, so getting to use this ancient analog metal beast was a rare treat.

The room smelled like wet dog and sawdust. Absolutely everything was time-consuming.  And I loved it.  I loved splicing the film and threading it through the tiny wheels.  What I loved most was that it forced you to think about every decision.  Are you sure you want to make that cut?  Making a splice takes time.  I think what you really want is to move the cut there instead.

That cut was probably also a wrong decision, but damn did it force you learn the hard way.  You had to make sure something was worth your time.

That thoughtfulness was what my .txt file lacked.  It was too effortless to throw random crap into it.  As a result, its signal to noise ratio was  terrible. When I needed to find a new task, I had to wade through a lot of things that honestly shouldn’t even be there.  Granted, this is probably just my own shortcoming; I’m sure you’ll fare much better!

Distinguishing features I liked about having index cards:

  • It’s a physical object. When the index cards start snaking their way across my living room floor, I immediately know something has gone awry.
  • I find it easier to visualize the relationship between all the cards – dependencies, importance, etc. It encourages you to touch ’em & move ’em around.
  • It’s surprisingly effective at rooting out the stupid. Taking the time to uncap a pen and write on a card requires just enough commitment to block out most half-baked ideas.


And really – the ritual of throwing a completed index card into a pink tissue box is way more satisfying than it should be.

Date: March 29th, 2011
Cate: patch
Comments Off on Atom Zombie Smasher v1.71 patch

Atom Zombie Smasher v1.71 patch

The v1.71 patch is out!  Full changelog:

– Gameplay: level-4 outbreaks now constantly spread to neighbors.
– Mods: added parameter to control level-4 spreading (GAME_ASSAULTSPREAD 1)
– Mods: added parameter for merc button UI. (UI_CONTROLBOX_BUTTONS 8 )
– Mods: added parameter for determining assault levels. (GAME_ASSAULTTHRESHOLD 1)
– Mods: added parameters for more scientist levels. (SCIPOP_LVL4 – SCIPOP_LVL10)
– Mods: added parameter for minimum park size. (PARK_MINSIZE 2)
– Mods: infantry color now affects selector UI.
– Mods: periods now allowed in mod names.
– Debug: ctrl+shift+z to depopulate a territory.
– Performance: faster sniper overlay rendering.
– Fix: fixed force_noquarter parameter.
– Fix: fixed bug where Continue button overlapped Merc button.
– Fix: crash when no profiles are available.

Steam version is now live.
Non-steam version:


Date: March 23rd, 2011
Cate: development
Comments Off on On Vignettes

On Vignettes

Last night I opened my email inbox and found a message from a fella named Jeff Shyluk:

[…] Speaking of vignettes, because I am so pleased with the patch, I drew up a special one to thank you for your hard work and dedication to quickly patching up AZS!

I love it! And despite Jeff having never seen a picture of me, he has captured my chin with an eerie level of accuracy. Check out more of Jeff’s work at his blog.

So today I thought I’d write a bit on the vignette sequences. The vignettes use the conventions of a comic book to convey story & information to the player. For those who have no idea what I’m talking about, the first few seconds of this video display a vignette in Atom Zombie Smasher.

Initially, I was leery at putting them into the game. Any time the player is not interacting with the game, I get a bit nervous. Why am I watching this dialogue sequence in this video game? If I want to sit still and watch people talk, why am I not doing that in a media better suited for that, such as film or literature? Why am I being forced to watch this… thing?

Ultimately, I have no defense for that. I enjoyed making the vignettes, and that’s the main reason why they’re included.

The vignette system was first created for use in my game Air Forte. You can see a brief clip of one of Air Forte’s vignettes in this video. The system is very basic. First, I drew one “page” of the vignette.  Here’s the first page:

Then, in the game, a virtual “camera” zooms into a panel. After a set time (or when the player presses a button), the camera swoops over to the next panel, mimicking the human eye reading comic strip panels. Text was displayed during runtime, letting me do little tricks like integrating the player’s name into the panels. (Also note some panels are empty. In Air Forte, the player can choose the appearance of their player character. Riffing off that, I inserted an image of the player character into these blank panels)

When it came time to make Atom Zombie Smasher, I expanded the vignette system. First of all, vignettes no longer had to be one enormous image. Vignettes were now composed of any arbitrary amount of images stitched together. For example, this vignette of Mr. Tabajaras and his grandparents is composed of three separate images: the empty sheet (green), the hero image (yellow), and the panel filler (red).

Doing this A) dramatically reduced the amount of work required, B) reduced loading time, and C) reduced the game’s file size. In the old Air Forte system, I would’ve needed to create a new master image for each of Atom Zombie Smasher’s 30+ vignettes. This is especially irksome when two vignettes are almost but not quite perfectly identical.

The weakness of this stitching system is that I still think the Air Forte’s results were better. I love Air Forte’s spilling over of the hero images, non-square-shaped panels – all of these custom touches are achievable in AZS, but would require a fair bit of more additional functionality.

The change I was most happy with: AZS vignettes are data-driven. The Air Forte vignettes were hard-coded in the executable, whereas AZS stores the vignette data in simple text files. The vignette data for the above AZS example can be read here. The first few lines describe the image positions, and the bracketed blocks describe the panels – how long to linger on the panel, how far to zoom in, what text to display, and so on. To help me out, I wrote a debug tool, “BlendoComic,” that can fine tune the values on-the-fly (press ctrl+F11 to see the debug tools).

I’d love to see someone make their own vignette – poke around AZS’s content folders and try your hand at one!

Update: learn about the technical nuts & bolts of vignettes here.



Date: March 20th, 2011
Cate: patch
1 msg

Atom Zombie Smasher v1.65 patch

Version 1.65 is chock-full of updatey goodness. Full changelog:

  • Fix: bad framerate bug.
  • Gameplay: barricades no longer required for mission start.
  • Gameplay: remove Cabin Milestone if Party Wagon is active.
  • Gameplay: plus/minus key can now be held.
  • Fileshare: mod listing is now faster.
  • Mod menu: mod listing is now faster.
  • Mod parameter: Scientist starting amount (SCI_STARTINGAMOUNT 0)
  • Mod parameter: Lvl-4 alternate spawning (ALTERNATE_SPAWN_EPIDEMIC 32)
  • Mod parameter: more city populations (CITYPOP_LVL5 – CITYPOP_LVL10)
  • Mod parameter: min. building size for snipers (SNIPER_MINBUILDINGSIZE 2)
  • Achievements: fixed Tactical Camelid.
  • Achievements: fixed stat accruement.
  • Report-a-bug: now accepts question marks.
  • Debug: press ctrl+x to complete mission.
  • Debug: added Steam stat viewer.
  • Fix: better performance in worldmap screen.
  • Fix: crash in tile rendering.
  • Fix: crash in dictionary accessing.
  • Fix: crash in bird audio.
  • Fix: crash in modded building heights.
  • Fix: fixed hang when home territory is taken.
  • Fix: fixed bug where people got stuck in barricades.
  • Fix: fixed mixup between Alt. Spawning & No Quarter.


Click here to grab the patch. Expect the Steam version to go live soon.

Date: March 16th, 2011
Cate: atom zombie smasher, development
6 msgs

The Locksmith

By now, everyone who bought Atom Zombie Smasher from should now have received an email with a free key for the Steam version of the game (and if not, email me at and I’ll sort it out). Getting these keys to these people was a bit more involved than I expected, so I thought I’d write about it.

Here’s what I had:

  • A long list of email addresses of people who purchased Atom Zombie Smasher from
  • A long list of Steam codes for Atom Zombie Smasher.


The goal was to send one Steam code to each email address.  I began with making a spreadsheet: Column A had Steam codes, Column B had email addresses. I exported this spreadsheet to the .CSV format, which is a basic text file.

I now had a simple, machine-readable .CSV file with Steam codes & email addresses. I then wrote a quick C# program, “KeySender,” that read the .CSV file and emailed a Steam code to each address.

KeySender took very little time to write.  It was very basic in functionality and cannibalized enormous chunks of code from Atom Zombie Smasher, notably the Report-a-bug feature (to send emails) and the the text file parser (that reads mod files, vignette files, etc).

After a few test runs with dummy info, I plugged all the customer data into KeySender and hit the “Go” button. And off it went.  It was working very diligently, shooting emails with all the pep and vigor of a cold, emotionless robot.  Its little progress counter ticked up, up, up…

And then KeySender started barfing.

KeySender now hurled out error messages about failing to send the email message, over and over again.  I shut it all down and took a look into KeySender’s innards.  I couldn’t find anything wrong with it.  No, the root cause was something more sinister: my email host flagged me as a spammer.

I use Gmail for my correspondence.  After some digging around, I discovered Gmail has a safeguard that limits how much email you can send in a given time frame. And if you breach that limit, you are locked out of your email account for 24 hours!

And so, my beloved KeySender, with its cursed efficiency, barred me from my own blendogames email account for 24 hours. Oh KeySender, you rascal.

So, next time I do this I’ll have to find another method. Before making KeySender, I was at first thinking of making a web page where the user would input their order data to receive their Steam code. But, I disliked forcing people to dig through their email history, find their order data, punch the data into a website – that’s the opposite of a smooth experience. Secondly, the only way of making absolutely sure all these people get contacted is through their email addresses, so I would’ve been in the same 24-hour-send-limit boat either way.

Anyway, in closing: I forgive you, KeySender.


Date: March 15th, 2011
Cate: patch
Comments Off on Atom Zombie Smasher v1.62 patch

Atom Zombie Smasher v1.62 patch

Version 1.62 patch is done! Here’s the goods:

  • Gameplay: fixed random sorting for mercenary selection.
  • Camera: map now scrolls when mouse cursor is at screen edge.
  • Video: added option for v-sync.
  • Video: added commandline for framerate limit ( -framerate 60 )
  • Debug: press ctrl+x to skip to next month.
  • Achievements: fixed Champion of the People, Worm Has Turned
  • Fix: fixed crash in vignette file parsing.
  • Fix: fixed crash in bird rendering.
  • Fix: fixed crash with invalid characters in profile name.
  • Fix: fixed crash in Zed Bait audio.
  • Fix: fixed crash in Filemanager sort-by-date/name.

    Download the patch: click me!

    The Steam version of the patch is in the works and will be done soon.

    Date: March 14th, 2011
    Cate: atom zombie smasher
    2 msgs

    Atom Zombie Smasher released on Steam

    Atom Zombie Smasher is now available on Steam!  Here’s the link to its Steam page:

    The Steam version is bundled with both the PC and Mac version, and is complete with a bevy of Steam Achievements to grapple and grope with.  And that’s not all!  In addition to a lower price, there’s also an extra discount – for one week Atom Zombie Smasher is only $8.99 on Steam.

    So what are you waiting for?  There are zombies demanding to be smashed.

    Date: March 9th, 2011
    Cate: atom zombie smasher, development
    6 msgs

    Bug Hunt

    A couple days ago I released a patch for Atom Zombie Smasher that fixed a rather nasty bug.  Tracking down and resolving this bug was a fairly long ordeal, so I thought I’d share a bit on how I handle QA as a one-man team.

    First of all, a bit of history. When I was working at Pandemic, we had a sizeable QA team.  As new features and levels trickled in, QA would comb over them and try their damnedest to break the game in every obscure way possible.  One of my tasks as a designer was to make the tutorial levels, so I tended to receive extra helpings of “how is that even possible?” special-case bugs.

    Something particularly effective was when QA was integrated into our DLC development.  Basically, QA began QA’ing starting from day one of DLC development, and were seated amongst the designers & artists. This resulted in extremely fluid communication, not just from immediate face-to-face talking, but by sheer osmosis of everyone being seated in the same aisle.  These simple changes helped make this my favorite development experience at Pandemic, in which we produced a high-quality package ahead of schedule while keeping the bug count absurdly low.

    (And QA had the best usernames during multiplayer playtests. I’m looking at you, LindsayRohan and LorenaHobbit.)

    I’ve since started Blendo Games, where I’m now a one-man team.  I wear the designer hat, programmer hat, artist hat – whatever hat you got, I’ve worn it.  From my previous hobby projects, I’ve learned doing QA by yourself is A) silly, and B) doomed to fail.  Once a game was released “into the wild,” it amazed me how quickly people found ways to twist and break everything.

    And that got me thinking: the general public has an uncanny knack for finding the rarest of bugs, so why not leverage that?  Here’s how I implemented it:

    • Report-a-crash: when a crash occurs, the game sends me an email.  The email details the call stack, giving me a reference point for where to start looking in my code.
    • Report-a-bug: users can write and send me a quick message, accessible via the pause menu. The point of this is to make communication as frictionless as possible. (The flipside of this is forcing the user to quit or alt-tab out of the game, find my email address, fire up the email client, get sidetracked by other emails, etc.  By the time I do all that, I’ve already gotten distracted by something shiny outside my porch window.)


    It’s not a new idea, but it was new to me!  I gave it a trial run in Flotilla.  I was leery as to whether people would actually take the time to use the Report-a-bug, but I was taken aback: I got a lot of helpful feedback from a lot of people.

    Example!  Here’s a Flotilla Report-a-bug message from a helpful stranger:





    It has worked well.  I get bug and crash reports, and within a few hours I’m usually able to release a patch that fixes them.  I’ve since continued to use this user-driven system for Air Forte and Atom Zombie Smasher, adding incremental improvements here and there (for one, it now uses normal normal sentence case, so it no longer looks like PEOPLE ARE ALWAYS SHOUTING AT ME).

    Which takes me back to the beginning of all this: that one particularly nasty bug in Atom Zombie Smasher.  Since AZS was first released, I’ve been getting crash reports relating to the Zed Bait, a weapon used in the game.  The crash message’s call stack gave me a general location of where to look, but was vague as to specifics.  It’s one thing to know that a bug is happening, but I had no steps as to how to reproduce this bug on my machine.

    So, I made a robot.  By that, I mean I wrote a very basic component that allowed the game to autonomously play itself.  Because my robot was never meant for public consumption, it’s plainly named “StressTester.”  The point of StressTester is to bang on one game feature over and over again for hours on end. Here’s the StressTester routine for finding the Zed Bait crash:

    • Create a new city.
    • Place a Zed Bait.
    • Wait 10 seconds and place another Zed Bait.
    • When the victory/defeat screen appears, return to step 1.


    I activated StressTester and went to bed.  Next morning, I awoke and discovered StressTester had gained self-awareness. It asked, “do you want to play a game of thermonuclear war?”

    I misspoke, that didn’t happen.  I awoke next morning and found the game had successfully crashed.  I now knew exactly what line of code the game was crashing on and in a couple minutes I fixed the problem.  Done and done.

    Yes, StressTester was successful in that it led me to the crash solution.  But, it fails in that I have no idea what specific steps StressTester took to get to that crash.  StressTester has no concept of what it’s doing, it just blindly taps buttons. As a result, I still have no idea how to reproduce that bug.

    Nope, you need warm human beings for that, specifically folks trained for QA.  In the meantime I’ll make due with what I got!


    Date: March 7th, 2011
    Cate: atom zombie smasher
    3 msgs

    Atom Zombie Smasher: Steam release date

    Save the date! Atom Zombie Smasher will be released on Steam next Monday, on March 14.  Anyone who has already purchased Atom Zombie Smasher from can expect to receive a free download key for the Steam version.

    I’ve spent the past few weeks adding Steam achievements to the build.  There’s a number of them that should be rather challenging. And by that, I mean, I’d be surprised if anyone manages to unlock all of them.  I’m quite happy with how the entire game is looking right now – a huge thanks to everyone who has sent in feedback and bug reports!

    Date: March 6th, 2011
    Cate: atom zombie smasher, patch
    1 msg

    Atom Zombie Smasher v1.6 patch

    New v1.6 patch released! Full changelog:

    • Mods: added population parameter for level-4 outbreaks (CITYPOP_LVL4).
    • Mods: creating mod now grabs latest online mod data.
    • Performance: optimized barricade rendering.
    • Fileshare: allow sorting only when done loading data.
    • File mgr: added Rename button.
    • File mgr: label bad/corrupt files.
    • Fix: fixed crash in zed bait.
    • Fix: fixed crash in territory scoring.


    Be the first on your block to get the patch.