Hello Instant Games X (IGX) SDK

Welcome to the web wrapper to wrap them all!

IGX SDK

IGX SDK


Hey fellow game developers. I’ve spent the best part of this last year researching, analysing and developing games for the Facebook Instant Games platform. Whilst it has been incredibly fun it has not been profitable, in fact I have lost a lot of money. Even so I still have faith in the platform and I do believe that one day it will come through for indie game developers trying to break through.

With this in mind, I’ve spent the best part of the last month working on something interesting and useful that I hope Facebook Instant Game (IG) developers and web developers alike find useful, hopefully encouraging more game and entertainment app developers to come to the platform, as well as give existing developers another way to monetise their instant games elsewhere.

Now I’ve explained the inspiration behind the creation, I will explain a little more about it.

I have created an open source layer called IGX. This is an SDK that has multiple purposes:

  • Bridges the gap between Facebook Instant Games and the web, allowing Facebook Instant Game developers to deploy their games to web and monetise them with little to no changes
  • Enables web game developers to include support for Facebook Instant Games before deploying to the platform
  • Enables all developers to use a common API which allows them to deploy their games across many web portals and provides common game services
  • Extend the IG platform, providing new features via other services

What is IGX? It is basically a complete replacement for the FBInstant object, so you can drop it into your code instead of linking to the FBInstant SDK CDN and your game should just run outside of the IG platform. IGX is based very heavily on two concepts, services and vendors. A service is a feature such as login, payments, ads etc, whilst a vendor is the provider of a particular service. For example, PayPal is a purchasing vendor. Note that some vendors provide many services, for example Xtralife provides user management, leaderboards, back-end storage etc..

You have some minimal setup to carry out depending upon which services and vendors you use, but once set up your game will deploy to that specific platform using all of its features.

Note that not all features of the Facebook Instant Games API are supported but most are. Take a look at the Github repo for more details. Also don’t forget to check out the Wiki.

Note that IGX is still very heavily in development so new services will be added over time. If you find a service that you would like adding then please get in touch with the details.

A new version of Booty5 the free HTML5 game editor will be released in due course with full support for IGX and easy deployment.

Join the IGX SDK community on Facebook.

Booty5 HTML5 Game Maker Update – Support for Facebook Instant Games Added

Facebook Instant Games Support

Finally released the latest version of Booty with support for Facebook Instant Games. Within the Booty5 engine you will find a new class called Instants which is a small wrapper around the Facebook Instants SDK. Games exported from Booty with Instants enabled in the settings will automatically initialise the Facebook Instants SDK and download all preloaded global resources, note that you will need to download any scene local resources yourself after the main download.

To make your project Facebook IG compatible simply tick the Facebook Instants check box in the projects settings then enter the local launch URL into the Host box in project settings, e.g:

https://www.facebook.com/embed/instantgames//player?game_url=https://localhost:8080/

Dragon Bones Animation Support

Unfortunately you cannot edit Dragon Bones animations within the Booty5 editor but you can add the associated PNG, skeleton and atlas JSON files that are exported from Dragon Bones to the editor as resources and access them from within code, e.g:

// Parse dragon bone data
var factory = dragonBones.b5Factory.factory;
var skel = JSON.parse(b5.Utils.resolveResource("my_skeleton", "raw").data);
var atlas = JSON.parse(b5.Utils.resolveResource("my_atlas", "raw").data);
factory.parseDragonBonesData(skel);
factory.parseTextureAtlasData(atlas, b5.Utils.resolveResource("my_texture", "brush"));

// Create an actor containing the dragon bones armature and attach it to a parent actor
var dba = factory.buildArmatureDisplay("name");
dba.animation.play("anim");
dba.x = 0.0;
dba.y = 0.0;
ParentActor.addActor(dba);

I will in the near future wrap the above into the engine / editor to make it more readily accessible, as well as add the same support for Spine.

Other Stuff

The editor has had a whole host of bug fixes and additional changes to keep pace with the Booty5 game engine. See the Booty5 game engine for more details on those changes.

