Who Makes All This Crap?

I was gonna followup this week on my previous entry with more details on how to do multi-target (which turns out by the way to be extremely easy — but I’ll probably document it anyway in a future entry).  But then a friend of mine sent me this link to a “This American Life” podcast episode about how and where Apple products are made.  I think it’s a must listen for every developer.  Much like the comedian in the story, I had this impression that robots were used to do much of the work.  Instead he states that more things are hand-made now than in any other time in history.  I will warn that it’s a bit depressing, but swings towards a happier ending with the hope that conditions are improving and the workers are given a voice.

I think it’s important that developers not only be knowledgeable about technology but also about the human side of things.  Knowing how to program is one thing.  Knowing how to captivate your audience is something else completely.  I’m posting the link to this podcast not to discourage, but to educate.  Hopefully Apple is as transparent as they claim to be and they are actively working to improve the conditions.  If they are not, I think we as developers could have some influence on that if we chose to.

So the next time you launch one of your apps on your device, think about how “magical” it is.  And think about the poor guy who lost the use of his hand making it for you.

Multi-Target

I’m not as methodical and organized with my iPhone development as I am at my day job.  My version control system is Time Machine, I have PNG images scattered all over my desktop, and up until recently I was maintaining separate projects for my full and lite versions of each product.  Why?  Probably a bit of laziness and probably a bit of not thinking the time investment was worth the payoff.  It’s quite possible this was a little more difficult to do in Xcode 3 as well, but I never attempted it.

So while I was gutting Tramp Stamp to remove OpenFeint and go Game Center exclusively, I decided to merge the projects.  The first thing I did was launch FileMerge to compare the 2 projects and see what I was dealing with.  If you haven’t used it, it’s probably one of the most useful hidden tools on my Mac next to Automator.  The comparison showed only a handful of files and images were different.

The next thing I did was duplicate my target and change the PRODUCT NAME.  Then I added a define (LITE_VERSION) to the compiler options.  I then merged the source files that had differences using #ifdef to handle the two streams of logic.  I then added _lite to all the relevant image names and changed/split any code that referenced them.  Wallah!  A few hours later and I had both projects running and merged into 1 more manageable project.

I did run across one problem where the simulator refused to launch the lite version.  It would crash in main telling me that the app was already running.  A little searching and I found out that a reboot would fix it (I had already tried to kill zombie processes).  Sure enough it did.  Seems to be attributed to the way the process ends some times.  If I use the stop debug button, it seems to be better than shutting down the app from the simulator.

I am now doing the same with my other 3 apps.  Up until this point my build settings had been intermixed between the project and target ones.  Now I’m understanding the target settings a lot better and can change the appropriate ones.  This probably won’t make me any more money or give me any more exposure in the app store, but somehow this gives me satisfaction and makes the thought off adding any future enhancements a whole lot more palatable.

Ok… now I really should get busy on my never-ending project.  See ya next time!

Synchronizing Offline Game Center Achievements and Scores

Last post I was talking about removing OpenFeint and using Steffen Itterheim’s GameKitHelper class. As I started testing I came across many issues on my 4.x devices. It didn’t have anything to do with his library, but more to do with the inconsistent error reporting on many of the Game Center callbacks when the device was offline.  Thus I would get inconsistent caching and notifications on the game center server.  After struggling for 2 days I decided I was going to rewrite the module and take a different approach.

So DDGameKitHelper was born.  My version keeps a permanent local cache of all achievements earned and each category’s best score achieved.  Then anytime Game Center comes back online I synch between my local cache and Game Center, filling in the missing pieces on both sides.  I never remove anything from my local cache.   So if an achievement is reported on game center but not locally, I re-cache it. If it’s local but not in game center, I report it. This allows a fresh install of the app to automatically get all achievements and scores the first time it starts up.

