This is the final part of my posts on the history of Boardz. I’m going to talk about the artwork and the server.
The artwork for Boardz was one of the most time consuming parts of the project. I made the wrong decision early on that I wanted to do all the work myself, including the art. I found a few pieces of free artwork on places like wikimedia commons, and bought some 3D models on TurboSquid, but the rest of the artwork was either drawn by myself, or generated on the fly procedurally. My approach to a lot of this was pretty unusual I think, mainly because I was trying to find the best solution that was within my limited artistic abilities. As an example, I knew I couldn’t model 3D chess pieces, so I bought a set of Staunton 3DSMax files, even though I was rendering the board in 2D, using OpenGL. To get the 3D look, I rendered the pieces in Max, then I took screenshots of the renderings and used them as sprites in the game. This worked pretty well, and I think my Staunton 3D set is one of the best looking sets on the App Store – it’s easy to see the pieces, without the 3D look making it hard to follow the game, and it looks very traditional. I followed a similar approach for other games such as Go, and did some rudimentary modelling for pieces in Shogi – the ‘squashed pyramid’ shape of Shogi pieces was just about within my modelling ability. The 3D pieces were in some ways easier to do because of this approach. The 2D sets were much harder. Although I could find free imagery for sets, I didn’t particularly like the quality of these images. I spent a lot of time fiddling with individual pixels in photoshop, playing with blending modes, and sharpening/softening images. I also spent endless hours tweaking filtering and rendering code to build up a 2D graphic on the screen that I liked. Fitting a full set of Shogi pieces onto a 320 pixel screen is particularly challenging – the Kanji characters in their full versions are very detailed and hard to see at that screen size, not to mention the large capture area required, and the 9×9 board. For that reason, I offered an optional reduced set of pieces with just the first character of the pair displayed – quite a common approach in the literature for shogi (newspaper columns often use a reduced set to document tournament games). I later realized that I could have easily generated Kanji characters at any resolution by simply firing up Word and typing them in, but this was much later in the project when I worked on the iPad version.
As I mentioned, I chose to draw all the artwork using OpenGL ES. For a 2D game, this is somewhat unusual, but for me it was a natural fit because I’m a 3D graphics programmer and most comfortable with 3D API’s. Had I employed an artist to generate all the 2D artwork, and made use of the 2D graphics API’s I suspect I would have completed the project sooner, and with less difficulty. Doing all the graphics myself meant I needed to work out how to handle animation, as well as combining iPhone 2D elements with my 3D renderer. All that aside, for future projects I will still draw everything using OpenGL, but also generate all 2D user interface elements in the same renderer. It’s really the only way to get a cross-platform game up and running without having to port all of the code.
With the pieces sorted out, I needed to draw the boards. This part was a little easier, and involved finding some woodwork art, and writing some code to draw the lines onto the boards procedurally. Being able to draw any size/shape of board in this way made it easy to offer different sizes of Go Board, and alternative games such as Mini Shogi. For the most part the wood textures looked good, although on later versions I dialled back all the wood a bit and added a nice green felt texture for the backdrop. I also added some small touches, such as fake shadows on the pieces, and scaling, etc. to give the illusion that the pieces were being lifted up/put down.
Before Boardz, I’d never written any web based code at all. Sure, I’d ran the odd sample ASPX demo and tweaked a little PHP code here and there, but apart from that I didn’t have the first clue about how to implement a server for a turn-based game. After a lot of research, I came to the conclusion that I wanted to do a RESTful API, with very minimal web front end; since everything would be communicated through the iPhone client. Installing and setting up a Linux server on a web host quickly convinced me that it was going to take a lot of maintenance, so I began looking around for easier solutions. At the time, Microsoft’s REST story was not complete and difficult to understand, and I was nervous about maintaining and hosting IIS on a server – not to mention my total lack of experience with SQL Server. At that point I discovered Rails, the web framework that runs on Ruby. The nice thing about Rails is the way it abstracts the database from you, and makes it easy to build an app without writing SQL statements or managing the database. For someone like me it was perfect, and after a few tutorials I was convinced it was going to work well. At the time, I decided to leave the deployment problem until later on, but I eventually found Heroku and didn’t look back. Heroku is a cloud host which makes it easy to deploy Rails apps; it’s one of the best pieces of software technology I’ve ever used – it’s trivial to get a Rails app running in the cloud, initially even for free. You don’t have to worry about packaging up your app for deployment, you just push your git branch up to their server and a few moments later you are live.
The problems I had with the server mostly came down to my lack of experience. I had some issues with my assumptions about how the Ruby language worked which bit me for a long time, and some problems with synchronising moves being made by the clients. It took a while to get the authentication working with HTTPS too – installing an HTTPS certificate on a website and communicating securely is a bit confusing when you first set it up; and you have to be careful to get it right! Getting the client to work with the secure connection also turned out to be very tricky due to the state of the SSL browser support in the phone – which was improved by newer versions of iOS and became a non-issue over time. To this day, the only real problems I get from users using Boardz are with the authentication/login. Mostly these are just problems with firewalls, etc., but in future I’ll try really hard to make the authentication use OpenID/Facebook/Google, etc. and remove myself from the equation entirely.
One amusing part of the server design was how to send end user emails upon registration. I worried about this for quite some time before using the Heroku Sendmail addon. My concern was that I’d run out of email budget for new registrations! I planned ahead, but never needed this functionality, since the app doesn’t create more than 10-20 emails per day…
Push notification support on Heroku was also pretty simple, due to the APN on Rails plugin, but it did add cost to the server, since I found I needed a worker thread to process game status and batch up the push notifications. I have a worker that does this every minute or so and sends out ‘it’s your turn’ messages for the games. In all, the Heroku server costs me around $60 a month to run, and I’m delighted with how it has performed – I haven’t had a single problem or outage in the two years it has been running.
In part 1 I covered the development of Boardz up to shipping the first version. I’d like to talk a little bit about the resulting reviews, and how these forced a course correction in the development. I don’t think this course correction was necessarily the right move on my part, but we’ll get to that…
Once I got the first version out of the door, the reviews started to come in. It’s pretty hard to live with bad reviews when you’ve put your heart and soul into a project, so I try to be fair minded and not lose it everytime somebody posts a less than happy response. The good reviews make it all worth while, of course. Here are a couple from the first version:
This app is really great when you want to play but can’t have a board standing or if you live far from each other. Stable with a nice and easy to use interface, it’s simply great.
I think this app has a lot of potential and is a good first start. A few things that would make it even better:
1. Ability to chat with your opponent. Maybe put the chat messages on the reverse side of the board.
2. Ranking system that you can start by setting yourself but will adjust over time.
3. Handicap system to go with the ranking system.
Overall though the best app out there for playing Go right now because you don’t need to stay connected the while time.”
Good reviews tend to fall into these two categories – they are either along the lines of ‘great, love it’, or ‘great, but wouldn’t it be nice if…’. I love getting either type, it’s a real validation of the work I put into these games. Now let us look at a couple of bad ones:
There is no computer AI in this software… you cannot play against a computer opponent. I have not used this game one time since purchasing/installing it. Completely worthless to me. Refund my money and I’ll remove this review. Yeah, I know… fat chance, right?
Be Aware: Bought by mistake as this is online game only!!!Need Internet connection to play with other people!!
So what’s wrong with this? Firstly, the reviewers plainly did not read the application description before downloading Boardz. They just bought on impulse, realized the app didn’t do what they wanted, and wrote a 1-star review (dropping my average star rating, and hurting sales). For the record, the first version of Boardz clearly described on the first line of the description that it was an app for playing turn-based board games with friends and family over the internet. There is no way you would read that text and come away with the impression that it supported playing against the computer. It is also obvious that the author of the first review didn’t go back and check what he downloaded before writing a bad review. There’s no excuse for the second reviewer in my opinion – he’s admitting he got it wrong, and then damaging my star rating just because he can.
Secondly, the comment ‘Refund my money and I’ll remove this review’ demonstrates a common misconception about the app store - that I can contact this reviewer or respond to his comment, and somehow pay him a refund. I have no way to reach a reviewer, unless he uses a username that matches something I have in the Boardz database, or is easy to google for (many reviewers use a made up name, or even random characters like a swear-bubble from Asterix…). I’ve actually expended effort in the past to track reviewers down, especially if they have a bug report I’d like to chase up. The most frustrating part about this App Store policy is when somebody leaves a bug report in a review. Typically you don’t get enough information in user reports and you have to chase down repro steps – which, of course, you can’t. I’d also like to respond to reviews like this one and say ‘hey, it says in the description what the app can do – is there some way I can make it clearer?’ As for the refund, contacting Apple will sort that out for you, but few users actually do that or even realize that it is possible.
The review policy does force a developer down one particular route – and end users might argue that it’s a good one. The only way to counter bad reviews is to ship a new version (which removes the previous reviews from your front page on the App Store) and add the features your users are asking for. A friend of mine in the industry once told me he had heard the best strategy for launching an iPhone game is to release it under a development name, read the reviews, fix what is missing, and then release it under a new name with everything fixed. He may have been joking, but it would certainly work. Faced with a mounting list of complaints about not being able to play against the computer, and various other requests such as in-game chat support, I decided to plough on and add these features.
Anyone who has written an AI opponent knows that it’s not a simple project. As of today, I’ve implemented a simple draughts engine and a very complicated Go engine for Boardz – something I’ll talk about in a later post. I’ve also used a couple of free engines for Chess and XiangQi, along with starting a side project to write a Shogi engine too. I didn’t really want to embark on this work, but I could not see any way to keep users happy without doing it. On reflection if I knew what I know now, I may well have ended the project at that point and left Boardz to fester as a purely turn-based internet app – what I’d always intended it to be. I could have used all that extra development time to start a new, more promising project. It’s really hard to walk away from your baby though, especially if you actually think it is a good product.
Along with the AI opponents, a new opportunity presented itself in the form of the iPad. After the announcement, I felt it was worth having a shot at building an iPad version of Boardz to ship on launch day. Since I missed the launch of the iPhone, it seemed like an opportunity not to be missed. Apple were promising to highlight launch day apps, and I could do with the exposure, so it was worth a shot. I worked tirelessly on a ‘Universal Binary’ version of Boardz – meaning that the same app would run on iPhone and iPad. The iPad version had larger, more detailed graphics, and a chat window alongside the board on the same screen. I learned the hard way while updating to the iPad version that a lot of my artwork was insufficient for the higher resolution. In fact, I suspect 40% of my time on the Boardz project has been dedicated to artwork, and tweaking the renderer to make everything look OK. Having an artist on board would have made my life a lot easier. Nevertheless, the iPad version did let Boardz shine in some ways – the Kanji characters in games like Shogi look especially good on the higher res display. I really enjoyed seeing that for the first time.
Despite the stress of development under a timeline while working in my spare time, I managed to ship iPad support on day one (even though I couldn’t actually see it for myself, Apple assured me they tested it and it worked). When I later got my iPad on UK launch day, I did spot some minor issues which Apple would undoubtedly have missed, but nothing that detracted from the utility of the App. Below is a graph from March to June, showing sales in 2010. Around the middle is the launch date of the iPad. You can see that with the new features and launch of the iPad I started to get some more traction; although in all honesty, such small sales numbers don’t justify any of this work. I also never really saw my app featured in any way on the app store, despite being one of the developers that followed all of Apple’s rules and got the app published on day one. Sure, ‘Scrabble’ had top-billing, but for the little guy toiling away on his app there wasn’t really any reward for working to this deadline. There was (as there is now), and iPad specific category on the App Store – but it was very crowded, as you’d expect, even on day one. I could probably have shipped a week later, and it would have made no difference.
No In Person 2 Player. Grrr….
Doesn’t work without internet connection. No way to play with 2 players on one iPad. I wanted to play against someone else on an airplane, but it wouldn’t give me that option.
What’s interesting about these reviews is that they are suddenly requesting using my app as a board, for situations where you want to play against another player and you don’t one. I guess it’s understandable on the new iPad format for people to want to do this, but curious that these two reviews arrived on launch day, almost immediately after the iPad shipped – not to mention the earlier problem that they just didn’t read the product description. On launch day, there were several other iPad apps that had just this feature – they provided a board to play on, but with no engine/rules. A cynical person might think that these comments were coming from my competition. Regardless if this is true or not, I had obviously missed the opportunity to provide the same functionality. Since it wasn’t too hard to do, I set about adding it. In fact, it made my app more desirable than the others – at least from a game play perspective, because you could have the engine recognize the rules and take pieces off the board for you – something the other apps didn’t do. Those apps did what I’d do in this situation – they made it a feature “Hey, you can even make up the rules!”, but I believe that’s probably not what you want most of the time. With that small addition, along with various other bits and pieces, I think I made a difference to Boardz sales that lasts to this day, but as I’ve said, it probably wasn’t worth the effort.
For an iOS developer, it’s a fast-changing world out there. If you’re a single guy, you could spend your life just keeping up with Apple’s releases of software and hardware. The next challenges to come down the pipeline were iPhone 4 and Game Center. iPhone 4 was pretty simple – the beautiful display on that device was easy to take advantage of, since I had most of the artwork I needed from the iPad project; the relative dimensions were very convenient for scaled up artwork. Game Center offered another opportunity to get front and center, by featuring my app in the Game Center app, and allowing it to spread a little by word of mouth. Along with Game Center, I even added the ability to post your victories to Facebook. Making Boardz more social seemed like the best next step in its evolution, but like the iPad updates, these changes gave me small bumps instead of the big boost I hoped for.
I’ve slowed down development on Boardz recently. It would be tempting to say there’s no point flogging a dead horse, but that’s not the reason. I just got tired doing 2 jobs, and wanted to simplify things for a while. That doesn’t mean I’m not plugging away at it, and as I mentioned last time, I’ve been looking at hooking it up to other servers on the internet instead of my own. Other features such as allowing the user to moderate the score in Go, and export SGF files, etc. are also very nearly done. Who knows, iPhone 5 might spring a surprise or two that I’ll have to deal with as well. As you may have gathered, I’ve committed the business sin of getting too attached to my product. I keep working on it because I love it (it’s still an App I use every day – as many users have told me they do).
Since this post has got a bit bigger than I anticipated, I’m going to save the ‘what went right/wrong’ until the last part. Then I’ll dig into a few of the interesting technical challenges I faced during the development.
I’m a fairly neutral guy when it comes to operating systems. I just use what I need to get the job done. I’ve recently had more of a bias towards Mac OS, simply because I find it clean and easy to work with. In fact, my advice to friends is usually to go buy a Mac (which is mostly not followed, since a lot of people can’t get past the cost of the things).
My day job however is on Windows, and there are lots of things to like on that platform – especially for a more advanced computer user who doesn’t mind a bit of configuration here and there, and getting their hands dirty. I also love the software technology on Windows – .NET, WPF, Silverlight, XAML, Visual Studio 2010, etc. As a software developer Microsoft really do spoil you for any other platform. XCode 4 is new and shiny, no doubt, but I for one don’t ‘get it’ yet. It would be easy to get religious about all this stuff, but in the end I mostly just want to get things done.
What does get me excited are new and shiny toys to play with. Windows 8 is certainly that. Once I saw the public developer preview release was up, I started figuring out how I could get it installed and have a play without trashing the rest of my box. Last night, I cleaned out a drive, formatted it, and installed Windows 8 on it. Reading the MSDN forums, some developers had trouble getting back to Windows 7 after an install on the same partition, and I figured the safest way was on a clean drive. The install went without a hitch and I now have a dual boot machine which lets me play with all the new goodies; VC 2011, Metro UI, Expression Blend, and all the new features in Windows 8.
After a few hours playing, and a late night to bed, I can say that Windows 8 is a lot of fun. The forums are full of people complaining about the start menu changing into a toggle for the Metro UI, and wondering where the program list is, along with various complaints about other changes. I’m used to switching paradigms, however, and I find the new system already makes a lot of sense. The provided sample apps all work more or less as advertised, and while they are obviously in need of some finishing touches here and there, they are pretty impressive for work by a bunch of college interns (who Microsoft drafted in to write them over 10 weeks). I don’t have a tablet to compare the experience on, but I’m already at the conclusion that Microsoft are going to nail this one. It’s no mean feat to make an OS that is confortable to use on a desktop machine and a tablet (not to mention the phone). If you haven’t seen the videos, it’s worth a trip over to http://www.buildwindows.com
I installed a bunch of different apps on the box to see if I could break it, and the only thing I couldn’t get working was 3DStudio Max, because I couldn’t get the installer to work. I imagine that will be easily fixed. It is a shame though, because with Max I could potentially have used the OS for real work and got used to it as I went along. I did like the windows dialog that popped up telling me that the installer was trying to add .NET 3.5, and was that OK?
One thing I don’t like so much is the domain setup. Although I installed VPN software just fine, it took me a while to get the machine onto our domain, and then to figure out you can ‘link’ your Live ID to that account. Mostly the problem was I needed to make my domain account an administrator for the box. I found the popup dialog with multiple login options a bit confusing – and annoying since it appears quite a lot, especially when you are trying to remember/figure out how to change the user privileges on the system. Yet again I found myself moving towards turning off the User Account Control so I could make the dialog go away. But after a while of figuring all that out, I had a Windows 8 box connected to VPN and getting email via Outlook 2010.
One thing that I really like is the generally snappy feel. Windows 8 certainly feels even faster than Windows 7 (which I think is pretty fast these days). I love the new file copy dialog with graphs of copy speed and progress. Copying a file of my NAS drive seems to go faster than I’ve ever seen it; I’m not sure why, but I do like it!
Back in September 2008, while the stock markets were crashing due to the banking fiasco, I started to think more seriously about ways to boost my income, in case things went pear-shaped with my job, or I found myself with some free time to pursue a project on my own. In hindsight I was panicking unnecessarily, but it was the perfect excuse to get into mobile development and scratch that ‘forming a company’ itch I’d had for a while. I had also bought an iPhone recently, and I liked it a lot. A plan was soon formed – I’d buy a Mac and build a simple iPhone app, getting my feet wet in mobile development. Maybe I’d even make a little cash on the side…
In this post I’m going to begin a short history of Boardz, my first app for iOS. Although Boardz is a pretty abysmal financial failure when measured against the amount of personal & family time I gave up to write it, I hope during the next few posts I can convey the fun I had in writing it, and the things I learned about along the way. Once I’ve described the project, I’m going to get into the specifics of how I tackled the technical aspects, along with the problems I created for myself.
The initial plan was pretty simple. I was going to write a compendium of board games, all of which were played in a turn-based fashion with other human players. I’d write a simple server where you could register and create games and challenge other players. The app would show you a list of the games you were playing, and let you play your moves. To keep things simple, you’d have 7 days to make a move before you were automatically resigned. Boardz was designed to be the kind of app you’d play while you were on the loo, waiting for a bus, etc. The sort of game where you’d keep coming back every day, or every hour, to see where your opponents had moved and play your turn. For reasons I’ll come to later, Boardz has grown into a set of games you can play in many different ways, including with computer opponents. I’ll talk about why I had to do that when we get to the app store…
I hoped that by offering a good choice of games, with turn based play, for a very small price ($1.99), I’d be onto a winner, despite the stiff competition from all the other board gaming apps out there. My initial choices for games were Chess, Shogi (Japanese Chess), XiangQi (Chinese Chess) and Go. The decidedly eastern flavour of the games was also part of the plan; I wanted to improve my knowledge of these games and play against human opponents, but I also thought this might distinguish the app from other board gaming apps out there.
I couldn’t see much wrong with this idea. All I had to do was learn to use the iOS SDK on the phone, the Objective C programming language, design all the artwork, learn the rules of the games I wasn’t sure of (i.e. all of them except Chess), and figure out how to create an online database and call it over the web (with no web programming experience) To make the project all the more interesting, I wanted to do all the work myself on evenings and weekends, and I wanted to get it done in about 4 months.
Shoot forward about 12 months and apart from being tired and feeling like I hadn’t seen enough of my family, I had finished the game (or so I thought…) A lot of different problems conspired to slow me down, but I got there eventually and posted it for the App Store approval process. I was dreading this bit due to all the postings on the web about how difficult it was to get through approval. I had a networking app that needed to behave correctly on Wifi, 3G, or with no connection, I had a bunch of board games that had to play well and by the rules, and features such as push notifications which had to play nice and work as expected. Not to mention a server which had only been tested with a handful of accounts created by my friends. I had not built the simple app I’d intended; Boardz had grown into quite a complex app for a single developer to manage, and I was nervous that the approval would fail badly.
In the end I shouldn’t have been too worried. Although it took 2 weeks for Apple to approve the app it got through without comment and I got an email saying it was for sale half way through a pint of ‘Copper Dragon’ at the pub. Receiving good news just after you’ve sat down in a pub for a night out is not what you need; trust me, the hangover is pretty bad afterwards.
The next day I signed into iTunes Connect to see if I’d sold any copies. I had! A single copy at $1.99. Sadly, that sale turned out to be the one my mate had bought while we were at the pub. I knew of course that apart from the ‘What’s New’ category on iTunes, my app had no exposure at all and I was going to have to do something I didn’t want to get involved with – Marketing.
I started by emailing everyone I could think of; gaming associations, friends & family, app review websites. Anything I could think of. The app review websites were interesting; they either responded by saying they had a large queue of apps to review and they may not get to mine, or that they had a large queue of apps to review and they would get to mine if I paid about $100. Although I’d started to sell a few copies per day, I figured paying for one review wouldn’t hurt, so I gave it a try, despite reservations that it shouldn’t be the way these things are done. The reviewer turned out to write a fairly honest review of my app – they tested it pretty well and got back to me for my comments before posting the review. The only major complaint was that a player couldn’t resign a game they’d created if nobody was joining it. I responded to the reviewer saying that feature was already in review at Apple, and hurriedly added it that night and posted an update to iTunes Connect. The resulting review was pretty fair for the first version of Boardz. I think it described the app well, and I couldn’t argue with any of it. It got 4 out of 5 stars (which to this day, depending on country, is what Boardz averages from users on the App Store). Despite a nice review and my continuing efforts to market the app through emails, twitter, a website, and a facebook page, I didn’t really see much change in sales. The truth is, I still don’t. I tend to sell around 10-20 copies a day, even of the latest version. Although these numbers aren’t great, there are several reasons that keep me going on this project, even if I’ve slowed down a bit recently to catch my breath…
I’m quite proud of the app; although I’ve done quite a few updates, it’s got through the App Store first time, every time, including major changes. I get very few bug reports, and the crash logs on iTunes Connect tell me that for most versions I’ve shipped a crash dump has never been gathered. It’s a difficult thing to be an artist (which I suck at), programmer, QA department & Marketing department (which I suck at), but I think I did OK.
I love that people use the app every day. I get really nice comments from users, feature requests, and a cool following of dedicated players. In some ways, that makes it all worth it. It’s hard to keep everyone happy, and I occasionally get stinker reviews; something I’ll talk about later. Sure, the artwork could be better, and there are features that some people really want (particularly the Go players!), but in general, I managed to find a balance between shipping builds and adding features.
Boardz has enabled me to learn to play all these games, and particularly introduced me to Go. Sometimes I think the whole project was worth it, just so I could see the magic in this simple board game. I suspect I’ll spend a lifetime trying to get better, and never reach single digit kyu. But I’m up for the challenge…
I understand a lot more of the market now, and the complex and simple reasons why I don’t sell a lot of copies, and I’ll cover that in my next post, along with the features I added after I shipped the first version, including updates for iPhone 4 retina display, iPad and Game Center.
For the time being, here’s a screenshot of the latest version of Boardz, showing off a brand new feature I’ve been working on adding: support for games played on the Dragon Go Server. It’s a game I’m playing against the sensei, and losing badly I might add! This is the iPad version, and as you can see the artwork has changed in subtle ways since that original version. You can click the picture to see it at full resolution.
Welcome to my new blog. Hopefully I’ll write something more useful than ‘Hello World’ in the next few days
I’m just figuring out the finer details of WordPress, Amazon EC2 hosting, and various other bits and pieces to get this blog up and running. I would appear to have a working website, so that’s a good start!