Upcoming Demos and Documentation

Over the next few days I will be releasing the full Booty5 projects for some of my recent Facebook Instant games so you can use these as a reference / starting point. These games cover many areas of the Facebook Instants SDK including displaying ads, using in-app purchases, submitting leaderboard scores, grabbing and displaying leaderboard entries, inviting other players to play, sharing progress, switching contexts and posting updates to Messenger.

The following full projects have been uploaded thus far:

You can grab the latest version of the Booty5 Game Maker from the Booty5 website.

I am still in the process of updating documentation, I will post details here once that is finished.

Booty5 HTML5 Game Engine Update out – Facebook Instant Games Support Added

It’s been a long long while since I put an update to Booty5 out so I thought it time. I have been playing around with Facebook Instant Games over the last few months so I added support for Facebook Instant Games to the Booty5 engine. You will find a new utility class called Instants that wraps up the Facebook Instants SDK. This has been tightly integrated into the loader for the Booty5 game editor. I will be releasing the updated version of the Booty5 editor with direct Facebook Instant Games export support very soon. Along with that I will be releasing the source to some of my games to help developers learn how to use the new features more easily. The complete list of Booty5 engine changes (v1.5.5) include:

  • New hit property added to Actors. If true then will be included in hit testing
  • New dock_screen property added to Actors. If true then docking will be to screen edge instead of scene edge
  • New padding property added to Actors. Text padding (used when caching)
  • New scale_method property added to Actors. Scale method used to fit actor to screen
  • New draw_reverse property added to Actors. If set to true children are drawn in reverse order
  • New _av property added to Actors. This will set active and visible states at the same time
  • New method removeAllActors added to Actor which removes all actors from the actors child list
  • New getSlot and moveToSlot methods added to Actor which allows you to query a child sort index and modify it
  • New overlapsRect method added to Actors which checks for a rect area overlapping the Actors rect area
  • New circleOverlaps method added to Actors which checks for a circular area overlapping the Actors circular area
  • New circleOverlapsRect method added to Actors which checks for a rect area overlapping the Actors circular area
  • New fullCircleOverlapTest method added to Actors which checks for a circular area overlapping the Actors circular area (taking into account transforms)
  • New stroke_filled property added to all Actor types which if true will cause stroke will be drawn
  • New line_height property added to LabelActor which specifies the height of a line of text
  • New _text property added to LabelActor which sets the labels text and updates its cached version if cached
  • New deactivate property added to Animations. When set to true deactivates and hides target actor when its done (default false), should only be used with actors
  • Many new easinng funnctions added to the animation system
  • App canvas_width and canvas_height now known as design_width and design_width
  • Fonts now added to the app as resources, the underlying font loaded uses the FontObserver lib to load fonts
  • Raw JSON resource type now added to the App
  • New started property added to the App which is a callback that will be called when the app starts
  • All App resource containers are now objecsts instead of arrays
  • App waitForResources now calls a supplied callback to alert the user of progress during loading
  • App main logic loop is now ran on requestAnimationFrame
  • New draw_reverse property added to Scenes. If set to true children are drawn in reverse order
  • New _av property added to Scenes. This will set active and visible states at the same time
  • Added new Task type called TaskQ which is a collection of tasks that are ran serial. Only the first task in the queue is ran, once that tasks is complete the next task in the queue is ran.
  • Resources now checked for load failure and attempt to reload a number of times before giving up
  • Value passed to Actor _atlas can be an atlas object or the name of an image atlas brush
  • Calling playAnim or playTimeline on an inactive or invisible Actor will make activate it and make it visible
  • Hit tests are no longer carried out on inactive Actors
  • Fixed Actor _scale property so that it now updates the main transform
  • Fixed virtual Actor margins
  • Action lists are now optional component and not included by default
  • Support for Facebook Instant Games added

Please note that this version of Booty5 may not be completely compatible with your existing code so back up before trying it!

The complete source to Booty5 is available on Github here.