Steffen’s class was also trying to write to the root bundle directory.  While this works in the simulator it did not work for me on the device.  So I moved the cache files to the /Library directory.  His version did not cache scores either. DDGameKitHelper keeps track of the high score in each category. So even though it reports the score each time (so that daily and weekly comparisons work), it’s only cached locally if the high score has been beat (you can provide your own compare method in the delegate).

DDGameKitHelper only deals with achievements and scores. Since none of my games use multiplayer I didn’t try to tackle an API for that. I also have not tackled someone else signing in to game center. Right now I think everything locally would synch with the new account, which really isn’t what you want neccessarily. So I will be working on a cache per user in future versions. (UPDATE: I’ve implemented multiple game center player caching)

The DDGameKitHelperDelegate class is dependent on Benjamin Borowski’s GKAchievementNotification class.

https://github.com/typeoneerror/GKAchievementNotification

It does an excellent job of display a slide down notification that fits in seamlessly with game center.

You should be able to drop the DDGameKitHelper and GKAchievementNotification files into your project.   BTW… I know all of this functionality is available in iOS 5.x, but I want to still support my 4.x users.

The API is as follows.

Authenticating a player

[[DDGameKitHelper sharedGameKitHelper] authenticateLocalPlayer];

Unlocking an achievement

[[DDGameKitHelper sharedGameKitHelper] reportAchievement:@"1" percentComplete:100];

Reporting a score

[[DDGameKitHelper sharedGameKitHelper] submitScore:newscore category:@"1"];

IMHO think you should always report every score and let game center decided if it beat the previous score, thus daily and weekly will work properly.  DDGameKitHelper will only cache the score locally if it meets the criteria of your compare delegate method (see below).

Showing achievements

[[DDGameKitHelper sharedGameKitHelper] showAchievements];

Showing scores

[[DDGameKitHelper sharedGameKitHelper] showLeaderboard];

Resetting achievements

[[DDGameKitHelper sharedGameKitHelper] resetAchievements];

This is useful during testing, but you may actually want this functionality in your game as well.

The following delegate methods should be implemented.

-(bool) compare:(int64_t)score1 to:(int64_t)score2
{
    return score1 > score2;
}
 
-(void) onSubmitScore:(int64_t)score;
{
    [[GKAchievementHandler defaultHandler] notifyAchievementTitle:@"New High Score!!!" andMessage:[NSString stringWithFormat:@"%d", score]];
}
 
-(void) onReportAchievement:(GKAchievement*)achievement
{
    DDGameKitHelper* gkHelper = [DDGameKitHelper sharedGameKitHelper];
    [[GKAchievementHandler defaultHandler] notifyAchievement:[gkHelper getAchievementDescription:achievement.identifier]];
}

As stated earlier, your compare method should following the sort order of your leader board. The other 2 methods use the GKAchievementHandler class to show a banner.  If you are going to use this on an iPad you may want to add an adjustFrame method to compensate for the different dimensions.

BOOL isPad() 
{
   #ifdef UI_USER_INTERFACE_IDIOM
      return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
   #else
      return NO;
   #endif
}
 
-(CGRect)adjustFrame:(CGRect)frame
{
   if (isPad())
      return CGRectMake(frame.origin.x + 242, frame.origin.y, frame.size.width, frame.size.height);
   else
      return frame;
}

And then use it when the frame is set.

self.frame = [self adjustFrame:kGKAchievementFrameStart];

I’ve submitted an update to Tramp Stamp using this new logic (UPDATE: it got approved before the Dec. 22nd cutoff — so go check it out).  I also bumped my app requirements from iOS 3.1.3 to 4.2.  I’ll have to do analysis as to whether this was the right decision or not.  BTW… does anyone know what the user experience is for those still on 3.x?  Will they just not see the update?

I’ve put all this code up on GitHub.  It uses the MIT License, so you are free to use this however you’d like.  In fact, I’d appreciate feedback and any bugs/enhancements you make to it.

https://github.com/csddavies/DDGameKitHelper

