Making of an Arabic Teaching Game: Antura and The Letters

Picture showing me completing correctly an assessment round

I wanted to share with you my 11 weeks work experience at VGWB (VideoGames Without Borders): during these weeks I developed a whole section of the game “Antura wa al huruf” (Antura and the letters) under the supervision of Francesco Cavallari (founder of VGWB) and of Davide Barbieri (Lead programmer from GhostShark Games).

Background:

A Norwegian Agency, Norad, started in September of 2015 a contest for the realization of an educative game. The reason was to give an alternative way for Syrian children to get fun and education. An estimated 2.8 million of children are out of school due to war. Since most of Syrian children have access to a smartphone, a mobile App was a viable way to ship that goal.

The project timeline was roughly the following

  • The project had initially 78 different project proposals (Phase 0).
  • 5 Projects were selected as semifinalists (Phase 1).
  • 3 Projects were choosen as finalists (Phase 2).
  • Feedback provided and request for improvements before winner election ( Phase 3).

I Joined the project during Phase2, at time of writing the article we are in Phase3 and waiting to hear who is the winning project.

 

timeline
Project timeline over the whole 2016 year + begin of 2017. The smaller orange timeline is my participation in the project.

My role:

I joined the project at a later time and started working on a completely new section, my duty and responsibility was the development of the Assessments section:

Antura’s is structured in a series of worlds/maps each one with a travel line: during the travel you play minigames to learn Arabic, and after some minigames sessions the player is required to do an Assessment. It is not an exam at all, its main purpose is to reinforce learning by doing a series of exercises that uses the concepts learned in previous mini games, it is possible to answer by trial and error, and the goal is exactly to not stress too much children.

screen shot of an old version of the game
How assessments looked by November 2016

 

As a newcomer

I spent the first few days by looking and learning documentation and the pre-existing code, I did a quick draft of code to get an idea of the amount of work required and potentials problems. The most important part (as always) is to understand the requirements, so I readed the documentation several times, printed my own copy and annotated it.

Requirements:

There was a total of 9 assessments types (later evolved to 13 assessments), basically assessments had to look similiar, have similiar behaviour but at implementation level there  are differencies in how the logic is implemented. The graphics wanted to be simple on purpose to not distract too much children from the assessment.

The first playable prototype was ready at first week and I used it to get feedback from my supervisor. Well in reality the key factor to development here was the continuos feedback: this was a truly Agile experience, we had a development cycle that consisted in 4 days of rush programming and 1 day of testing/ revisioning / bugfixing. Requirements changed every 2/3 days (due to feedback from testers or on field testing).

Screenshot of antura's map
Each of the assessments is a pin on the map.

Things I got right.

  • Wrap the content provided by the Question Provider, the IQuestionProvider interface is a bit controversial: it was first enforced to be a “unique” interface among all games, but it was not sufficient to fullfill all different game logics, the workaround (used everywhere in the game) is to “decode” the content of the IQuestionBuilder. Basically that piece was designed with a goal in mind, but testing and improvements later required different behaviour, at that point in development it was no longer possible change that without breaking stuff, so we delayed that issue to a future refactoring. In the Assessments the decoding of IQuestionProvider is done by IQuestionGenerator, so the IQuestionProvider is free to change without breaking Assessments, infact even tought there are a couple of different implementations for the IQuestionGenerator, the interface is used in the same way by all Assessments (no decoding there).

 

  • The Assessments’ game loop is a Coroutine, since the game is divided into well-defined phases, putting stuff inside a IEnumerator revealed very usefull. This is especially usefull because allows to put animations where needed and wait for them to end without having to resort to state machines or complex flag systems. There where 2 major changes in the game flow and I was able to seamlessy do them without breaking stuff because of Coroutines usage.  Certain behaviours are just much more simple to implement using Coroutines.
    private IEnumerator RoundsCoroutine( KoreCallback gameEndedCallback)
    {
        for (int round = 0; round < Configuration.NumberOfRounds; round++)
        {
            InitRound();

            yield return Koroutine.Nested( RoundBegin());
            yield return Koroutine.Nested( PlaceAnswers());

            if (round == 0)
                Koroutine.Run( DescriptionAudio());

            yield return Koroutine.Nested( GamePlay());
            yield return Koroutine.Nested( ClearRound());
    }

    gameEndedCallback();
    }

