Tuesday, December 31, 2013

2013: another successful year for The Little Crane.

I have proclaimed the year 2012 as The Year of the Crane. And 2013 was another smash hit year. A legion of people (a touch under 5M) downloaded the free version of The Little Crane That Could in 2013.

2013 2012 2011
iOS 3199K 3454K 1550K
Android 1579K 1656K -
Mac 53K 81K -
OUYA 15K - -
Kindle 95K - -
Rasp Pi 6K - -

Even though the game is now available for Windows and Ubuntu, they do not show up as those download counts round down to 0K.

These marvellous figures mean that the grand total for the lifetime free downloads of The Little Crane That Could is now a whopping 11.7 million. Thank you gamers! I look forward to bringing you The Little Crane That Could II in 2014/2015.

Sunday, December 29, 2013

Game Lobby

I am porting my game Buggy Bang! Bang! to Android. The leaderboard/matchmaking in Android has no NDK support and looks complicated. So I think I will need to roll my own online game lobby. I've written a leaderboard service before, in Python, for some of my earliest iOS games. It worked pretty well, except for the unreliable web hosting I have, causing outages of the leaderboards. Writing a lobby should not be much more difficult than a leaderboard service. I will write down my thoughts in this weblog.

  • I think this can be done based on UDP, to avoid managing connections.
  • When a client wants to setup an online game, it could send a datagram with its gamer tag and IP to the lobby server.
  • The lobby server can then respond when a second client sends a similar datagram, and create a match up between the two.
  • It would send the IP and tag name of each to the other, so that from then on, the match can be played peer to peer.
  • I would still need unique gamer tags. Where to get this? Use google plus account names?
  • Alternatively, I could have the server assign unique IDs for the first time a client connects, and cache the ID in the client for use with subsequent sessions. Then I could just skip the gamer tag altogether and make the ID user-facing. If the ID increments from 1, it may become a form of pride, like low digit slashdot user IDs.
  • What about NAT?

Monday, December 23, 2013

Emscripten

Could I possibly get The Little Crane That Could to run in a browser window? If a modest Raspberry Pi can run it, why not a 'lowly' browser?

Inspired by a blog posting from Dirk Krause over at web3dblog, I decided to look into this. And my weapon of choice: emscripten, because I grow fonder of the C programming language each year, and have no appetite for Javascript. Hurdle number one is the outdated build instructions on linux that I found here. So in this blog posting I will document the attempt to emscripten my game.

  • Instead of building llvm/clang from source, I simply install those from the ubuntu repository using 'apt-get install clang-3.2'.
  • It turned out that emcc cannot find llvm-link on my system. This is because ubuntu installs it as llvm-link-3.2 so this needs fixing.
  • Like clang and llvm, node.js can also be obtained from Ubuntu's repository using the 'apt-get install nodejs' command.
  • With those modifications, the compiler seems to work just fine.
    $ nodejs a.out.js
    hello, world!
    
  • To target ASM.JS you can use this command line:
    $ ./emcc -O1 -s ASM_JS=1 tests/hello_world.c
  • There is an emar archiver tool, but combining bytecode objects into an archive gives unresolved symbols when I link against this archive. fixed by using -L. flag.
  • You can put files onto a virtual file system using the --embed-file compiler flag. I've not yet figured out how to successfully use dlopen() though.

Lastly, these slides on an emscripten talk are very interesting.