dominik wagner

Letterpress vs Lost Cities - turn based design study

You probably have spent the last 2 days playing the excellent Letterpress from @atebits. A truly fantastic, simple, minimalistic, quick to learn, quick to play wordgame. If not, then grab it now. You might also have noticed that the game is using the Game Center turn based API, which probably doesn't ring favorably in your ears. Why is that so you might ask, atebits does have significant experience with networking. That is because it's not about atebits, it is about Game Center, and the design limitations it sadly introduces.

Having done an implementation for our latest game Lost Cities I thought it is fun to compare the design decisions and directions of @lorenb vs ours. It might prove insightful to you and others, especially because turn based Game Center done right is really tough.

tl;dr: Game Center has major issues. Letterpress mostly did go one way where Lost Cities did go the other. Both valid. Both with drawbacks. Apple would need to address much of the issues, however, in my opinion going with your own server infastructure can significantly improve the user experience. Please go out and buy both games to give Apple some real usage of their turn based servers. Despite my bickering, they are still tons of fun to play.


Letterpress went with the direct online game only approach. No local games, just online. The game list is your central entry point for the app. Your running games are on the top with the games it is your turn in listed first. Games that ended are at the end of the list. Essentially the list the Game Center API is giving you, presented in a very nice custom view.

Lost Cities is more of a full fledged boardgame conversion. We have several AI opponents as well as online multiplayer. Therefore the game list itself is not on the first screen. However, we have a continue button showing the next game that it is your turn in on the apps main screen to give you direct access to the next game. If you go into the game list, we have 3 sections: Online Games, Local Games and Recently Finished Games. The running online games are more or less feed by the Game Center turn based API's games, the local games are stored seperately, and the Recently Finished Games are just stored on the device, not on Game Center anymore.

Why is that so? We decided early on that we wanted the experience to not depend on online connectivity, so we introduced a caching layer inbetween Game Center and us. This caching layer lets the user play when Game Center is still connecting, but we already have games downloaded. This caching layer also introduces quite a bit of complexity in handling all the necessary cases.

Detailed scenarios

Incoming Invitations

Letterpress: invitation notifications are shown as push notification even if the app is running. Even after that the game might not turn up in the game.

Lost Cities: the same.

Game Center Details: somebody decided that invitation pushes should appear always. But someone also did not make sure that the game the invitation is for is present in Game Center when this notification arrives. So we have this awkward situation where the notification arrives, but the game hasn't. This can be seconds or minutes and is confusing to everybody.

Entering the app via a push notification

Letterpress: nothing particular happens, the app is starting up and showing you the state it was in, or the normal app start. However, it shows you a progress indicator, indicating some form of communication with Game Center.

Lost Cities: at first: nothing particular happens. When the Game Center API decides to tell that you are you and everything is fine, it tries to jump directly into the game the notifications was for. That is on iOS 6. On iOS 5 an elaborate amount of guesswork is taken to put you into the game that you might have touched the notification of.

Game Center Details: if you start the app or re-enter it from the outside, Game Center itself needs you to reauthenticate. This might be quick, or might take long. However, only afer Game Center is authenicated you get any information whatsoever about Game Center and Game states. This is a significant lag, in which you can do nothing in particular to serve the users wishes. After that lag you might get a callback that tells you if the user entered the app via a notification, but you also might not. If you take the user to the game like Lost Cities does, the user might already have moved around in the UI on their own, and you might confuse them. If you don't you might too. Also you might have badges on the outside, but for a long time no next game on the inside. Tough luck to you.

Potential Solutions: Apple needs to do away with the authentication stuff. This always has to return immediatly if the user is already signed into Game Center on this device. Apple also needs to give the target of the push notification on startup so the app can immediatly jump into that game and not waste a second on waiting.

Making a move

