Project Fizzyo – Archipelayo

Our first trailer

The aim with Archipelayo is to produce a new standard for games used to enhance physiotherapy. Archipelayo is a series of mini games designed to be used by children, aged 6-16, with Cystic Fibrosis – a lifelong, incurable disease. The disease causes thick sticky mucus to build up in the lungs and digestive system which leads to multiple health problems such as repeated chest infections, shortness of breath and lack of proper food absorption amongst many others. To reduce risk sufferers of cystic fibrosis must clear their airways through various Airway Clearance Techniques or ACTs. Working with Project Fizzyo and Microsoft, Archipelayo has been developed to be used in conjunction with the children’s ACTs. The game is played using the Fizzyo sensor which is attached to the Acapella, a device used to aid the clearance. The sensor turns breaths into computer inputs which can be used as controls for the game. Regular physiotherapy can reduce the health risks of CF and improve life expectancy; however, the process is tedious and proper adherence to their treatment is poor. Archipelayo is designed to increase adherence and encourage proper technique whilst making the children’s daily, grueling treatments fun with a variety of minigames.

Currently our game, alongside others, is being used within Project Fizzyo’s clinical trial. The trial involves 160 patients aged 6-16 being monitored for a six-month period to see the effects the games have on the patient’s adherence to, and efficacy of their physio regimes. As the patients play our game, data is captured such as their breath quality and playtime. The trial is taking place at Great Ormond Street Hospital, an internationally renowned children’s hospital in London

The main menu system

There was 2 programmers in total and I was responsible for the main menu, blow dart minigame, the breath bar and breath set system (reused across all minigames), the achievements and the majority of the analytics.

The game could be split into three main focus points from my side of the development:

  • Analytics
  • Developing for accessibility
  • Keeping the efficacy of the physio exercises


As the game is being used in a clinical trial we can record important data as the children play such as which minigame encourages better breaths, which minigames the players return to and how long they play each one for. Data is bundled and sent through the Unity Analytics system after each minigame is finished etc to allow us to compare minigames for which produce the better quality of breaths and more. Not only does this allow us to continually improve the game based on the data accumulated but to further the research into how gamification can help physiotherapy, providing data and statistics to prove it. Below is our end of minigame and end of session analytics events.

 public static void ReportEndOfMinigame(string levelName, float minigameStartTime)
        Debug.Log("End of minigame report: ");
        Debug.Log("LEVEL NAME: " + levelName);
        Debug.Log("TIME_IN_MINIGAME: " + (Time.time - minigameStartTime));
        Debug.Log("BREATHS_DURING_MINIGAME: " + minigameBreaths);
        Debug.Log("GOOD_BREATHS_DURING_MINIGAME: " + minigameGoodBreaths);

        if(0 > Time.time - minigameStartTime)
            Debug.Log("ERROR TIME IN MINIGAME BELOW 0");

        AnalyticsEvent.Custom("Minigame_Session_Details", new Dictionary<string, object>
            { "Minigame_Name", levelName },
            { "Minigame_Time", (Time.time - minigameStartTime) },
            { "Minigame_Breaths", minigameBreaths },
            { "Minigame_Good_Breaths", minigameGoodBreaths }

        minigameGoodBreaths = 0;
        minigameBreaths = 0;

    public static void ReportEndSession (float time) 

        Debug.Log("End of session report: ");
		Debug.Log ("TOTAL_SESSION_TIME: " + time);
		Debug.Log ("TOTAL_SESSION_BREATHS: " + totalBreaths);
        Debug.Log("TOTAL_SESSION_GOOD_BREATHS: " + totalGoodBreaths);

        AnalyticsEvent.Custom("Session_Details", new Dictionary<string, object>
			{ "Session_Time", time },	
			{ "Session_Breaths", totalBreaths},
            { "Session_Good_Breaths", totalGoodBreaths}