Oh… and Happy Holidays!  I hope it’s a good one for all us indys, but I suspect we’ll be buried under a blanket of EA apps.

Ain’t Using Feint

I took a sidetrack from my current project this week to remove OpenFeint from Tramp Stamp.  I personally am not getting any benefit from the service anymore and I really wanted to trim the game down.  This turned out to be a little more painful than I anticipated.  Mostly because this was an old project that hadn’t seen Xcode 4 before.  It took me several hours to even get it to build and run in the simulator, let alone start stripping out OpenFeint.  The Xcode 4 fiasco could be a whole separate blog entry at some point.

My basic needs were to have offline handling of Game Center scores and achievements as well as notifications for achievements.  I know that iOS 5 handles both of these, but I still want to target my 4.1 audience.  So after a few discussion on Twitter with @funnest, @GavinBowman, and @mike3k I found this article that worked for getting basic Game Center functionality into my App using Steffan Itterheim’s GameKitHelper class.  I had Game Center functionality via OpenFeint, so it was just a matter of finding the 3 places (initialization, achievement reporting, and score reporting) that I called OpenFeint and replacing them with calls to this class.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// initialize
GameKitHelper *gkHelper = [GameKitHelper sharedGameKitHelper];
gkHelper.delegate = self;
[gkHelper authenticateLocalPlayer];
 
// unlock achievement
-(void)unlockAchievement:(NSString*)achievementStr
{
   GameKitHelper *gkHelper = [GameKitHelper sharedGameKitHelper];
   [gkHelper reportAchievementWithID:achievementStr percentComplete:100];
}
 
// report score
-(void)newHighScore:(int)newscore
{
   GameKitHelper *gkHelper = [GameKitHelper sharedGameKitHelper];
   [gkHelper submitScore:newscore category:@"1"];
}

I also wanted the achievement notification system like OpenFeint did.  So I found this GKAchievementHandler library to help me out.  It’s easy to use and tied in nicely to the GameKitHelperDelegate methods.

1
2
3
4
5
6
-(void) onAchievementReported:(GKAchievement*)achievement
{
   CCLOG(@"onAchievementReported: %@", achievement);
   GameKitHelper* gkHelper = [GameKitHelper sharedGameKitHelper];
   [[GKAchievementHandler defaultHandler] notifyAchievement:[gkHelper getAchievementDescriptionByID:achievement.identifier]];
}

I created the loadAchievementDescriptions and getAchievementDescriptionById methods to make it easier to display the achievement message.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-(void) loadAchievementDescriptions
{
    if (isGameCenterAvailable == NO)
        return;
 
    achievementDescriptions = [[NSMutableDictionary alloc] init];
    [GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler:^(NSArray *descriptions, NSError *error) {
        if (error != nil) {
            NSLog(@"Error getting achievement descriptions: %@", error);
        }
 
        for (GKAchievementDescription *achievementDescription in descriptions) {
            [achievementDescriptions setObject:achievementDescription forKey:achievementDescription.identifier];
        }
    }];
}
 
-(GKAchievementDescription*) getAchievementDescriptionByID:(NSString*)identifier
{
    if (isGameCenterAvailable == NO)
        return nil;
 
    GKAchievementDescription* description = [achievementDescriptions objectForKey:identifier];
    return [[description retain] autorelease];
}

Combining the 2 libraries together I was able to get the functionality I wanted and removed about 2MB from my binary.  Now I’m working on redesigning the appstore icon.  Everything looks great at 512×512.  It’s a science finding one that scales down nicely to 57×57.  So hopefully I’ll get a Tramp Stamp update submitted this week.  A bit more testing to do, but I’m happy with the Game Center implementation.

