TapPhrase – update

I thought I might just write a little bit about my journey so far with trying to get TapPhrase into Unity to run as a Facebook WebGL game, rather than GameRoom game.

There’s so much I could write – but some major points here which I fell foul of (because of the WebGL decision):

  1. To minimise the initial download size of the app, use StreamingAssets instead of  Resources folders – as resources get bundled with the download.
  2. Storage on the web is predominantly in the browser’s memory, so (I believe) you end up using twice the memory for every asset. Thus, I reduced the number of music tracks significantly to reduce download size.
  3. You can only have 500 files in your Web GL zip file – so I’ve had to pack up my levels into groups of 10 or 20 and put them as streaming assets in zip files. I srtream the zip file (into memory), unpack (into memory) then delete the zip file, then convert images into Texture2D, then delete the unpacked files. Originally I had a beautiful background operation that would gently load the next few pictures in advance, but now I have an ugly loading/unpacking dialog.
  4. Unless you want to use fullscreen, make your own unity template in Macintosh HD⁩ ▸ ⁨Applications⁩ ▸ ⁨Unity⁩ ▸ ⁨PlaybackEngines⁩ ▸ ⁨WebGLSupport⁩ ▸ ⁨BuildTools⁩, and hack the index.html file so that you hide the full-screen button.
  5. Create an appropriately sized configuration in Unity with which to run your game – as you can see from this screen shot, I made a few mistakes. Screenshot 2019-08-18 at 13.58.51
  6. You may get errors that just don’t appear in the Unity UI while debugging – I got Error: Out of bounds Trunc operation” (evaluating ‘Module[“asm”][“dynCall_v”].apply(null, arguments)’) – This was because I managed to pass  NaN to Mathf.Lerp’s t parameter. It was quite hard to track down because the call stack gave no clue to the location in code, only what type of operation was being performed. I got lucky and guessed.
  7. Storage of player data – At first I used Application.persistentDataPath  and extra calls to a file sync operation call out to Javascript –[DllImport(“__Internal”)]
    private static extern void SyncFiles(); – calling out to HandleIO.jslib, but
     then you can get warnings telling you that you’re calling file-sync too many times. I then had a facepalm moment and realised that of course, that’s saving player state within the browsers memory/cache. If they log in to facebook with a different computer or browser, that game state is NOT going to be there. So I’m now looking at alternatives like PlayFab (free).
  8. I was hoping to not bother with in-app purchases and just use advertising revenue as a little mini-income stream. It gave me a few quid each month on iOS, not anywhere near break-even, but something that helped. However, Unity’s advertising api doesn’t support WebGL! WTF! So that’s out of the window. I’ll have to go back to in-app purchases and learn facebook’s payments API. Or give another game away totally free.
  9. I think next time I’ll stick to mobile or try GameRoom. Instant messenger games have some appeal, but you’re limited to 200mb.

Until the next update!

TapPhrase – the lowdown

TapPhrase is a free game developed solely by myself; art, original concept, heavy testing and design input provided by Kevin Craven. It’s available on iPhone, iPad and iPhone touch devices running iOS8+. This article describes the game, how it evolved, the approach, and thoughts for the future. If you want a quick taster – see this gameplay video.

What is the game?

Well, if the above YouTube video has failed, TapPhrase is a two dimensional ‘guess the phrase’ game, where you guess the phrase as quickly as you can to earn stars to unlock more phrases. The generic game concept is inspired by shows like CatchPhrase and other games like What’s the saying?

The stars can also be used to buy in-game helpers such as keys and trashcans. Keys place a correct letter in the slot, and trashcans delete a letter that isn’t required.

Every day you play TapPhrase you receive a free daily spin token, which allows you to play a huge wheel of fortune. This can reward you with free stars, trashcans or keys. You can also discover by playing (or replaying) levels one of four pieces of a wheel which crash-land into place, as seen in this video.

The overall feel of this game is supposed to be a 1920s cinema, embodied in the quirky tutorial with crackly Queen’s English voiceover.

Game motivation

I’ve been stuck in the narrow Microsoft world for a long time, developing desktop business applications. I’ve also dabbled with hybrid mobile business apps using HTML/Javascript and it all felt a bit of a ridiculous process. The promise of cross platform delivery typically sacrificed any benefit due to the complete inconsistencies with the host operating system UI principles. I’ve always wondered what the Mac development ecosystem felt like without being numbed by cross-platform libraries or layers. I’ve also a huge history of games and gaming. I developed many small games from the age of 8, on my Acorn Electron and through to University in 1994 I joined an international group called ANGLE, developing “Portals” – what we would call now a world travelling Diablo style MMO RPG. #wayaheadofitstime but it didn’t publish.