I will update the game editor, documentation and e-book in the near future.

Oh I also have a Dragon Bones lib coming soon too.

Simple Web Audio Wrapper

Seen this question asked numerous times, how to set up and use the Web Audio API, so I ripped some code out of my engine Booty5 and slimmed it down a bit and here it is, I have also pushed it to Github here.

/**
 * A Sound represents a sound effect object and can be used to play back audio
 *
 * Generally a sound should be added to either a {@link b5.Scene} or the global {@link b5.App}'s resources so that it can be managed by them.
 *
 * Example showing how to load and play a sound effect
 *
 *      var sound = new b5.Sound("explosion", "sounds/explosion.mp3", true);
 *      var instance = sound.play();
 *
 * For a complete overview of Resources see {@link http://booty5.com/html5-game-engine/booty5-html5-game-engine-introduction/resources-the-stuff-that-games-are-made-of/ Booty5 Resources Overview}
 *
 * @class b5.Sound
 * @constructor
 * @returns {b5.Sound}                      The created sound
 * @param name {string}                     Name of sound resource
 * @param location {string}                 The sound file location
 *
 * @property {b5.App|b5.Scene}          parent          - Parent resource manager (internal)
 * @property {object}                   snd             - Sound instance (re-usable sound only) (internal). For Web Audio stores a {source:AudioBufferSourceNode, gain:GainNode} object for auto play sounds
 * @property {object}                   buffer          - AudioBufferSourceNode containing decoded audio data (Web Audio only)
 * @property {string}                   name            - Name of this sound resource
 * @property {string}                   location        - The location of the sound file that is used to create the audio object
 * @property {boolean}                  loop            - If set to true then sound will be looped
 * @property {boolean}                  preload         - If set to true then this sound will be preloaded
 * @property {boolean}                  auto_play         - If set to true then this sound will be preloaded
 * @property {boolean}                  loaded          - If true then this resource has finished loading
 */

var loadFile = function(filename, blocking, callback, binary)
{
    var req = new XMLHttpRequest();
    req.open("GET", filename, !blocking);
    req.overrideMimeType("application/json");
    if (binary)
        req.responseType = "arraybuffer";
    if (!blocking)
    {
        req.onreadystatechange = function()
        {
            if (req.readyState === 4)
            {
                if (req.status === 200 || req.status === 0) // 0 for node-webkit
                {
                    if (binary)
                        callback(req.response);
                    else
                        callback(req.responseText);
                }
                else
                    callback(null);
            }
        };
    }
    try
    {
        req.send();
    }
    catch(e)
    {
        return false;
    }

    if (blocking)
    {
        if (req.status === 200)
        {
            if (binary)
                callback(req.response);
            else
                callback(req.responseText);
        }
        else
            callback(null);
    }

    return true;
};

b5.Sound = function(name, location)
{
    // internal variables
    this.parent = null;                 // Parent container
    this.snd = null;                    // Sound instance (re-usable sound only). For Web Audio stores a {AudioBufferSourceNode, GainNode } object for auto play sounds
    this.buffer = null;                 // AudioBufferSourceNode containing decoded audio data (Web Audio only)

    // Public variables
    this.name = name;					// The sound name
    this.location = location;			// Location of the sound
    this.loop = false;                  // If set to true the this sound will replay continuously
    this.preload = false;               // Set to true to preload sound
    this.loaded = false;                // Set to true once audio cam be played
    this.auto_play = false;             // Set to true to auto play sound when loaded
    this.load_retry = 0;
};

/**
 * AudioContext used by Web Audio API
 * @type {object}
 */
b5.Sound.context = null;
b5.Sound.muted = false;

/**
 * Initialises the sound system
 * @parm app {b5.App}   The App that will manage the audio engine
 * @returns {boolean}   true for success or false if error
 */
b5.Sound.init = function(app)
{
    if (app.use_web_audio)
    {
        try
        {
            window.AudioContext = window.AudioContext || window.webkitAudioContext;
            if (window.AudioContext === undefined)
                return false;
            b5.Sound.context = new AudioContext();
        }
        catch(e)
        {
            return false;
        }
        return true;
    }
    return false;
};