UPDATE: It seems to be working fairly well, although I’m having a few issues with offline.  If I turn wifi off on my iPod Touch and run the game, the achievement banners get displayed, however nothing shows up in the achievement screen and when I turn wifi back on and rerun the app (no multi-tasking on the iPod), nothing gets submitted.  What’s strange is that reportAchievementWithCompletionHandler completes with an error of nil (no error), which I wouldn’t expect with no internet connection. Any ideas appreciated.  I also noticed the code does not support offline scores, although I see someone has submitted a patch to Steffan.

UPDATE #2: The reportAchievementWithCompletionHandler only seemed to happen on 4.2.1 devices and only if this wasn’t the first debug session in Xcode (yes, I know weird).  Once I got past that I noticed there was an issue with writing the cache file.  It was trying to put it in the root directory.  I was getting an “deny file-write” on the

[NSKeyedArchiver archiveRootObject:cachedAchievements toFile:file];

call.  Once I changed that to append “Documents” then the cache file got written and when I enabled wifi it reported the achievement successfully.  So… I think I’m almost ready to submit.

FREE Dumb!

I don’t like FREEmium.  Freemium has all but frozen the charts for the independent developer.  1 year ago I could make my app free for a couple of days, send a few tweets and post a forum notice on Touch Arcade and I could crack the Top 50 for a few days.  Now I’m lucky to crack the Top 200.  I have no way to get the visibility I once did.  It’s a shame the eco-system has gone this direction.  How could Apple have known that everyone would race to the bottom and 99 cent apps would become the norm?  Now even that has been superseded by freemium apps.  Apple has given us complete freedom and in my opinion that’s turned into FREE DUMB.  I think it’s only going to get worse.

That might be part of my lack of motivation lately.  As a 1-man shop I’m just not going to produce something that is going to get Top 50 recognition anymore.  You might say that’s a lousy attitude and that if I make something great it will float to the top.  Perhaps, but I’m pretty sure I have more of a chance of winning the lottery at this point.  I want to write the best app to the best of my abilities that I feel good charging a piddling 99 cents for.  I’d like to charge more than that, but the consumer perspective is that everything should be 99 cents or free, and even at that they’ll complain that they don’t feel they got their money’s worth.  And as I’ve stated in the past, I’m not looking to make hundreds of thousands of dollars.  I’m more interested in finding fame than fortune.  If I can make a living at it, that would be great, but so far I don’t feel that I could without making some huge sacrifices and at age 46 I’m not willing to do that.

So my next game is probably going to be freemium, cuz what else can I do?  I’d love to just throw it out there for $2.99 and see what happens.  I wish there were some way for us to turn back the app store time clock (knowing what we know now) and figure out a better way to monetize the system.  I don’t think freemium is the solution.  I’m still working through the details of how my game could use freemium.  Just upgrading to the full version doesn’t seem to work anymore.  I’ve got to come up with consumables and motivation for using those consumables without feeling like I’m taking advantage of the consumer. And that’s an important to me.  I don’t like the apps that take advantage of kids.  For example… here’s a free virtual dog for you to grow attached to.  Oh you want to feed it so it doesn’t DIE?  Well… we have just the solution… dog food for only 99 cents a bag. Argh!

I know there are independent developers who are in favor of the freemium model.  It’s their chance to play along-side the big boys.  I just don’t happen to see it that way.  For me it’s just become harder to get recognized.  I still contend Apple should have a program where we can buy advertising space on the app store.  Advertising anywhere else is ludicrous.  I also think there should be a independent developer section that would allow those of us with limited budgets to get some exposure.  But how do you define an independent?  I’ve been contacted by Apple in the past for artwork, with the hopes of exposure, but to no avail.  I’d like to see this program expanded to rotate more apps and give more developers a chance.  I know that it’s hard for Apple to filter through the store because 90% of the app store is crap and perhaps my stuff falls into that bucket, I don’t know.  I just know that if I was contacted they must have seen something special about my app.  I try not to throw junk out there just to take advantage of the consumer.  I really am trying to produce something to the best of my ability.

How long will freemium be the flavor of the month?  What’s next?  Are we gonna start paying the customer to buy our app?  Hmmm… I got an idea… be right back… :)

