TextTumble: A summary of development for a fledgling iPhone game programmer
This post was originally intended to be published in June. I held off publishing it though, intending to expand upon it. In retrospect, it's pretty damn big, so I'm just going to let it ride, and address TextTumble's approval process and release process in a separate post. -CZ
We made it! 249 days since the first source code commit, TextTumble is finished. At around 11:30 PM, I cracked the champagne and sat back to enjoy the prospect of a job completed. While there is still some additional features that will be fit into the online scores and profiles, I feel very happy labeling the package with "1.0" (A version number whose significance can be daunting to a first timer like myself). As it sits in Apple's review queue now, I'd like to give you an abbreviated history of the game's development. I'm not going to offer much in the way of advice or instruction here; this is just telling a story. :-)
Sometime near mid September 2008, I went out for lunch with now co-owner of Magellan Media, Matt Rogers. Matt and I were co-workers at the Indianapolis Star (Matt recently left the Star to work at mediasauce), where we worked with a team of other artists and programmers to create local community sites.
Matt asked me to work together with him on a new game concept: create a falling-letter-tile word game for the iPhone. At the time, one of the more popular games on the iPhone app store, Wurdle, was gaining in popularity, yet seemed to be generating a lot of derivative apps in the App Store. Matt felt (a point which I believe to be still valid) that a new type of word game would capture the public's attention as an alternative to the Wurdle-style game.
I was definitely interested; to say that I have long desired to enter into the game industry would be an understatement. While in college, I had hacked together some simple mods for Unreal Tournament and Rune, but I had never stuck with a project long enough to see it polished and complete. While many of the upper echelon of iPhone games on the App Store seem to be coming from game industry veterans breaking out on their own, the game that Matt and I would make would be our first.
Invigorated from that lunch, I told Matt that I would create a prototype and have it ready for him to check out a few days. On September 29, 2008, I sent Matt a video of the iPhone simulator that looked something like this:
image omitted due to laziness in blog migration
I think that programming is full of many images like this: screenshots that on their own merits are entirely forgettable, but hold huge significance to the creator. This image represents the very beginnings of not only the first game I intended to follow through to completion, but also the first publicly used application I've written using OpenGL, a long time career goal of mine.
Matt and I, both pleased that a prototype of the game's basic interaction was put together so quickly, set a deadline for ourselves: finish the game by Christmas. It would be some hard, late nights, but I felt it would be possible. And yes, I mean Christmas 2008.
Over the course of October and November, I began working late nights, trying to pull in the necessary components of the game: the word dictionary, the tile texturing, and the interface elements. As I did this, I kept one goal in mind: keep all the code as simple as possible. I knew that attempting my first game would mean that I'd be spending more time rewriting code than writing new code, as I discovered newer and better ways to accomplish things. I also knew that I could easily fall into the trap of writing over-architectured code when I encountered a problem, as an attempt to insulate myself from the dirty details of the problem. Commits would look like this:
image omitted due to laziness
at once both encouraging me that I was accomplishing work quickly, and infuriating me that I was committing code that I knew was not what I intended to be there later on.
On November 19th, we hit our next big milestone: eliminating valid words. I was pleased that I was able to get this piece of functionality working, but I was concerned about our Christmas 2008 finish date. The game was not nearly polished enough, and I had not done nearly enough code quality checks to feel anything close to happy regarding the game. Additionally, there were features that I was beginning to feel were critical to the game's success (in-game word definition lookup, global high scores and spelling statistics, pictowords, letter crashing) that were either nonexistent or so basic as to be laughable. I told Matt that I was afraid we'd miss Christmas, but that I'd work hard on trying to be done as soon as possible.
Now would be a good time to mention that the game really had 3 people working on it. While Matt worked on art resources and the website and I did the programming, my wife was consistently involved throughout the game's creation as our sanity check. As we began to reach a more iterative feature-bugfix-internal release cycle (that was nowhere near that formal), my wife began to be more involved in critiquing the basic flow and style of the game. While Matt and I were avid video game players and had certain expectations of interface and game behavior, my wife was not: her analytical nature combined with her lack of prior bias began to reveal flaws in our assumptions as to the game's readiness for the public. Our Christmas 2008 release became our Christmas 2008 hard-vacation-push to complete more work items. I told relatives that I'd be spending the majority of my vacation programming for the game, but that I believed I'd have the majority done by February 2009.
I finished the year 2008 staying up late coding, trying to meet my own deadline. The months of January and February were difficult. Personally I was having to work my day job at hospitals throughout most of those months, as my family was going through a difficult medical time. (I should note that I am very thankful to my department managers for allowing me the ability to even /do/ this) Additionally, I learned just weeks into the new year that the entirety of the Gannett corporation (the parent company that owns many of the newspapers across the US, including the Indianapolis Star) would be enacting a furlough (unpaid week of leave) program to help account for huge losses in revenue:
image omitted, laziness, natch
I'd be lying if I didn't say I was secretly overjoyed that I would be able to spend a week doing game development instead of web development; that joy was slightly bittersweet, however. I was reaching the awkward phase of a first-time project where certain rusty mechanisms in the game seemed like they might be better rewritten; would I benefit more by continuing a design that I was increasingly dissatisfied with, or by taking more time to redesign large internal components of the game? I began to doubt many of my earlier decisions, but could not bring myself to wholesale remove whole sections of the game to make way for a rewrite. I compromised:
image omitted again! sheesh i'm lazy
and, despite my own pessimism, succeeded:
Throughout this time period, Matt had been revising our interface designs, collecting sounds for the game, and working on the promotional website. While we were not finished by the end of February, we were ready for a beta. We put out the call on Twitter, and began to aggregate a collection of friends, co-workers, and some complete strangers, to check out our game, and help us figure out what might be broken, and what might just need some tweaking. On March 1st, we packaged up the application and distributed it to our 15 beta testers.
Immediately after having released the beta, I went right back to work. The fact that people were using it served as fuel for me to become reinvested in the game, and I began to work longer and more nights throughout the week, polishing things, adjusting interface designs to meet Matt's mockups, and generally get the game ready. We received some very nice compliments from friends who we had play the game, but the game was definitely buggier than we had realized.
Towards the end of March, things were progressing slowly, but well, when it happened:
Gannett had been steadily losing money, and was forced to institute another week of unpaid leave for all its workers. I was once again enthusiastic at having a week to spend working on the game, but was cynical as well. Two financial quarters involving furlough programs does not indicate that the rest of the year will be stable and secure to a pessimist such as myself; and, if my day job were to be lost, I would not have the liberty to continue working on the game for some time. Whole months of work would be put on hold as I found another job and settled into that environment.
My wife and I talked, and we decided: if there was to be any hope of finishing the game before I became unemployed, I would need to use my vacation time along with my furlough time, and work at top speed on getting the game to a polished, playable and fun state.
We released our second beta on April 14th to a larger (20+) yet much less active group of beta testers. While we were achieving very favorable responses from players who we engaged in person, we weren't receiving any feedback or significant recorded play time from any of our testers.
This was our fault. The phrase "beta test" implies something entirely different than what it is. When we released /any/ beta test, it should have been with a stable and mostly realized game, instead of an unstable game that we were using to gauge user reactions from. In other words, our beta was our very first form of public display of the game, and should have been more representative of what we wanted users to see in the end.
Work continued. I had stopped attempting to predict when we would be "finished", and jokingly just said "when it's done" when asked. I had no idea when the game would be done. I had stopped primary gameplay development several times to add new features to the game, or improve gameplay performance.
I created a tool called AtlasMaker (which I will put on GitHub sometime in the next month or so) that let us bundle our delivered graphics in memory easily, and added a decompress-word-dictionary-to-users-hard-drive-on-first-launch feature to the game that dropped our application size to 6MB. I then promptly removed that feature, and removed our SQL database of words entirely for an in-memory structure called a DAWG which offers much more efficient querying of words and storage on disk, allowing us to have much more performant pictowords (I'll explain what I mean by pictowords in a future post).
Things were nearing the end. I could feel like everything I had wanted to be in the first version of the game was done. I felt relaxed about the game. It was stable, nearing bug free, and polished. We released the third beta on June 3rd, along with a survey. Our analytics program for the game was reporting low usage, though we were expecting that after the pretty slow uptake on beta 2. Our survey, though on the large part favorable in terms of disposition of response, saw fairly poor rates of response. On June 11th, Matt and I met for lunch, and we set ourselves our final tasks for completion before submitting the game to Apple.
June 18. Not quite Christmas 2008. Not by a long shot. And what does the body of TextTumble look like, now that we've completed it? Well, according to David A. Wheeler's 'SLOCCount' (an entirely arbitrary and only used to get some sort of wild ballpark look):
Is this entirely accurate? No. It's not accurate because I didn't keep track of actual hours spent creating the game; when I began, why would I? I was overjoyed to be working on my own video game. When I began to actually question myself and wonder what the degree of profits the game must make to make video game making a sustainable personal activity, it was long since past the point where I could attempt to recall with any accuracy how much time I had spent on the game in the nights before then.
The number is very instructive though. Our next games will be informed very much by the experience with TextTumble, and there will be a lot of thought given in the future as to how we can bring you the most fun experience while at the same time not overextending ourselves on the development effort.
I could not be happier, though. It's finished. I expect that there might be one or two bugs that slipped by, but it is finished. I can't wait to have our first game available on the App Store, and moreso, I can't wait to tell people about it. One of our earliest testers told me on Twitter: "I spent over half an hour to playing your game last night"; I was overjoyed, because this is something I've wanted to do for a very long time.
We're still waiting to hear from Apple about TextTumble's status in the store. In the mean time, we'll be creating videos, blog posts, and screenshots of the game, and showing you as much as we can about the game that we're proud to have made. I'll also be releasing the source code for the internal tools I've built to help creating the game, as well as talking a bit more on the blog about development effort and techniques learned (largely from other iPhone developers), now that we've submitted the game.
Maybe it's best summed up by:
an image i was too lazy to migrate
Time for the next level. :-)
Clearly, a month has passed since the original time of this post, and I have not done any of the source code release things I intended to do. I'm publishing this post on the eve of the game's availability in the app store, and right now all I can think about it is the next release. Priorities change. :-) -CZcomments powered by Disqus