/**
 * Loads the sound
 */
b5.Sound.prototype.load = function(force)
{
    var debug = b5.app.debug;
    //var snd;
    var that = this;
    var filename = this.location;
    var auto_play = this.auto_play;
    if (!loadFile(filename, false, function(data) {
        if (data !== null)
        {
            b5.Sound.context.decodeAudioData(data, function(buffer) {
                that.buffer = buffer;
                if (auto_play)
                    that.play(force);
            }, function(e)
            {
                console.log(e)
            });
        }
        else
        {
            that.load_retry++;
            if (that.load_retry < 3)
                that.load();
        }
    }, true))
    {
        that.load_retry++;
        if (that.load_retry < 3)
            that.load();
    }
};

/**
 * Starts playback of the sound
 * @returns {object} An Audio object representing the playing sound or a {source, gain} object if using Web Audio API
 */
b5.Sound.prototype.play = function(force)
{
    if (force != true && b5.Sound.muted)
        return null;
    if (this.buffer === null)
        return null;
    var context = b5.Sound.context;
    var source = context.createBufferSource();
    var gain = context.createGain();
    source.buffer = this.buffer;
    source.loop = this.loop;
    source.connect(gain);
    gain.connect(context.destination);
    gain.gain.value = 1;
    source.start(0);
    if (this.auto_play)
        this.snd = { source: source, gain: gain };
    return { source: source, gain: gain };
};

/**
 * Stops playback of thr sound (re-usable sound only)
 */
b5.Sound.prototype.stop = function()
{
    var snd = this.snd;
    if (snd === null || snd === undefined)
        return;
    snd = snd.source;
    snd.stop();
};

Happy coding!

Simple Messaging System with Redis and Node.js

Hey all, been a while since I posted anything constructive, I’ve been so busy wasting my time creating games for Facebook Instant Games Messenger (I will do a proper write up with my analysis and final findings / thoughts on this very soon). Not all has been lost working on Instant Games however. Two of my games required an instant messaging system that enables me to send real-time messages between players which ironically the Instant Games SDK doesn’t cater for. So I created one using Node.js and Redis (these two bad boy pieces of tech together are like sweet music). You can grab the code from Github here.

Note that you will need to install this to your own server, I like to run most of my node modules using PM2. So to get the messaging system up and running just run pm2 msys. The server looks to the /msys endpoint, but you can change this in msys.js if you need it to go elsewhere. No, I don’t answer questions on how to set up servers and mess with Apache config files because I hate all that junk, it gets in the way of my actual coding which I do enjoy :) . If you cannot do this stuff yourself then you probably should be paying someone else do this for you.

Oh word of warning, any messages sent will time out after 7 days (this is to keep Redis memory usage down), but you can extend this to whatever time limit you like. Messages are queued, when you collect the pending messages it collects them all and deletes them from the database.

Ok, how to use client side? Here is a simple class (erm I mean collection of functions) with an awesome original name that I ripped out of one of my games for you guys to use:

var Backend = {};

Backend.SendMessage = function(data, done_callback)
{
    var url = "https://yourdomain.com/msys?c=s&t=<your token>";
    url += "&g=1";
    url += "&u=" + data.to_id;
    url += "&d=" + encodeURIComponent(JSON.stringify(data));
    b5.Utils.SendGetRequest(url, function(response) {
        if (done_callback !== undefined)
            done_callback(response);
    })
}

Backend.SendMessageMulti = function(recipients, data, done_callback)
{
    var users = "";
    var len = recipients.length;
    for (var t = 0; t < len; t++)
    {
        users += recipients[t];
        if (t < (len - 1))
            users += "_";
    }
    var url = "https://yourdomain.com/msys?c=s&t=<your token>";
    url += "&g=1";
    url += "&m=" + users;
    url += "&d=" + encodeURIComponent(JSON.stringify(data));
    b5.Utils.SendGetRequest(url, function(response) {
        if (done_callback !== undefined)
            done_callback(response);
    })
}