Code Monkey or Code Junkie?

I wanted to followup on my previous article from a month ago discussing “newbies” and why the Apple Developer Forums are a tough place for them.  Developers who don’t want to answer inane or repetitive questions will respond negatively or not at all.  Neither one helps the newbie.  It’s obvious there are developers (I’ll use that term loosely) that are just trying to get in on the gold rush (if one even exists anymore).  Everyone thinks they have a great idea for the next big app.  Some might think that programming is just a matter of an idea and writing some script, right?  Too lazy to do the analysis or design necessary.  Just looking for code snippets. A code monkey.

For example, this question comes straight from the forums:

Could someone help me doing an application where you need to guess a number ? If the number you entered is too big or too small, it would say it. The app would also generate randomly a number at the beginning.

Obviously this is someone who hasn’t written a line of code (ever) and just fishing for some examples.  How do you respond to this?  It’s tough to not be negative after seeing this for the 100th time.  So needless to say, this guy got crucified.  Unfortunate.  But at the same time this guy hadn’t done any homework at all.  Hopefully he’ll find a programmer to help him get the job done.

Now take another example:

How can i connect with a mysql database? is there any example i can use?  Must i develop a web service that read an xml file?

A pretty legit question, shows a little more experience, but also probably too general.  He got a bit crucified as well, but at least with some links to point him in the right direction.  Hopefully he’ll gain some experience through that.

Having run the computer science lab back in college I saw plenty of students who really didn’t belong in that major and were forcing themselves through it.  They didn’t have the knack or the passion.  It wasn’t in their blood.  They weren’t code junkies.  They hadn’t been doing it all their lives up until that point.  That’s not to say someone can’t get into this later on.  There are plenty of examples of first time developers hitting it big.  But they probably already had the talent inside them.  It probably came naturally.  And they probably loved it.  I sincerely doubt someone forcing themselves to develop an app would find any success (prove me wrong if you have an example).

I’ve been approached by acquaintences that had a great idea (or so they thought).  They ask, how do they go about getting this into the app store?  Once I start explaining, they kind of lose interest.  I’m not sure the public at large has a clear understanding of what it takes to develop and app.  Just as I don’t understand why someone who throws a football can make millions of dollars.  But I can’t throw a football and I never had a passion for it.  If I did, I’d probably appreciate it more.

Developers appreciate what other developers do.  We understand what it takes to accomplish something that others might think is trivial.  It’s not just clicking a few buttons and wallah! (although I once had a manager who I swear thought it was)  When I see something that I haven’t seen before I get excited and motivated.  I remember seeing Choplifter, Karateka, or any Nasir Gebelli creation for the first time and just being like WOW, how did they do that?  (looking at them now isn’t as impressive I guess)  Or more recently World of Goo or Jetpack Joyride.

So how does the code junkie help the code monkey?  I guess by inspiring them, not spoon feeding, and encouraging prototyping, analysis, and design.  If someone isn’t cut out for this, they’ll soon discover it.  But being mean or snippy with them isn’t the right approach.  Encourage them to do the research.  Tell them if they don’t have a passion for it to find something they do have the passion for.  As Steve Jobs said… “You’ve got to find what you love”.  Be a “junkie” not a “monkey”.

Life Intersected

I have 3 heroes. Thomas Edison, Walt Disney, and Steve Jobs. With the passing of the last of these I started to reflect on how each has impacted my life and guided me to where I am today. More than any other, my life has intersected with Steve Jobs the most.

The first was in my childhood and my love for the Apple II. I constantly pestered my parents for one after having learned BASIC on my Dad’s PDP-11.  Finally when I was 15 my Dad and I put together our first Apple II from a kit complete with homemade wooden case and non-Apple keyboard. I spent hours writing games using Graphics Magician written by Mark Pelczarski. I even sent a few to Broderbund and Sierra Online (where later I would interview with another of my heroes Al Lowe). I learned assembly language, wrote self modifying code (for performance), and counted the cycles that each operation took (something I don’t do much of anymore). I had a whole group of friends who would hang out in the Apple lab after school playing the latest games like Cannonball Blitz and Apple Panic and discussing the latest pirating tools.  And of course we were all great admirers of Wozniak and Jobs.

