Ack! Zombies

Introduction

Ack! Zombies is a project I worked on as part of a five-month culminating project at Full Sail. This is where everything we had spend the last two years studying would all be put to practice. I had a blast making this game, and from the feedback we’ve received from friend, family and even anonymous folks out there on the Internet it turns out we made a pretty gnarly game! :) Out of everything I’ve worked on, this is probably the project I would like to revisit the most.

Direct from our design documents, a basic synopsis of the game is:

“You are Johnny, a typical american student with the daunting task to save Earth from certain brain-eating destruction! Nearly the entire populos of Earth has been converted to one large horde of zombies through some unexplained means. It is up to Johnny to blast his way through swarms of the undead to save the last few remaining people and escape into the cold reaches of space!”

Sounds awesome, doesn’t it? :) Ack! Zombies offers an action-packed adventure full of zombies, creative weapons, and more zombies. So go pickup the game at the website, give it a play, and then I can go into some of the technical details about how it all came together. Go ahead, I’ll wait here…

My Role

For this, the final team project at Full Sail, I was again nominated to serve as the team’s Technical Lead. Using alot of the experience I gained from writing the core engine architecture from StickJitsu! and research projects I had done along the way, I developed a modular and (hopefully) easy to develop with state architecture. To enable the hordes of zombies, I decided it was important to implement a resource manager which would cache asset data wherever possible.

Along with these jobs, I was responsible for writing the graphics engine for the game. Static rendering uses a simple Octree implementation using spanning polygons to eliminate the need for splitting. Additionally, a full shader pipeline was implemented, but was unfortunately pulled at the last minute due to performance issues and lack of time for profiling. The engine also uses skinned animation for all game characters, which is scales according to the hardware the game is being run on.

As far as smaller utility additions to the game, I also wrote the game’s console system and command parser, which powers the cheat system and was used by Jon Zimmer to create the entity placement editor for the game. The most fun I had making this game was writing the particle effects system, and the corresponding editor.

Adventures in Tools Programming

Throughout my time at Full Sail, I had being using C# more and more and became very interested in it’s appeal in quickly and easily creating interfaces for use in game tools programming. The perfect chance to try this out was with the particle editor I got the opportunity to write for Ack! Zombies.

Inspired by screenshots of the then upcoming Unreal Engine 3, more specifically their effects system Cascade, I decided to make a more freeform editor for creating particle effects for our project. The problem I had with effects editors I had seen done in school previously, is that they were all powered by a collection of textboxes and dropdowns where a user had to experiement with different values and see what kind of results they could come up with. It’s really an engineer’s approach to creating an artist’s tool, and creating these effects is an artform in itself — not an exact science that can be defined easily in numbers. In reality, this experience is only a small step up from editing scripts or code which define effects and running the game to see the result. I wanted an experience for my artists and teammates to use that was familiar to tools they were already using in asset creation suites like Maya and 3D Studio Max.

Using the .NET Framework made the creation of the interface a snap. Most of the time was spent creating custom controls for editing values of the different “attributes” in an effect. An attribute is in this sense… well, an attribute of an effect. Things like colors, size, rotation and velocity make up a majority of the tweakable values in an effect. The editor allows keyframes to be defined for a given attribute, and the particle system interpolates all the values of each attribute to get the current state of a particle. Unfortunately, a large amount of time was also spent on recreating the same particle system in the managed world, which was one of the things I would change if I had to do it all over again.

Post-Mortem

What Went Wrong

  • Know your timeframe, and scale the project accordingly – The graphics engine I had planned for this 3-month project was ambitious, perhaps a little too ambitious. The full shader implementation could have been done if I had less on my plate with the rest of the project, or if I had started a bit earlier. Because I went ahead with my ideas anyway, the final submission of the game ended up less pleasing than desired. If I had started from the beginning with a solid fixed-function renderer I may have had the opportunity to add more polish.
  • Reuse whenever possible – While I was writing the particle editor, I had to reimplement the particle system logic in C# to get it running in the editor because the game had not been built in a modular form that would have allowed the graphics engine to be used outside the game. If that were the case I could have wrapped the graphics engine from the actual game in C++/CLI (or Managed C++ at the time) and used the same code base. This would have greatly lowered the amount of time spent on synchronizing the behavior of the two implementations.

However, even with these “lessons to learn”, I believe we still ended up with an amazingly fun game to play.

What Went Right

  • Great team experience – Months before Final Project, most people knew who they were working with. Most of our team went as far as to move into the same apartment. The extra availability of team members made the turn around for bug squashing and feature decisions quick and easy. Even with the extra stress with always being around your teammates, it was well worth it.
  • Awesome game idea – Our game was the inspired brain-child of Jon Zimmer. It came from a similar 2D game Jon created early in the program when we first started doing DirectX. The basic design allowed us to go totally nuts and make the game we all wanted. It really says something when we were having as much fun playing the game at the end of the project as when we were first getting started.