Backend.GetMessages = function(done_callback)
{
    var url = "https://yourdomain.com/msys?c=g&t=<your token>";
    url += "&g=1";
    url += "&u=" + Social.GetPlayerID();
    b5.Utils.SendGetRequest(url, function(response) {
        if (response.status == 200)
        {
            var data = decodeURIComponent(response.responseText);
            var obj = JSON.parse("[" + data + "]");

            if (done_callback !== undefined)
                done_callback(obj);
        }
        else
        {
            if (done_callback !== undefined)
                done_callback();
        }
    })
}

There are a few functions in here that you will need to implement yourself:

  • Social.GetPlayerID() – Replaced with your players user ID, if you are using Facebook Instants SDK then use FBInstant.player.getID()
  • b5.Utils.SendGetRequest() – Performs a GET request, e.g:
b5.Utils.SendGetRequest = function(url, callback)
{
    var req = new XMLHttpRequest();
    req.onreadystatechange = function()
    {
        if (callback != undefined && req.readyState == 4)
            callback(req);
    }
    req.open("GET", url, true);
    req.send();
}

Anyway, that’s it, hope you find more useful than I did. Happy coding :) .

Adventures in Facebook Messenger Instant Games Land

I’ve been quiet for a while because I’ve been incredibly busy trying to break into the Facebook Messenger Instant Games market, unfortunately that has proven to be an impossible task. I have thus far released 5 games onto the Instant Games (IG) platform and all 5 have flopped within one week, despite only around 2600 games being available to date.

My current crop of IG games:

Shuffle Match
Higher or Lower Cards
Nine Card Pontoon
Wordy Pop Wizard
Friend Falls

Each game that I created became progressively more complex and utilised more of the Instant Games SDK features (possibly the main place things started to go wrong). The last game Friend Falls took 3 months to develop at a cost of around $15,000. It was a fair old investment to make in a platform that I found exciting but I also felt could be a potential flash in the pan, I wanted to discover if it was possible to create a mobile sized game with full IG integration, lots of social hooks etc and make it a success. And….. it failed, the game flopped within the week (just like the other 4), in fact it never really took off. It managed to climb to just over 100 users per hour then within one hour fell to 10-20 users per hour and continues to fall (that is the death sign for a game on the Facebook Instant Games playform).

Even though there are only just over 2600 games available on Instant Games, most of the MAU (monthly active users) are concentrated at the top of the chart with 70% of all available MAU going to the top 100. The system works like this:

  • When a game is released it is fed a very small number of users over a short period of time
  • If the day 1 retention is low then the game doesn’t receive any more users
  • If the day 1 retention is high then the game receives more users
  • Social and virality factors are also allegedly taken into account (no one is sure of how any of it works really) but I have seen no evidence of this, games with zero IG integration regularly shoot up the charts for example

Discovery on IG is its biggest problem right now. There is very limited space available in the list of games across all platforms. The IG UI in Messenger consists of:

  • Featured games list (usually 3-5 games shown at the top and rarely ever changes)
  • Playing with friends list (a few games that you are currently playing with friends)
  • More games (a bunch of other games usually games in the top 100)

So where does this leave new games? Your game is cycled into the more games section on occasion, the better your retention etc the more times you are cycled in so the more exposure you get. These lists vary from country to country and player to player. As soon as your game is seen by a player it will never be seen again in their lifetime because the lists change quickly and the lower you are down the charts the fewer times your game is shown to users. I need to add, there used ot be a boost for all new games, the boost fed a few thousand users to your game for a couple of days to gauge metrics, but that has now been shut down. The idea now is that you climb from the absolute bottom of the well and earn your way up.