The next time I intersected with Apple was in college when I ran the lab for the Pascal and Assembly language classes. I maintained the Apple II computer lab, network, and a 20MB shared Corvus hard drive (that cost something like $3000 or probably more). Unfortunately, besides a few Macs that infiltrated the lab, most of my upper level studies were done on crappy AT&T pc clones. So I kind of wandered away from Apple computers for a few years.

Then right out of college I was offered a job at WordPerfect working in the Apple IIGS version. Several of my friends from high school had already been working there for several years, having skipped college (sometimes I wish I had done the same). I remember my first Apple IIGS. It was actually in an Apple II case (prototype) and had these really nice hard bound manuals that I devoured. Soon I had the “Woz” signature version and talking directly with Apple employees. I had arrived. My dreams from my childhood had come true.

But eventually the Apple group at WordPerfect folded and many of the team members moved over to the NeXT group (including me). This is when I met Steve Jobs. He was excited to have WordPerfect being developed for NeXT. So much so that he paid us a visit in our office sometime in 1991. To tell you the truth it all seems like a dream and sometimes I wonder if it even happened. All I can remember is being really intimidated and knowing I was around someone great. He was surprisingly soft spoken (somewhat shy — or maybe just aloof) and very direct. If I remember right it was a very short meeting but a very typical motivating Steve speech. I do remember he was in his typical attire of jeans, black turtleneck, and sneakers.  And he seemed small to me, almost fragile. Maybe because I had built him up to this super hero in my head.

Here is Steve demoing WordPerfect for NeXT (6:15 in).  I like how he says OUR version of WordPerfect.  That’s Steve for ya.

And then my relationship with Apple change for many many years (16 to be exact). I became a corporate slave to PCs, Windows, Visual C++, Linux, Java, etc. But deep in my heart I was still an Apple fanboy, although I never owned another Apple product after my IIGS until 2009.

Finally my life intersected with Steve Jobs once again. Everything I had learned on the Apple II and NeXT had led up to this. It was a natural fit. As soon as I saw the iPhone and Xcode development environment I knew I was home. Suddenly all the feelings of my childhood came back. The late nights staying up trying to get a graphic moving across the screen. Talking to other enthusiasts and sharing the latest tricks. Feeling like we were pioneers doing something no one else had done. It was/is exciting.

I’m sad that there will be no more intersections.  Nothing new for Steve to envision.  Steve, thank you for the years of enjoyment. Beside Thomas Edison I can think of no other man who has had an impact on so many lives. Without you I would never be doing what I do today. And I thoroughly enjoy what I do. Thanks for giving the indie developer the platform to get exposure to millions of customers. You will be missed.

Apple Developer Forums: Relevant Or Not?

Almost 3 years ago when I started my iPhone development the Apple Developer Forums were instrumental to my success.  Especially figuring out the whole provisioning profile thing (which in hindsight seems so simple now — actually Apple has made it incredibly simple now with the Xcode integration).  It was a smaller group of people and we were all learning and ramping up together.  But lately I don’t visit as much, and when I do it’s mostly the Beta and Distribution sections.  I guess one of the main reason is the lack of common courtesy in the forums.  Too many flame wars and attacking the newbie.  I’m certainly glad I’m not a newbie today and asking about provisioning profiles for the 500th time.

When I have a question I’m more likely to comb the stack overflow forums  (via Google) even though you can’t talk about NDA stuff there.  I’ve found much more helpful code snippets there than the Apple Forums.  That’s too bad.  I would love to see a little more moderation and visibility by Apple.  How many times early on did we complain about the App Store being “stuck” (again) for days before ANY acknowledgement from Apple (if any at all)?  Back when I worked on the Apple IIGS and Apple did their support via AppleLink (which later became AOL), they were very responsive and involved.  I remember great conversations with Dave Lyons and Matt Deatherage.