Here I’m using a custom coroutine runner: apart the nicer syntax it puts less pressure on the Garbage Collector. It is nothing special. Just syntactic sugar that will be updated soon…

  • Use my own sound manager, all games audio is loaded into a global audio manager (implemented by DeAudio by other developers), while it was a real pleasure to just call 1 method for playing a sound file (and have each single sound effect tweaked by an audio engineer), I had specific issues to be addressed for assessments (certain clips were allowed to overlap, other clips were not allowed to overlap). The easiest way to allow the correct playback for audio files was just to add another audio manager (on top of the old one). That allowed to keep correct behaviour of sounds, without adding extra complexity (I still call 1 method to play each sound). And for certain sounds I now have a meaningfull name.
    public void PlayPlaceSlot()
    {
        audioManager.PlaySound( Sfx.StarFlower);
    }

Example of playing a sound using a meaningfull name

Things I got wrong

  • Use of a time manager, since all games had to implement at least 2 IState interfaces (1 initial game state and 1 final game state) and there was a “Update( float delta)” method to implement, I assumed that time scale was custom and I had to use that “delta” also for Tweens and Coroutines. I was wrong! The game was in reality setting Time.timeScale to 0 to pause the game, while the UI was animated with a unscaled delta time. It could have been a minute to check that myself. While in theory the time manager idea is nice, because it decouple the time flow from Unity’s time scale, in reality it was not used in other minigames, so it was pointless keeping it around. Infact I removed it during the polishing phase of the game. Stop.

 

  • A bit overengineered overall, I can understand the short deadline but there are a few things that I would like to have written in a slightly different way (well code works, so no reason to change it now), also rethinking later to the game I think  Assessments section was a good candidate for using a ECS pattern (which I learned recently and I’m still experimenting with it) however since I was not too confident with ECS I decided to not take risky roads. During the development I thinked more than 1 time “If I had used the ECS pattern, that would have solved that problem for me”. As a result of the extra complexity I was able to cut a lot of code during polishing phase (In example, there were several Answers’ related classes that resolved a communication problem, later I merged them in just one Answer class. ) I’m still very happy by the rithm I was able to keep and by the result. Also I think I did pretty well since I joined the project at a later moment and did not have the time I wished to have.

 

Things I liked:

I worked with talented people, I had the chance to work with people I was following and I continued to work togheter with some people I already knew. I learned a lot and this was also my second team work experience (This time I had to collaborate tightly with some coders). It is very surprising when you need stuff and you find it was already implemented by someone else. I also liked a lot participating in some design decisions and helping refining some logic. It was a short but intense experience.

Things I don’t liked:

Well, it was a relatively short experience, I had a lot of fun so it is a pity that is already ended. The project is ready for being published (at the time of writing this article we have already the various game stores approval), there are no major things to fix, and at least in my section (Assessments) there’s no more work to be done.

I’d liked to work on this project a bit more.

A screenshot showing the assessment of antura regardin articles.
How Antura looks right now ( Assessments section).

How did I get the job?

I have to thank guys in GhostShark Games for that, I already worked with them for 1 year developing a couple of games, and I can’t wait to see what will be the next project. In the meanwhile we worked togheter on Antura. I use the free time between each project to develop personal stuff and to refine my skills.

Do the game works?

Yeah it works! In reality the game is aimed to teach Arabic to children that already speak and understand it, however I was able to learn most of the Arabic alphabet and dozen of words (even though I didn’t understand a single word of Arabic when I joined the project). Also, field testing show children really learn new things. As a personal note: I’m surprised by how elegant Arabic writing is!

 

 

 

 

Advertisements

1 Comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s