So basically you are given the players you are given and no more. There are ways to help retain players such as home screen shortcut creation (its a bit flaky) and Messenger bots. Messenger bots are basically bots that message the player at some point in the future after they exit the game. They can remind the player that they have quests waiting, get free coins etc.. In reality they don’t help much for most developers that already have low retention and they feel very much like spam (they actually put me off trying out new games because my Messenger inbox looks like a battle of the bots), they can lift your retention around 2%. I know that sounds incredibly bad but when the average day 1 retention on IG is as low as 4-5%, 2% is a fair bit, although it doesn’t really push any more players your way (seems once you drop to around 10% day 1 retention you are thrown into a special crap bucket where you are fed a couple of hundred low value players worldwide every day). When you consider that my mobile games are seeing day 1 retention of upwards of 60%, you can see where the major issue is with IG.

There are no ways to drive users to your games, you have to rely on an AI (which I believe to be faulty) to feed users to your games based on certain markers such as daily retention, sharing, user to user interaction etc.. I do believe Facebook are working on a paid user acquisition system but from my calculations it is just not economically viable and will fail very quickly.

I am of the mind that IG is quite broken right now. Here is just one example. My day 1 retention for my latest game Friend Falls is just over 8% (yes that’s awful, but better than most), drilling down into my stats its easy to see why. The vast majority of the users shown my game live in none English speaking countries. Obviously user retention and engagement is going to be much lower in none English speaking countries), so is the IG AI giving every game a fair chance? No, when 90% of the users of my English Only game are from none English speaking regions, my retention and engagement factors are going to be low. But can’t I fix this by limiting the countries that my game is shown in? No, I limited my game to just English speaking countries and my game had all users cut off, I’m now currently running at 0 users per hour. GG

So what is revenue like? My eCPM for Friend Falls is resting at around $0.8. Some of my other games do see around $5 but only a handful of users are viewing ads at that eCPM so they are also worthless. You won’t make any eye brow raising money from IG, maybe a little pocket change but nothing more.

Developing content for Facebook Messenger Instant Games feels very much like living under a dictatorship ran by a mad AI :D .

Mistakes I made? The first and probably biggest mistake I made was trying to create an original mobile quality game for IG, without the backing of Facebook (see Angry Birds etc.. for reference, this is what happens when Facebook do push your game because you are important enough :) ) its just not gonna happen. The second mistake I made was there is just so much to the game its crazy which means it needs a tutorial to get the players deeper into the game. I don’t think games with much depth are really going to succeed on IG again without being pushed into players faces by Facebook.

I will continue to develop small social games for IG for now because its fun, but I will not be putting the same levels of time and money into the endeavour because it is pretty much a lost cause for an indie game developer trying to keep their head above water. I suggest that indie game developers stay clear of the platform until it has matured. If you do want to dabble then I suggest that you create small fun games, short dev times, small risk. Do not do what I did and waste vast amounts of time and money.

Advantages of developing Facebook Messenger Instant Games? Its fun, quite easy and its great as a prototyping platform to try out new ideas, just limit your liability and do not invest too much.

Shuffle Match live on Facebook Instant Games in Messenger

Shuffle Match Facebook Instant Game

Shuffle Match Facebook Instant Game

My first HTML5 Facebook Instants games is now live on Messenger. I actually finished this games a couple of months back, but because of the Facebook privacy saga all further game reviews were put on hold, so hundreds (potentially thousands) of games have been sat in limbo. Its good to finally see a product live on the platform however.

Shuffle Match is basically a memory matching game where you are shown a bunch of numbered tiles, you memorise them then they slide off screen and you have to try and remember where they all were. The game is monetised by offering the player the ability to continue by watching an ad if they run out of lives. Its a simple, fun game that’s great to play against friends.

Play Shuffle Match on Messenger Now

Just released my latest cross platform game Idle Gangsters on iOS, Android and Facebook Gameroom. The game is an experiment o see if it was possible to mix Idle Incremental and Match-3 game play styles and it seems to have worked.

Rise through the ranks of the mafia in this fun, addictive idle incremental match-3 game.

