10tons is a multiplatform game developer based in Finland and we create games in C/C++ using industry standards such as OpenGL ES, LUA, OpenAL, and so on. On top of that we have our own proprietary game engine. This way we can quickly and efficiently enter different platforms and ecosystems; iOS, Android, Windows, OS X, Blackberry 10, Windows Phone 8 - you name it.
We're always probing for new opportunities and with some minor mobile platforms in decline, we decided to take a look at the microconsoles. There's a lot of buzz about them, and Ouya is clearly one of the leading devices. We did some more digging and learned that it wasn't completely uncommon for a good title to sell a few hundred copies. If we could do something similar, we could cover around a week of development (mostly porting) and maybe turn a small profit.
We chose Tennis in the Face to be our first Ouya game. The game debuted on iOS in January, and has been doing nicely on ten platforms. Tennis in the Face is a humorous bouncer type physics based puzzle, where a former tennis pro Pete Pagassi takes vengeance on an evil energy drink corporation. Lots of cartoony ragdoll mayhem ensues.
Once we got our Ouya dev kit we decided to see what happens if we try to run a basic Android build of the game on the console. The game started, but the frame rate was about 2 fps and there was no sound. No biggie, we expected as much.
We got the game running properly with roughly a day's work from a single programmer. The try-and-buy structure required by Ouya was already in place, as we have that on the Windows 8 and Windows Phone 8 versions of the game.
We also had the basics of physical controller support in place in our framework, now we just needed to flesh it out. We knew we'd have to add proper highlight graphics for menu interactions, fine tune the gameplay relevant settings (like analog controller dead zones) and plug it all in with the Ouya SDK.
For gameplay, we ended up adding a big 'ol crosshair even though Tennis in the Face by default features a pixel perfect aiming line. We originally assumed we'd just have the player rotate the aiming line, but we didn't get it to feel right. The crosshair solution felt instantly better.
This is where we started getting a bit ambitious. The game's UI (on screen pause and restart buttons and such) is designed to work well with touch screens and computer screens with a mouse. It's far from optimal on a console type setup. We also saw some internet grumblings about overscan issues on Ouya ports.
While we had already spent roughly two working days on the Ouya port, and didn't expect a lot of sales on such an emerging platform, we decided to do the port right. We replaced the game UI with Ouya-specific button graphics and added a zooming feature to cope with any overscan issues. Another two days of development, but now we felt confident the quality is high enough that the numbers we'd eventually see would not be hindered by sloppiness of the port.
We submitted the game to Ouya's certification and after a day or two received an email letting us know the game had failed due to a crash issue. We were a bit stumped. We had tested the game quite thoroughly both automatically and manually, and it had never crashed on us.
What's notable is that Ouya's email bearing the bad news was probably the friendliest and most enthusiastic such notification we've ever received. Not only were there a description and logs of the crash, but plenty of kind words about how fun Tennis in the Face is and how excited the Ouya people are about the game.
The trouble was we had very little idea about what the crash was about and couldn't reproduce it at all. So we fumbled in the dark, nudged the code around a bit and resubmitted. Another fail, the crash hadn't miraculously gone away. By this time we had engaged in a friendly dialogue with Ouya and they made good attempts at helping us track down the bug. However, the bug remained elusive.
After several days of intermittent bughunting and headscratching we narrowed down the crash to something related to restarting a level. It turned out that if you played a level, exited back to the map view, re-entered the same level and then restarted the level before hitting the first ball the game would crash. Gotcha!
So how did a crashbug survive in a game that had been out for more than six months on ten platforms? It came down to the UI work we did. In the stock UI we had in the game, the restart button is hidden until the player hits the first ball. On Ouya the restart is bound to the Y button of the controller, so the player is able to trigger the restart event at any time.
There's a bit of code in the game which draws the trajectory of the previously hit ball as a dotted line so that the player is able to fine tune his/her shots. This is integral to completing the levels perfectly. That bit of code crashed the game if it was reset before it had done anything – and binding the restart feature to the controller Y button allowed the player to do just that. D'oh!
Once the bug was finally found, it was a trivial effort to fix it. By this time we already had a version cleared for release, as we and the people at Ouya agreed that the bug was rare enough to not be a showstopper.
Unfortunately the Ouya developer portal doesn't allow updating an unreleased game, so we released the still bugged version in order to be able to submit the fixed version. In hindsight we shouldn't have done that, as it looks like quite a few people are still playing the bugged release version. Update notifications are probably one of the features the Ouya console UI team is yet to implement.
It's still way too early draw any conclusions about the sales, as Tennis in the Face has been out on Ouya less than a week and is yet to appear on the console's discovery UI. The current numbers are: Around ten dozen downloads with a 12% conversion ratio from free to paid at a pricepoint of 2.99$. Initial player feedback has been very good as well.
I hope you were able to take away something from reading this, and don't forget to check out Tennis in the Face!