There is one guy in the forums who posts an average of 17.72 posts a day (yes, I did the math).  Unfortunately most of them are responses to newbies with links to the documentation and a snide remark like “have you looked at these?”.  There really has to be a better way to help the newbie.  Yes, it’s their responsibility to do a search up front, but I know I’ve been in panic mode and posted something to a listserv or forum in desperation.  How does anyone have the time to respond to that many posts anyway?  I thought I had a pretty good number with my 583 posts in a little under 3 years.

So let me know.  Where do you do most of your iPhone development question asking?  Are the Apple Developer Forums relevant anymore?  What should Apple do to improve them?

Act Your Age?

I was telling my girlfriend why I was so tired.  I said I stayed up till 2AM playing Jetpack Joyride again.  She said something like… “well, why don’t you act your age?”… implying that game playing at 2AM was not something a 46 year old man with a job and responsibilities should be doing.  I thought about this… does age really have anything to do with this?  I guess if I was 8 years old, then yes… my parents would have taken my iPad away and made me go to sleep.  But really I think it has to do with personality type.  There are just some of us that just have to tinker, play around, and see what happens when we push this button and we lose track of time while doing it.

My parents always encouraged me to explore.  On my 14th Christmas my Mom shopped and shopped around to get me a BIG TRAK.  I’m pretty sure by the next day I had torn it apart to see what made it tick (it was probably never the same after that either).  Once I built an entire robot out of paper towel and toilet paper rolls, laundry detergent bottles, and assorted sticks and plastic all spray painted silver.  I embedded a tape recorder in it’s belly so that it could talk.  It was really something for a 10 year old.  I got a lot of this from my Dad, who when I was age 12 built a PDP-11 in our dining room and later let me help wire-wrap our first Apple II computer.  I remember my older brother’s always having a VW sitting in the driveway under repair or remodel.  And my next oldest brother and I use to write games on our TI and HP calculators.  In High School I input all the data for a biology quiz on my HP-41C (It had the card reader) and asking the teacher if I could use a calculator on the exam.  He said sure… not realizing that calculators were now doing more than just math (this was 1981 I remind you).  I aced the test (although I do remember some controversy around it… but have forgotten the details).  So I guess I always thought everyone had this quizitive nature, but alas… there really are people who have no interest in this. :)

I was a teachers assistant in college and worked in the computer science lab.  I could see the students that had a knack and passion for it versus those that were just doing it because they heard they could make lots of money.  It either came naturally or it didn’t.  You either wanted to solve the problem or you wanted to be spoon fed.  I’m betting those of us that want to solve problems and explore are the ones that get the most out of games.  And in order to write games you need to have that same spirit.

In The Art of Game Design – A Book of Lenses (I highly recommend reading this if you haven’t already) Jesse lays out Bartle’s Taxonomy of Player Types.  There are the Achievers, Explorers, Socializers, and Killers.  I think I fall into a little bit of the achiever and explorer roles, while I care very little for the social or killer aspect.  I guess I would add a fifth type.  And that’s the person who just doesn’t like playing game period.  I know, I know… hard to comprehend, but I’m sure I know a few people that fall into that category.  Focused on the real world and not very creative or imaginative.  How boring would that be? (sarcastic undertone intentional)  But seriously, there are people that own iPhones who have never given a game a try… well… except to hop on the Angry Birds bandwagon… cuz it’s cool ya know.  To them it’s considered a waste of time.  I guess sometimes I do feel like I might be wasting my time (both writing and playing games), but what the hell am I suppose to be doing with that time?  Solving the world’s problems?  I’ll leave that to the suit and ties.