At first I wanted to do an iOS business app, but started to fall asleep. I found more enthusiasm for building a game, yet I needed a simple starting point, however, I realised I really suck at art, really. I wanted to make a game that I would enjoy playing and doesn’t take advantage of the user with harsh in-app purchases and adverts. And if we can, even inject moments of delight (e.g. in the video above you can see the tiles move freely at the end of the phrase like a spirit level, for no actual game reason!).

Luckily a friend (Kev Craven) had spent his evenings for the last two years drawing a common phrase and posting it to twitter/facebook. He’s had moderate success and I wondered if we could turn that into something bigger, so we got together and worked on delivering this to a mobile app to make it more interactive.

If you’re interested, the kinds of games I love and have played the list is endless but big highlights are Chuckie Egg, Elite, Cannon Fodder, Resident Evil, Max Payne, Half Life, EVE Online, Lord of the rings online, Broken Sword, Diablo, COD, SOCOM, X-the threat, Civilisation Flight Sims, Bejewelled, Starwars Galaxies,  Guild Wars, Forza, Project Gotham Racing, Syphon Filter, Tom Clancy’s Rainbow 6, Ghost Recon, Kings Road, and even FarmVille.

Fears & Rewards

What’s been the most frustrating point looking back is that both of us were probably too defensive and protective of our rights, IP and revenue protection. Even though our initial remit was to bring the art and fun of his concept to more people, and money wasn’t actually the initial driver, it’s only natural that when you formalise things, develop in-app purchases, look at competing products, and integrate advertising that you start to wonder ‘if this thing goes big, we want to maximise our rights and revenues and protect ourselves from liability’. 6 months after release and less than 50 downloads we’ve made less than $10 revenue, so we shouldn’t have worried so much. I went to great lengths, to limit liability by setting up a Limited Company, creating formal agreements, company bank account, learning basic accounting – all these activities are not making sense currently.

The biggest reward has been the positive reviews and feedback. It’s great hearing from people who genuinely love the game.  Its pretty awesome to say “Hey, have you seen my game” and their jaw drops at the fact you have released a game to the AppStore.  It’s also incredible when you get unsolicited feedback from people you know, I remember one colleague saying “Hey we all huddled round a table and played your game in the pub last night, it was good fun!”. – That’s a great reward.

There’s been one negative review, and my philosophy (thanks Kev) is that bad reviews is still publicity. I do however wish the review had something constructive and useful that could help me better the game, given that they spent part of their life they’ll never get back, but alas it’s a typical butt-hurt review.

Adverts & In-App Purchases

Both Kev and I hate ads and in-app purchases, but couldn’t see a way of recouping some kind of financial reward for our efforts other than to include them.

So we tried to make the game the priority, not our pockets.

Thus, full screen adverts happen every 5 minutes, and never appear during a level. Banner ads also only appear when the game level is finished. We’ve also incentivised advertising, so if you click on the adverts, you get some coins. We also decided that the user was quite entitled to play the game without a data/wifi connection, and didn’t nerf the game if we couldn’t get adverts (which some apps do).

As for in-app purchases, we thought it’d be rude not to have them as an alternate way people could donate some money to show their appreciation. We feel that if you like this type of game, you’ll probably never need to buy an in-app purchase. Hell, you can even find all the answers on Facebook if you look hard enough! But that would spoil your fun.

You can wait for your daily spin and share a failed level on Twitter/Facebook for more coins, so really, there’s little need to buy the in-app purchase unless you are really really keen – which means (we hope) you’re probably getting your money’s worth.

Menus are so 90s

One of the things I wish I’d have realised earlier is that structured menus are completely unnecessary in games.

I started off with the typical systematic breakdown of game functionality and created unnecessary barriers to start the game, to buy in-app purchases and reach other aspects of the game, such that some people didn’t actually know how to start playing!

Simulator Screen Shot 19 Sep 2015 12.56.38 Simulator Screen Shot 19 Sep 2015 12.56.44 Simulator Screen Shot 19 Sep 2015 12.56.58

We haven’t got rid of the menus, but we’ve made a few tweaks to hold a glass up to our intent; the first time you start the game, when you press START you are flung straight into a tutorial.

When you finish a game you can click on the traditional ‘+’ icons, to visit the store or spin the wheel, instead of being forced to navigate a maze of menus.

Simulator Screen Shot 19 Sep 2015 12.58.20

Ideally we’d like to get rid of all menus, and you should be able to perform all required actions (even visit the ‘about’ screen) from where you are.


Who likes testing? I don’t think anyone does. As you may have already read, my previous post about choosing iOS, focusing just on iOS allowed me to complete the game efficiently by limiting the matrix of testing of just one platform. However, I don’t have lots of devices, and the most important thing I learned is….

Not everyone does what you would do.