Start out as a low life punk and work your way up through the mafia ranks to Godfather using every manner of lie, trick and scheme possible.
Muscle in on cities, launder goods, build up illegal rackets and generate cash, gaining the respect of your fellow mafians and rising through the ranks of the mafia. Hire bosses, kit them out, order hits, bribe cops, fight off rival gangs and the feds and much more.

  • Launder loot for the mob using Match-3 generating large amounts of cash and respect
  • Buy into 20 rackets to earn cash without lifting a finger
  • Free upgrades for all rackets
  • Smash your way through 10 ranks of the mafia from Punk to Godfather unlocking exciting new content
  • Muscle in on and take over 10 different cities from Brooklyn to Las Vegas
  • Hire upgradeable city bosses to increase cash flow, reduce racket costs, generate cash offline and use perks
  • Equip bosses with up to 16 perks to boost city rackets and laundering
  • 20 loot laundering boosts / hazards
  • 10 global powerups which affect time and cash flow
  • Unlimited missions for big cash boosts
  • Unlimited special missions for huge cash boosts which take place across 10 unique minigames
  • Extra 5 daily bonus minigames which generate cash, respect and diamonds
  • Stats tracking, over 150 individually tracked stats
  • Around 300 achievements to earn
  • Facebook connect with invites, gifting and leaderboards
  • Cloud save game backup and restore

Idle Gangsters is available for free on the App Store for iPhone and iPad

Idle Gangsters is available for free on the Google Play for Android

The game is also available for free on Facebook and Facebook Gameroom

Idle Gangsters Title Screen

Idle Gangsters Title Screen


Idle Gangsters Match-3

Idle Gangsters Match-3


Idle Gangsters Idle Incremental

Idle Gangsters Idle Incremental

Cookie Clicker Save the World free game for iOS, Android and Facebook Gameroom

Just released my latest mobile and Facebook game Cookie Clicker Save the World targeted at raising awareness of climate change in a fun and challenging gaming environment. Gamers playing the game are gradually introduced to various climate issues and what can be done to help, such as recycling, using wind power etc..

The game is an idle builder / tapper based in the near future where current day currencies have been replaced with a new cryptocurrency called cookies. Players have to research and buy new technology to reduce carbon emissions reducing mankind’s impact on the environment.

Game features include:

  • Bake cookies by clicking on the cookie moon, use cookies to purchase items and technology that help the climate and produce more cookies.
  • Use cookies to buy over 200 upgrades and mods to speed up carbon reduction and cookie production.
  • Earn over 200 achievements.
  • Use powerups to speed cookie cooking production.
  • Evolve your cookie mastery to gain extra benefits.
  • Daily bonus awards.
  • Login with Facebook, invite friends, share progress and compete with friends in the cookie master leaderboards.
  • Offline cookie cooking.
  • Random blessings boost your play.
  • Deal with random curses such as striking workers, maintenance shut downs and more.
  • Endless play allows you to play an indefinite amount of time

Cookie Clicker Save the World is available for free on the App Store for iPhone and iPad

Cookie Clicker Save the World is available for free on the Google Play for Android

The game is also available for free on Facebook and Facebook Gameroom

You can find out more about the game at the official Cookie Clicker Save the World website.










Upgrading from Unity 5.4 to 5.6

Recently had the need to upgrade a couple of projects from Unity 5.4 to 5.6 and after much trial and error and scouring the net for solutions I finally managed it. My project uses two plugins which do not play well with Unity 5.6, these include:

  • TextMeshPro – Do not use the version that is currently on the asset store (Version: 1.0.55.0b11) or your project will explode, instead grab it from here. If you already have a version of TextMesh Pro installed into your project then delete it (backup fist!), then install the version this link
  • Chartboost – Update to version 6.6.4 as previous versions do not compile with Unity 5.6!
  • Facebook SDK – Deleted old Facebook SDK 7.8 including the Facebook related stuff in the Plugins folder, installed latest Facebook SDK from fresh!

By the way, if you see errors appear, shut Unity down and reopen the project them allow, most of the time the errors just disappear.