I’m betting I’m not the only one who has lost lots of sleep lately due to JJ.  So my fellow explorers and creative thinkers… drink another Mountain Dew… hop on another Crazy Freakin’ Teleporter… and join me in collecting achievement medals.  I hear there are 125 of them!

The Indie Budget

It’s good to be back!  Thanks @mysterycoconut for the new format.  It’s gonna be great reading all the entries each day and I love that if I miss an interval I can still get back with it the next time (although I’m hoping not to abuse that power).  When I left you last time I was still working on my 5th game.  Unfortunately that’s the state I’m still at several months later.  It’s been a busy Summer, but looking forward to the Fall and Winter to get some coding done.  So today I want to talk about the Indie Budget and some thoughts/questions I’ve had.

Before I can talk about the indie budget I have to define what it means to be an independent developer.  I started searching around for a good definition and found many, ranging from

(By the way… take a moment to read the NinjaBee Dance article, it raises some good questions)

So that didn’t really help, did it?  I’m gonna go with a combination of the 3rd and 4th definition and twist it towards the app store.

“An indie is someone who designs apps with total freedom both financially and creatively and is motivated by passion, not money.”

I will say that I’m not not entirely immune to the money motivation.  I still aspire to hit it big like Tiny Wings, but if I didn’t have a passion for this, the money wouldn’t be a big enough motivating factor.

With that said… what is the indie budget?  I’m gonna define it as

“The indie budget is the amount of money spent to develop, market, and maintain an app.”

Not an overly complex definition.  But if an indie is motivated by passion and not money, then what does it really cost to develop an app?  I hear about indie budgets of over $30,000 for a one-person-developed app and see indies with fairly decent marketing campaigns.  Neither of those fit my personal situation.  I don’t give myself a salary for my time and my marketing costs are relatively low.  I would consider my indie budget is less than 5% of what I make.

But this doesn’t fit everyone (although I’m suspecting it fits a vast majority of us).  The Indie community spans a wide range of developer types.  Some committed full-time, some the weekend code warriors, and some (like me) coding when we find the time (and motivation).  So everyone has their own budget.  If I was doing this full-time then I would probably have to consider giving myself a salary.  If I was riskier I’d probably be spending more on marketing (although with my success at what I have done, that is debatable).

So when does income and budget start to dictate that you might not be an “indie” anymore?  If you’ve hired 5 people to program, do artwork, and create music are you totally free financially and creatively anymore? You are now tied to providing salaries and so finances start to dictate what you do.  You now have a difference of opinion on your team and are not solely the creative director.  You are now no longer totally in control of your destiny.  Perhaps “indie” means just that… INDEPENDENT… a team of one.  Hmmm….

I believe in total transparency if it can help others.  So with that I’m gonna publish my financial history in hopes that it will motivate (or demotivate) and put into perspective this whole indie business.  There are some stand-out indies who have made it big, but as I’ve said… I suspect I’m in the boat with 80% of us.  So I think these numbers will help.  In the 2.5 years since I started this adventure I’ve made $20,000 total on 4 paid apps (and 5 free apps).  I just brought up Quicken and my expenditures were just around $1000.  This includes marketing and service providers.  It does not include the $3000 I’ve spent on development equipment (1 iPod touch, 1 macbook air, 1 iMac, 1 iPad).  The equipment I consider the “justification” for my development.  If I wasn’t developing, I wouldn’t be buying this stuff.

Here’s my AppViz report (and if you aren’t using AppViz… why not?).  Click on it for an up close look.

The graph points out a couple of things.  It only takes a few weeks after that initial release spike to dissipate.  Christmas time is always good.  Since April my sales have really sucked (this might be in part to the restructuring that PlayHaven did that impacted my visibility).  Tramp Stamp wasn’t quite the hit that I wished.  I hope this helps.  Let me know your definition of “indie developer” and how much you think we should be budgeting for salaries and marketing.  Am I your typical indie developer or could I be doing more?

Until next time….

Next Page →