It's hard to say anything is ever finished, but when you ship, you ship. Double Dopple: Enter the Dopplewaffle is live and now I'm playing the appfigures game, anxious to see how it does in the world. A week in it's been downloaded 15 times, and I'm 100% sure I could name all those people and some of their kids, so it's not like I'm popping any expensive champagne on this milestone. But the actual payoff- creating something I like and sharing that- feels pretty great.
As odds would have it, I did a pretty poor job documenting how I made this game. I've done a better job documenting the stubs of games haunting my harddrive; there might be some correlation there. However there are a couple memorable scraps, and from that I'm going to attempt to reassemble a dev diary here.
Sketch on a Plane- November 2011
On planes I try to turn off the thought machine- usually by going to sleep but sometimes I just play the image game in my mind's eye. Basically you close your eyes and turn off all filters and let the images play- they surface from the darkness; they shift and move and morph into each other. It can be frivolous, abstract, or mildly disturbing when whole forms and real things come quickly into existence- such as faces of people far away whom you've never met.
At recess as a kid, I vividly remember doing this with my friend. The way it worked was simple: You stare into the sun for a minute, then close your eyes and then mash them around with the back of your thumbs until you see cool stuff. We did this repeatedly.
So playing the image game on a plane (no thumbs)- this geometricy thing pops into view. Basically four windows, and inside each window is a puzzle; the individual puzzles are easy to solve but like a rubick's cube when you move a tile in one window, its corrolary in another window moves in the opposite direction. For every action, there is an equal and opposite reaction, so to speak.
Simple, I thought, yeah I'm going to prototype this and see where it goes. I was getting frustrated with the other game I was doing and this would be a good reboot.
Four to two to one- Prototyping the core interaction
The first step I took was a cardinal sin, and one I coach people against, but it was late at night and I thought it would be faster. I opened up the computer and started drawing boxes. I should have spent more time sketching; there are just so many ways digital tools can butcher a young idea. It can take the life out of it. But I gave myself permission and did it anyway.
I was trying to figure out the basic interaction, and test it for fun and interesting. To do that I needed some dummy sprites and a barebones gamescene.
Doing this doesn't take long and led to some important decisions:
This was going to be an iPad game. The smallest workable size for a touchable object is about 32 pixels square. So with that as my base unit, I wanted as much real estate as possible to create levels of sufficient complexity. Ergo bigger screen.
For the same reason I realized four windows was too many so I started thinking about it as two. And it would be two little guys, trying to get to their respective exits. But two windows was still too restrictive; why not just have them wandering the same "maze?" Beleagured by baddies, of course.
To me, I had found the core, and everything else would fall in around that. Moving two guys around like this plays with your attention. Decided I was OK with the touch obscuring the character, but added the "dot path" to help anticipate what was going to happen. I mashed together a titlescreen, which I think is a worthwhile step in making an idea whole. First vestiges of a retro-arcade feel started to find their way in, maybe because my dummy sprites reminded me of Haunted House. Set the working title of "Escape."
Pathfinding- December 2011
To really get a feel for it, I needed baddies that would follow you. This was the big technical challenge I knew I needed to figure out, so I dove in.
The A* search algorithm seemed like the best place to start, since it was well-documented in other languages. With a few tips from my engineer brother and the cocos2D community I had something workable in obj-c.
Level Design, Symmetry & Perception- January 2012
For a short time I considered producing levels procedurally. This would make the game more or less infinite, and if I could control the difficulty curve it could be surprising and fun. Also I could take down the big post-it on my board that said "DESIGN 60 LEVELS."
I scrapped that idea and figured I would grind it out. I'll do procedurally designed challenges in a future game, I told myself. The last time I designed a level for a game it was for DOOM, using the deu editor, and that was fun, so this might be as well.
I made some blocks and started playing around in Tiled. It's not a perfect tool but it's free software and I didn't want to fall into the trap of overbuilding my own toolset. By playing around with some basic level types, I realized that symmetry- or near symmetry- can play an important part in the game. Symmetric levels are better perceived as whole and pleasant, but perfectly symmetric levels were either unsolvable or too easy. And then there was this bit on perception that I had picked up:
- Recent Progress in Perception: Readings from Scientific American (1976) by Richard Held, Whitman Richards (Introduction)
So if I was going to make (mostly) symmetric levels, I would build asymmetry off the center. And probably throw in some completely assymetric levels as well.
Other perception/information lessons were learned along the way once I started testing the prototype on willing friends. The walls in particular were overdone when I started out- they presented too much noise. The walls evolved something like this:
Creating walls in this final form was satisfying, in part because it reminded me vaguely of pre-vector days spent idling in TheDraw. But I created a huge workflow problem.
Each tile's appearance had become dependent on its neighbor; if it was an end cap or more complicated connector, it would have to "know that" and display the right tile. I didn't want to burden the game with doing this on level load, so I would need to do this myself. And to design levels that were fun, I needed to quickly lay something out and tweak it for gameplay, without being distracted by which tile I needed to pick from the palette. As I mucked through a few levels, I realized fully the excrutiating pain of being distanced from what I was trying to create; and because I had recently seen Bret Victor's talk on this very topic, I went against instinct and decided to build a tool that would help.
Tileman the Extruder
For the most part, Tileman the Extruder is an afwul hack, but it works and now I can say I made a mac app. It opens a folder called "in" on the desktop and processes all of the TMX tilemaps it can find in there. It looks at every tile, determines its basic configuration, maps the right "wall" tile, and rewrites the map into a folder called "out."
Trying not to get technical here, but one of the cleaner methods is here, which determines the tile configuration.
-(int) configAt:(CGPoint)location inLayer:(CCTMXLayer*)layer
CGPoint north = ccpAdd(location, ccp(0, 1));
CGPoint east = ccpAdd(location, ccp(1, 0));
CGPoint south = ccpAdd(location, ccp(0, -1));
CGPoint west = ccpAdd(location, ccp(-1, 0));
int config = 0;
if ([layer tileGIDAt:south] != 0) config += 1000;
if ([layer tileGIDAt:east] != 0) config += 100;
if ([layer tileGIDAt:north] != 0) config += 10;
if ([layer tileGIDAt:west] != 0) config += 1;
So if a tile is an island, I would get back "0"; if it was completely surrounded I would get back "1111." It get's hack-ier from there; I'm not in love with TMX format or how Tiled handles tileIDs. But it automated going from a flat map to an extruded-looking one, so I was free to focus on the core level design. Yay.
Rogue's Gallery and Character Design- January and February 2012
Somewhere in there I designed the roster of characters. Along the line I played with a few story ideas, such as the entire game taking place inside the belly of a giant space dragon, ala Unicron. Somone suggested sorta late in the game a romantic idea- that the two characters should be a man and woman trying to reunite. These were all good ideas and I didn't implement any of them.
For the enemies, there's really a only a couple archetypes and one pattern in play.
Archetypes I went with:
Thing that follows you and clearly means you harm.
Thing that wanders randomly.
Thing that shoots.
Thing that encircles.
Pattern: Faster, badder versions of the same. I don't know if this makes for a better or worse game design. I know that, looking back on all the great games I've played in the arcade/platform genre, it's there. Whether it was just to save money in development (turn mario from red to green, presto, we have Luigi) or if it adds richness (oh, that's a turtle, I know what a turtle does, but this one is red) - the pattern exists and so I used it.
The Name Game- Early 2012
While designing levels and such, I was playing the name game with anyone who was up for it. The list of discarded names:
Escape- Left it behind because it wasn't very specific.
MirrorMaze- Was the working title for a while; turns out there is already an app in the store with the same name, and I never felt like it had enough personality. Plus nobody really likes mazes, though Maze Craze is still one of my favorite games of all time.
Co-labrynth- Best runner up, from friend Dave Gray.
Double Dopple: Enter the Dopplewaffle just sort of came to be. Awhile back I was at the dentist, and he's a great dentist but I guess has a habit of getting lost in thought. At one point, while I was getting a root canal, he seemed to be very deeply concentrating on the task at hand. So much so that he wasn't responding to the hygenist who was assisting him, who was asking him a question. When he came around, she called him on it; he said he was sorry; he was "lost in his waffle." I was drugged up so that's what I heard, anyway. I thought it was a great phrase and filed it away until I was looking for a synonym for maze- but that also conjured up the meditative elements of walking a labrynth. Adding "Dopple" wasn't too far away, since it was about two little guys who were dopplegangers of each other. And I'm a sucker for alliteration.
March 2012: Had a baby
My wife and I had a gambit going on the side- that "she would ship before I would." She won, and our daughter Ada was born on March 13. Production went dark for a bit, since I no longer had the 10pm-2am working window.
The first sounds I put into the game were the ones I felt were most important: the footsteps and the win and lose sounds. Although I've bought sounds before, I saw no reason not to make my own this go around. I used thirdcog's cfxr to create good, square shaped stuff. It's a really nice little toy and I completely recommend it.
Writing background music was a soft way to restart development and normality after new baby arrived. I was inspired to learn garageband's in-and-outs by Jeff Wilson, who also explained to me how chords work on a whiteboard. To get the mood I wanted, I bought a copy of Blip, an instrument pack sourced from the Atari 2600 sound chip. I wrote some melodies, and used the garageband loops extensively.
Keeping loops tight and small was satisfying; I was happy to get the total assets in under 5mb. The longest loop, and my favorite, is reserved for after you escape the Dopplewaffle. And it's here, with legacy game name:
Shipping- August 2012
I forget who said that 90% of the effort is in the last 10%; all I know is I was working more or less simultaneously on all aspects of the game, tweaking levels and playtesting with strangers and removing memory leaks and, at one point, realizing a couple awesome features that I could put in without much effort... but that would have to wait until next release. I have a list.
In the meantime, glad to have it out there; promising to keep a tighter dev diary next time.
Get Double Dopple here.