This isn’t just about the way you play the game, but the way you use the device. E.g. do you like to play your own music or have your device on silent? Do certain apps send push notifications which can disrupt yours? Do you have low memory conditions? Are you always switching between text messages or other Apps, what does that do to the experience. This led me to make sure that TapPhrase doesn’t stop your music, that you can play your own, that your audio settings are respected, and that the App behaved as users would expect it to.

The top tip here is, get it tested by humans that aren’t you.

I also found valuable feedback on reddit, where users helped provide crash reports and gave me really honest opinions.  TapPhrase is currently crash free because of this.

Art work and music

Most of the artwork is hand drawn by Kevin, but some of the early art wasn’t. I hunted high and low for music and art to get the concept going. I learned that free stuff isn’t really free, first of all there are licence conditions attached which you have to be really careful about, and can cause a burden to your processes; secondly you spend a lot of time wading through rubbish to find something of good quality. I’ve written before about Free and Open Source Software, and will be writing more about this soon.

I spent a long time finding the right music and worrying about licence agreements of code and assets. – Necessary precautions in todays litigious world.

Obviously there’s a Facebook and Twitter account, but apart from that, the following marketing antics have been employed (to very minimal success).

  • Having a orchestrated marketing plan of what to do every hour after release for the next few days.
  • Tweeting those who helped/inspired the game creation. This exposed me to about 100k eyes.
  • Tweet and mention the authors of the FOSS content you’ve used – that’s nice for them and potentially good for you too.
  • Enter discussions around the topic of your game or similar games and subtly include your game.
  • Engage with the online discussion forums to get early feedback on your game.
  • Submitted to game review sites (no luck).

Indicating that either TapPhrase actually sucks, and everyone is being nice to us; or, this is a heavily saturated and competitive market with fewer customers than we’re told. Alternatively I’m just bad at PR!

What I’ll need to do soon is hook up the App-Preview video and release some fixes for iOS9, plus Kev’s working on a high quality video we can promote through Facebook or Twitter.

We do get requests to port the game to Android and Windows Phone, but speaking to other developers, they consider about 200k downloads to be the point where they’d consider it. #notthereyet

Historical graphics

TapPhrase didn’t always look this pretty – check out these early screenshots!

Screen Shot 2015-09-19 at 13.29.03 Screen Shot 2015-09-19 at 13.29.18 Screen Shot 2015-09-19 at 13.29.33 Screen Shot 2015-09-19 at 13.29.50iOS Simulator Screen Shot 2 Jun 2015 18.30.55

And check out some of the designs and discussion boards we used to communicate needs/ideas.

dimensions 001 ShowTimeFeedback1.001 TapPhrase.Screen discussions.001

And here’s two HUGELY significant graphics….

The first time the new logo is used to represent the game.. Gave us a massive boost.


The first approved submission to the App Store!

Screen Shot 2015-06-06 at 10.51.46

The unusables

There are a number of TapPhrases we couldn’t use, for instance a picture of the band KISS is used twice, but we didn’t want to even get into the legal wrangling of that one. There are about 25 TapPhrases whose answer was too long; more than 24 letters (3 rows of 8). For instance, here’s one of my all-time favourites..


(Crouching Tiger, Hidden Dragon)

As you progress in TapPhrase, you’ll are able to unlock a pack of full colour TapPhrases – a rare stint where Kev wanted to spice the images up a little.

We might put a few of these unusables in the game at some point, if it becomes popular.
How long did it take to make?
Well, given Kev created around 750 TapPhrases, (609 in the game), we can estimate that the base effort is around 750 hours.

Then we include all the icons, movies, rework, curtains, the EPIC wheel of fortune, discussions. His contribution alone must be over 1000 hours.

Mine has been pretty much nearly every free minute of my lunch break, most evenings and weekends (the fiancé works some weekends, enabling this), I even took a week off work to move the game forward. So probably about the same as it’s taken a year to date, so over a thousand hours and about £1000 to get the MacBook + subscription to Apple’s developer programme.

In the process I’ve learned how to use a Mac, Xcode, crash log analysis, performance profiling, the App Store/ITunes Connect, objective C, and SpriteKit + supporting frameworks. The hardest bit has been to integrate with the Apple in-app purchase mechanism, it’s much harder than it should be and the documentation is quite misleading or poor. Audio was much easier to implement than anticipated, and so was social sharing and adverts.

I’ve also been giving back to the community on stack overflow and blogging topics.


TapPhrase wouldn’t be possible without friends, family, understanding partners, work colleagues, the friends at Kev’s Church and the randoms on reddit. But I’d especially like to thank the Beta Testers as captured below in an early tweet. But a special mention should go to our biggest fan , who eagerly awaits all level packs and retweets, shares, comments, added a review and even provided crash reports.

Screen Shot 2015-09-19 at 14.04.22

The next time you see someone trying to share or tweet or post about a game, help them. It’s hard to get noticed!