Letterpress: directly shows a progress indicator. Showing the user that it is trying to send out a move. If it doesn't go through, an error is presented. This has the advantage that a user can be absolutely sure the move has gone through if they send it. However, if the network is behaving badly (or the Game Center infrastructure) then the game is stuck at this point for now.

Lost Cities: lets you make a move no matter what. It also gives you no feedback whatsoever about the network conditions. It hides this stuff from the user. If a send turn fails, it is tried again later. If the user leaves the app, the turn might not have gone out, but in that case the badge on the app will prompt the user back to open the app, which in turn will try to send out the move again.

Game Center Details: Game Center has some amount of error codes it gives back on sending out a turn. However, they are almost undocumented, so there is no way a sane programmer can react specifically and rightfully on them. In my opinion they are also too cryptic to present to the user. Game Center also doesn't allow you to make a move if the authentication callback hasn't come back yet. E.g. if you quickly jump out of the app and then back and make a quick move, you might have been quicker than Game Center.

Potential Solutions: Game Center should only check for programmer errors, then and only then specific documented errors should be returned. If there are none, Game Center should take the move, and act as if that move was made. If it encounters networking errors, it should just cache and ensure the delivery afterwards.

Creating a game

Letterpress: opens up the Game Center matchmaking dialog. With all its strengths and weaknesses. It will profit from improvements along the line.

Lost Cities: doesn't show the Game Center matchmaking dialog at all. It fetches and caches the Game Center friends, aliases, avatar images and provides a custom UI. It is quicker to load, but it e.g. cannot show you, which of your friends are already playing the game because this isn't exposed in the API.

Game Center Details: IMHO the Game Center matchmaker dialog is a really really bad user experience. If you have seen it, it is a mess. The Invite Friends button is way to close to the Play Now Button. You can't tap the Auto-Match icon to choose a player. When you press Invite friends then the list of friends slowly loads from the server, the avatar images slowly afterwards. If you select a player, and then another one, you get an alert - even in a 2 player game where the tick mark should just select the other player. You can edit an invitation text that only ever is displayed in the notification center, nowhere else. The dialog looks almost the same for synchronous games as for asynchronous, but behaves quite differently.

End of Game - Rematch

Letterpress: if it is your turn, the game ends after you submit your turn and a dialog is presented. The game moves to the finished game part. If it isn't your turn, the game just disappers there too.

Lost Cities: makes sure the user has seen the end of game screen. After that a rematch question is asked (both parties) if both parties say yes another game is started. If one says no the game is ended. The way we implemented this is oblivious to Game Center. As far as Game Center is concerend the game is still running and the same one as long as nobody leaves or says no. This might bring Lost Cities into trouble when more of the state of the Game Center turn based matches is exposed in standard UI, but it allows for the feature at all.

Game Center Details: iOS 5 didn't allow for any kind of rematch via API. iOS 6 added an api call for a rematch, but I'm unsure how the semantics really work and at this point almost sure that you still have to implement a way of asking both parties if they like a rematch.

The Application Badge

Letterpress: maybe slightly higher than the amount of running games that need our turn.

Lost Cities: sometimes just for a short moment slightly higher than the amount of running games that need your turn.

Game Center Details: this is a nasty iOS 6 bug in Game Center. If you decline and remove a game there are edge cases that make your badge count stick at more than 0 if you have made moves in all your games. In Lost Cities we boldly set the App Badge ourselves for now, until the problem is alleviate.


Two different approaches: One to hide as much Game Center as possible. One to make it front and center, and give the user a chance to experience the issues and handle them manually. If Lost Cities has issues, you probably have to wait for the next update. If Letterpress has issues you can kill the app, and you are probably fine.

Both ways are in some aspects undesireable. Both ways are superior in some others. The main issue is the underlying technology that does not give the kind of quality we would need. Although it elevates us from providing our own gaming servers. Which is a huge aspect, one which made us choose Game Center Turn Based. However, if we were in the same situation again, we probably would go for our own infrastructure.

<< Apple's no internal client syndrome Official App Pages >>