Robin Milward Cooney 200849894

Dependencies:   N5110 SDFileSystem gameCharacters mbed

Files at this revision

API Documentation at this revision

Comitter:
robinmc
Date:
Thu May 05 14:59:45 2016 +0000
Parent:
2:158d57cdbf1e
Commit message:
Fun game

Changed in this revision

N5110.lib Show annotated file Show diff for this revision Revisions of this file
gameCharacters.lib Show annotated file Show diff for this revision Revisions of this file
game_charecters.lib Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
tone.lib Show diff for this revision Revisions of this file
--- a/N5110.lib	Wed May 04 10:12:58 2016 +0000
+++ b/N5110.lib	Thu May 05 14:59:45 2016 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/eencae/code/N5110/#0f2b35cfe9c9
+https://developer.mbed.org/users/robinmc/code/N5110/#0f2b35cfe9c9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gameCharacters.lib	Thu May 05 14:59:45 2016 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/ELEC2645-201516/code/gameCharacters/#704821ea028f
--- a/game_charecters.lib	Wed May 04 10:12:58 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-game_charecters#d9440b3314bb
--- a/main.cpp	Wed May 04 10:12:58 2016 +0000
+++ b/main.cpp	Thu May 05 14:59:45 2016 +0000
@@ -1,3 +1,10 @@
+/**
+@file main.cpp
+@brief Revision 1.0.
+@author Robin Milward Cooney
+@date   May 2015
+*/
+
 /* ELEC2645 Game - Shooty shooty bang bang (priliminary name)
 
 Week 19 - initial version, basic testing of sensor and display
@@ -6,126 +13,36 @@
 
 */
 
-/** 
-
-*/
-#include "mbed.h"
-#include "N5110.h"
-#include "math.h"
-#include "stdint.h"
-#include "tone.h"
-#include "SDFileSystem.h"
-#include "gameCharacters.h"
-
-#define joystickTolerance 0.05f
-
-N5110 lcd(PTE26,PTA0,PTC4,PTD0,PTD2,PTD1,PTC3);         //declare LCD
-BusOut led(PTC8,PTC9,PTC0,PTC7,PTC5);                   //declare Bus output for LED bar
-SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
-DigitalOut red_led(LED_RED);
-DigitalOut green_led(LED_GREEN);
-DigitalIn swJoy(PTB18);                                 //define potentiomiter switch
-AnalogIn xPot(PTB2);                                   //define x axis analoge in (this is the pot that corresponds to horizontal movement of the joystick)
-AnalogIn yPot(PTB3);                                   //define y axis analoge in (this is the pot that corresponds to vertical movement of the joystick)
-DigitalIn b_A(PTE24);                                   //define additional first button
-DigitalIn b_B(PTE25);                                   //define additional second button
-PwmOut PWM(PTC11);
-InterruptIn press_b_A(PTE24);                           //declare the push button A as an interrupt
-InterruptIn press_b_B(PTE25);                           //declare the push button B as an interrupt
-Ticker Ticker_Menu;
-Ticker Ticker_Game;
-Ticker Ticker_ds;
-Ticker Ticker_music;
-Timeout tOut;
-FILE *Highscores;
-FILE *Progress;
+#include "main.h"
 
-int i;                                          //loop counter
-int run=0;
-int loop=0;
-int difficulty=2;
-int recks_movement=2;
-int fall=37;
-int g_jump=36;
-int jumpUp;
-int accel=0;
-int bullet=9;
-int bullet_height;
-int menu_select;
-int score=0;
-int highscore;
-int kill_score;
-int shield_score;
-int shield_counter=0;
-int h_movement=0;
-int ammo=24;
-int rat_movement=95;
-int hound_hMovement=98;
-int hound_vMovement=40;
-int hound_jump=0;
-int bear_movement=100;
-int bird_hMovement=95;
-int bird_vMovement=20;
-int cactus_movement=110;
-int t_rex_movement=120;
-int chasm_movement=85;
-int fire_ball_hMovement=t_rex_movement-6;
-int fire_ball_vMovement=25;
-int heart_movement=90;
-int ammo_movement=100;
-int speed_boost_movement=130;
-int menuState=0;          //initial state for the menu fsm
-int jump_flag=0;
-int shoot_flag=0;
-int shield_flag=0;
-int print_rat_flag=0;
-int print_hound_flag=0;
-int hound_jump_flag=0;
-int print_bear_flag=0;
-int print_bird_flag=0;
-int print_heart_flag=0;
-int print_ammo_flag=0;
-int print_speed_boost_flag=0;
-int print_cactus_flag=0;
-int print_t_rex_flag=0;
-int print_chasm_flag=0;
-int print_fire_ball_flag=0;
-int lose_lives_delay_flag=0;
-int story_mode_flag=0;
-int lives_delay_loop=0;                 //number of times the lose_lives_delay_flag if statement has iterated
-int fire_on_screen=0;
-int story_progress=1;
-int g_story_mode_win=0;
-double lives=4;
-int bear_lives=0;
-int t_rex_lives=0;
-int random_num;
-int g_music_count=1;
-int g_top_scores[6];
-float brightness=0.5;
-volatile int g_Ticker_Menu_flag=0;
-volatile int g_Ticker_Game_flag=0;
-volatile int g_Ticker_Music_flag=0;
-volatile int g_Ticker_ds_flag=0;
-volatile int g_press_b_A_flag=0;
-volatile int g_press_b_B_flag=0;
+int main()                      //main function, currently used to test different functions
+{
+    initialize_values();        //Call the initialize_values funtion
+    lcd.init();                 //Initialize the LCD
+    b_A.mode(PullDown);         //Declare the Pull down state of the digital in b_A
+    b_B.mode(PullDown);         //Declare the Pull down state of the digital in b_B
+    swJoy.mode(PullDown);       //Declare the Pull down state of the digital in swJoy
+    Ticker_Menu.attach(&Ticker_Menu_isr,0.15); //Set the ticker for menus to flag every 0.15 seconds
+    Ticker_Game.attach(&Ticker_Game_isr,0.1);   //Set the ticker for the game to flag every 0.1 seconds
+    Ticker_ds.attach(&Ticker_ds_isr,0.1);       //Set the ticker for the ticker_wait funtion to flag every 0.1 seconds
+    press_b_A.fall(&press_b_A_isr);             //Set interrupt to flag when buttion A pressed
+    press_b_A.mode(PullDown);                   // Declare that button A is pulldown
+    press_b_B.fall(&press_b_B_isr);             //Set interrupt to flag when buttion B pressed
+    press_b_B.mode(PullDown);                   // Declare that button A is pulldown
+    calibrateJoystick();                        //Initialize the joystick, allocating a defalut possition for xJoy and yJoy
+    intro();                                    //Prints the name of the game before the manin menu runs
+    main_menu();                                //Funtion that runs the main menu, the game itself it called within the main_menu() funtion
+}
 
+
+// -----------------------------------------------------------------------------------------------------------------------------------------
+
+// Funtion that initializes all values so when the game ends and is re_played all the variables are in there initial state
 void initialize_values()
 {
-    b_A.mode(PullDown);
-    b_B.mode(PullDown);
-    swJoy.mode(PullDown);
-    red_led = 1;
-    green_led=1;
-    i=0;                                          //loop counter
-    loop=0;
-    recks_movement=2;
-    fall=37;
-    g_jump=36;
-    accel=0;
-    bullet=9;
-    h_movement=0;
-    ammo=24;
+
+//the movements of all the interactive elements are arranged so they start off screen and as the value _movement values increases
+//they begin to appear on screen
     rat_movement=85;
     hound_hMovement=90;
     hound_vMovement=40;
@@ -135,19 +52,25 @@
     bird_vMovement=20;
     cactus_movement=110;
     t_rex_movement=120;
-    chasm_movement=85;
+    quick_sand_movement=85;
     fire_ball_hMovement=t_rex_movement-6;
     fire_ball_vMovement=25;
     heart_movement=90;
     ammo_movement=100;
-    menuState=0;          //initial state for the menu fsm
+
+//Thenu state is reset to 0 so that the first menu option is highlited when returned to the main menu
+    menuState=0;
+
+//All action flags are re-set to 0
     jump_flag=0;
     shoot_flag=0;
     shield_flag=0;
-    shield_counter=0;
+    hound_jump_flag=0;
+
+
+//All print flags are set to 0
     print_rat_flag=0;
     print_hound_flag=0;
-    hound_jump_flag=0;
     print_bear_flag=0;
     print_bird_flag=0;
     print_heart_flag=0;
@@ -155,106 +78,135 @@
     print_speed_boost_flag=0;
     print_cactus_flag=0;
     print_t_rex_flag=0;
-    print_chasm_flag=0;
+    print_quick_sand_flag=0;
     print_fire_ball_flag=0;
+    fire_on_screen=0;
+
+//Score and relevant score variable are set to 0
+    score=0;
+    kill_score=0;
+    shield_score=0;
+
+//Other miscellaneous varaivles relevent to the game are set
+    red_led = 1;
+    green_led=1;
+    i=0;
+    g_shoot_loop=0;
+    recks_movement=2;
+    fall=37;
+    g_jump=36;
+    accel=0;
+    bullet=9;
+    h_movement=0;
+    ammo=24;
     lose_lives_delay_flag=0;
     lives_delay_loop=0;
     lives=4;
     bear_lives=0;
-    score=0;
-    kill_score=0;
-    shield_score=0;
-    fire_on_screen=0;
+    shield_counter=0;
+
 }
 
+//Funtion that uses a ticker to create a ticker based wait() funtion, less power consumtion then normal wait() funtion
+//Input t in 0.1*number of seconds to wait
 void ticker_wait(int t)
 {
-    for (int q=0; q<=t; q++) {
-        if (g_Ticker_ds_flag) {
+    for (int q=0; q<=t; q++) {      //for loop stops when q<=t
+        if (g_Ticker_ds_flag) {     //ticker_ds_flag flags every 0.1seconds
             g_Ticker_ds_flag=0;
-            q++;
+            q++;                    //q increases every loop until q=t
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
+
+//Funtion that reads the story_progress variable form the SD card
 void readSD_progress()
 {
-    Progress=fopen("/sd/Progress.txt", "r");
-    if (Progress!=NULL) {
-        green_led=0;
-        fscanf(Progress,"%d, ",&story_progress);
-        fclose(Progress);
-        ticker_wait(5);
-        green_led=1;
-    } else {
-        red_led=0;
-        ticker_wait(5);
-        red_led=1;
+    Progress=fopen("/sd/Progress.txt", "r");       //Opens the file Progress.txt (read only)
+    if (Progress!=NULL) {                           //If file exists
+        green_led=0;                                //Turn green led on mbed on
+        fscanf(Progress,"%d, ",&story_progress);    //Retrive the story_progress variable
+        fclose(Progress);                           //Close the file Progress.txt
+        ticker_wait(5);                             //wait 0.5s
+        green_led=1;                                //Turn green led on mbed off
+    } else {                                        //If flie doesn't exist
+        red_led=0;                                  //Turn red led on mebed on
+        ticker_wait(5);                             //wait 0.5s
+        red_led=1;                                  //Turn red led on mebed off
     }
 }
+
+//Funtion that reads the story_progress variable on the SD card
 void writeSD_progress()
 {
-    Progress=fopen("/sd/Progress.txt", "w");
-    if (Progress!=NULL) {
-        green_led=0;
-        fprintf(Progress,"%d, ",story_progress);
-        fclose(Progress);
-        ticker_wait(5);
-        green_led=1;
-    } else {
-        red_led=0;
-        ticker_wait(5);
-        red_led=1;
+    Progress=fopen("/sd/Progress.txt", "w");        //Opens the file Progress.txt (write)
+    if (Progress!=NULL) {                           //If file exists
+        green_led=0;                                //Turn green led on mbed on
+        fprintf(Progress,"%d, ",story_progress);    //Write the story_progress variable to the file
+        fclose(Progress);                           //Close the file Progress.txt
+        ticker_wait(5);                             //wait 0.5s
+        green_led=1;                                //Turn red led on mebed off
+    } else {                                        //If the file doesn't exist
+        red_led=0;                                  //Turn red led on mebed on
+        ticker_wait(5);                             //wait 0.5s
+        red_led=1;                                  //Turn red led on mebed off
     }
 }
+
+//Funtion that reads and prints the g_top_score[6] array on the SD card and prints the higest 5 values
+//on the LCD
 void readSD_and_print_top_score()
 {
-    Highscores=fopen("/sd/Highscores.txt", "r");
-    if (Highscores!=NULL) {
-        green_led=0;
-        ticker_wait(3);
-        green_led=1;
-        for (int j=0; j<=5; j++) {
+    Highscores=fopen("/sd/Highscores.txt", "r");    //Opens the file Highscores.txt (read only) from SD card
+    if (Highscores!=NULL) {                         //If file exists
+        green_led=0;                                //Turn green led on mbed on
+        ticker_wait(3);                             //wait 0.3s
+        green_led=1;                                //Turn green led on mbed oFF
+        for (int j=0; j<=5; j++) {                  //Go through all the values of the array and reads them
             fscanf(Highscores,"%d, ",&g_top_scores[j]);
         }
-        lcd.printString("Highscores:",0,0);
-        for (int j=1; j<=5; j++) {
-            char buffer[14];
-            int temp = sprintf(buffer,"%d",g_top_scores[j]);
-            lcd.printString(buffer,12,j);
+        lcd.printString("Highscores:",0,0);         //Prints Highscores
+        for (int j=1; j<=5; j++) {                  //Goes through the top 5 values
+            char buffer[14];                        //Declares buffer to store the values of the g_top_score array
+            int temp = sprintf(buffer,"%d",g_top_scores[j]);  //Stores them in the buffer
+            lcd.printString(buffer,12,j);                     //Prints the values on the LCD screen in order
         }
-        fclose(Highscores);
-    } else {
-        red_led=0;
-        ticker_wait(3);
-        red_led=1;
-        lcd.printString("NO HIGHSCORES",3,2);
+        fclose(Highscores);                         //Close Highscores file
+    } else {                                        //If the file doesn't exist
+        red_led=0;                                  //Turn the red led on mbed off
+        ticker_wait(3);                             //wait 0.3s
+        red_led=1;                                  //Turn the red led on mebed off
+        lcd.printString("NO HIGHSCORES",3,2);       //Print error message on LCD
         lcd.printString("SET YET!!",18,3);
     }
 }
 
+
+//Funtion that writes the highscore[6] array on the SD
 void writeSD()
 {
-    Highscores=fopen("/sd/Highscores.txt", "w");
-    if (Highscores!=NULL) {
-        green_led=0;
-        ticker_wait(3);
-        green_led=1;
-        for (int j=0; j<=5; j++) {
-            fprintf(Highscores,"%d, ",g_top_scores[j]);
+    Highscores=fopen("/sd/Highscores.txt", "w");    //Opens the file Highscores.txt (write only) from SD card
+    if (Highscores!=NULL) {                         //If file exists
+        green_led=0;                                //Turn green led on mbed on
+        ticker_wait(3);                             //wait 0.3s
+        green_led=1;                                //Turn green led on mbed off
+        for (int j=0; j<=5; j++) {                  //Goes through the all values
+            fprintf(Highscores,"%d, ",g_top_scores[j]); //Retrive the g_top_score array
         }
-        fclose(Highscores);
-    } else {
-        red_led=0;
-        ticker_wait(3);
-        red_led=1;
+        fclose(Highscores);                          //Close file
+    } else {                                        //If file doesn't exists
+        red_led=0;                                  //Turns red led on
+        ticker_wait(3);                             //Waits 0.3s
+        red_led=1;                                  //Turns red led off
     }
 }
 
+//Funtion that deletes a file
 void delete_file(char filename[])
 {
-    lcd.printString("Deleting file",0,1);
-    ticker_wait(5);
+    lcd.printString("Deleting file",0,1);   //print deleting file
+    ticker_wait(5);         //wait 05s
     FILE *fp = fopen(filename, "r");  // try and open file
     if (fp != NULL) {  // if it does open...
         fclose(fp);    // close it
@@ -268,80 +220,87 @@
 
 void Delete_Highscores()
 {
-    lcd.clear();
+    lcd.clear();      //Clear all the pixels on the LCD screen
     while (1) {
-        if (g_Ticker_Menu_flag) {
+        if (g_Ticker_Menu_flag) {       //ticker flags every 0.15s
             g_Ticker_Menu_flag=0;
             lcd.printString("Delete all",0,2);
             lcd.printString("high scores?",0,3);
-            if (b_A==1) {
-                lcd.clear();
+            if (b_A==1) {              //if dlete highscores is selected
+                lcd.clear();          //Clear all the pixels on the LCD screen
                 while (1) {
                     if (g_Ticker_Menu_flag) {
                         g_Ticker_Menu_flag=0;
-                        lcd.printString("Are you sure?",0,1);
-                        if (b_A==1) {
-                            lcd.clear();
-                            delete_file("/sd/Highscores.txt");
+                        lcd.printString("Are you sure?",0,1);   //Print are you sure message
+                        if (b_A==1) {           //Are you sure is selected
+                            lcd.clear();        //Clear all the pixels on the LCD screen
+                            delete_file("/sd/Highscores.txt");      //deletes the file
                             return;
-                        } else if (b_B==1) {
+                        } else if (b_B==1) {        //If it's not, returns to the main menu
                             return;
                         }
                     }
                     lcd.refresh();
-                    sleep();
+                    sleep();                    //puts mbed to sleep
                 }
-            } else if (b_B==1) {
+            } else if (b_B==1) {         //If it's not, returns to the main menu
                 return;
             }
         }
         lcd.refresh();
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
+//Sorts all the top scores in descending order
 void sort_top_scores()
 {
-    g_top_scores[5]=score;
+    g_top_scores[5]=score;      //The 5 element is equal to the score
     int temp;
-    for (int j=0; j<=5; j++) {
-        for (int n=1; n<=5; n++) {
-            if (g_top_scores[j]>g_top_scores[n]) {
-                temp = g_top_scores[j];
-                g_top_scores[j] = g_top_scores[n];
-                g_top_scores[n] = temp;
+    for (int j=0; j<=5; j++) {      //for each array element
+        for (int n=1; n<=5; n++) {  //for each array element+1 (except for when the array element=5 as there is no further one)
+            if (g_top_scores[j]>g_top_scores[n]) {      //if array element is greater then the next element
+                temp = g_top_scores[j];                 //store the element
+                g_top_scores[j] = g_top_scores[n];      //make the element equal to the next element
+                g_top_scores[n] = temp;                 //stores element equals the nest elememnt
             }
         }
     }
 }
-void music_tOut();
+
+
+//Funtion that plays the song1
 void play_music()
 {
-
-    tOut.attach(&music_tOut, (song1[0]/2));
-    PWM.period (1.0/1000);
-    PWM.write(0.0);
-    if (song1[g_music_count]!=0) {
-        PWM.period(1/(song1[g_music_count]));
-        PWM.write(0.5);
+    tOut.attach(&music_tOut, (song1[0]/2)); //the note will play for the the ammount of time specified in the first
+    //element of the song1
+    PWM.period (1.0/1000);                  //sets the frequancy to 1kHz
+    PWM.write(0.0);                         //Changes the time that the buzzer is on to 0
+    if (song1[g_music_count]!=0) {           //Checks if there is a note to be played at a ceratain position in the song1 array
+        PWM.period(1/(song1[g_music_count]));   //Sets the period to the corret frequency from the song array
+        PWM.write(0.5);                         //Changes PWM to square wave
     }
-    if (g_music_count<(sizeof(song1)/sizeof(song1[1]))) {
-        g_music_count++;
+    if (g_music_count<(sizeof(song1)/sizeof(song1[1]))) {   //If the current count of the music is less then the array size
+        g_music_count++;        //increases the music line by one
     } else {
-        g_music_count=1;
+        g_music_count=1;        //otherwise it sets it back to one
     }
 }
 
+
+//Generates a random number between 0 and 9999
 void generate_random_number()
 {
-    time_t seconds = time(NULL);
-    srand(seconds);
-    random_num=rand()%10000;
+    time_t seconds = time(NULL);        //Get time in seconds from mbed
+    srand(seconds);                     //Use time as soucre for srand() funtion
+    random_num=rand()%10000;            //create random number between 1 and 9999
 }
-void led_bar()                      //code to test led bar
+
+//Converts the socre value so it can be dysplayed as a bar
+void led_bar()
 {
-    led=pow(2,lives)-1;
-    if (lives>5) {
+    led=pow(2,lives)-1; //lives^2 -1 will turn all the led on thats the value of lives
+    if (lives>5) {      //the value of lives cannot exceed 5
         lives=5;
     }
 }
@@ -350,10 +309,46 @@
 void ground()                       //funtion to print the ground
 {
     for (int x = 0; x<=84 ; x++) {
-        lcd.setPixel(x,47);
+        lcd.setPixel(x,47);         //prints a line 84 pixels long at the bottom of the screen
     }
 }
 
+/*
+==========================EXAMPLE OF PRINTING FUNTION===========================
+
+THIS EXAMPLE CODE APPLIES FOR ALL THE "print_" FUNTIONS
+
+//Prints the item on the LCD screen
+void print_item()
+{
+    //Goes through all the columns in the g_item array
+    for (int c=0; c<=(1-g_item number of columns in array); c++) {
+        //Goes through all the rows in the g_item array
+        for (int r=0; r<=(1-g_item number of rows in array);r++) {
+            //if the element of the g_item array corresponding to row r and column c is o
+            if (g_item[r][c]==0) {
+            // then the pixel is checked, this is to allow arrays to overlap. If the checked pixel = 1
+            //then the pixel is set rather then cleared, however if it's 0 then it is cleared
+            //the location on the LCD that the item is printed is dependant on the 2 global variables
+            //item_hMovement (contolles the horizontal possition) and item_vMovement (contolles the
+            //vertical movemrnt). If either of those values are constants it means that the
+            //vertical/horizontal displacement of the object is constant
+                if (lcd.getPixel(c+item_hMovement,r+item_vMovement)!=0) {
+                    lcd.setPixel(c+item_hMovement,r+item_vMovement);
+                } else {
+                    lcd.clearPixel(c+item_hMovement,r+item_vMovement);
+                }
+            //else if the array element g_item[r][c] is 1 then the pixel is set no matter what
+            } else if (g_item[r][c]==1) {
+                lcd.setPixel(c+item_hMovement,r+item_vMovement);
+            }
+        }
+    }
+}
+================================================================================
+*/
+
+//Funtion that prints the heart pickup
 void print_heart()
 {
     for(int c=0; c<=4; c++) { //4 beacause the the loop stats from 0 but the array size from 1
@@ -371,6 +366,7 @@
     }
 }
 
+//Funtion that prints the ammo pickup
 void print_ammo_pickUp()
 {
     for(int c=0; c<=6; c++) { //6 beacause the the loop stats from 0 but the array size from 1
@@ -388,6 +384,7 @@
     }
 }
 
+//Funtion that prints the speed boost pickup
 void print_speed_boost()
 {
     for (int c=0; c<=13; c++) {
@@ -404,7 +401,7 @@
         }
     }
 }
-
+//Funtion that prints recks still
 void print_recks_still_gun()
 {
 
@@ -423,6 +420,7 @@
     }
 }
 
+//Funtion that prints recks moveing
 void print_recks_moving_gun()
 {
 
@@ -441,6 +439,7 @@
     }
 }
 
+//Funtion that prints recks crouching
 void print_recks_crouch_gun()
 {
     for(int c=0; c<=9; c++) { //9 beacause the the loop stats from 0 but the array size from 1
@@ -458,6 +457,7 @@
     }
 }
 
+//Funtion that prints recks with the shield
 void print_recks_shield()
 {
     for(int c=0; c<=14; c++) {
@@ -475,7 +475,7 @@
     }
 }
 
-
+//Funtion that prints recks in the jumping position
 void print_recks_jump_gun()
 {
     for(int c=0; c<=9; c++) { //9 beacause the the loop stats from 0 but the array size from 1
@@ -493,6 +493,7 @@
     }
 }
 
+//Funtion that recks falling (different to recks still because vertical movement is variable)
 void print_recks_falling()
 {
     for(int c=0; c<=9; c++) { //9 beacause the the loop stats from 0 but the array size from 1
@@ -510,19 +511,8 @@
     }
 }
 
-void falling_animation() {
-    while (fall<60) {
-        if (g_Ticker_Menu_flag) {
-            g_Ticker_Menu_flag=0;
-            print_recks_falling();
-            fall+=3;
-        }
-        lcd.refresh();
-        sleep();
-        lcd.clear();
-    }
-}
-void print_mob_rat_p1()            //funtion to print the still bear on the LCD
+//Funtion that prints the rat in position 1
+void print_mob_rat_p1()
 {
     for(int c=0; c<=7; c++) { // 7 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=2; r++) {
@@ -539,7 +529,8 @@
     }
 }
 
-void print_mob_rat_p2()            //funtion to print the still bear on the LCD
+//Funtion that prints the rat in position 2
+void print_mob_rat_p2()
 {
     for(int c=0; c<=7; c++) { // 7 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=2; r++) {
@@ -556,7 +547,8 @@
     }
 }
 
-void print_mob_hound_p1()            //funtion to print the still hound on the LCD
+//Funtion that prints the still hound
+void print_mob_hound_p1()
 {
     for(int c=0; c<=12; c++) { // 12 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=7; r++) {
@@ -573,7 +565,8 @@
     }
 }
 
-void print_mob_hound_p2()            //funtion to print the moving hound on the LCD
+//Funtion that prints the moving hound
+void print_mob_hound_p2()
 {
     for(int c=0; c<=12; c++) { // 12 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=7; r++) {
@@ -590,7 +583,8 @@
     }
 }
 
-void print_mob_hound_dead()            //funtion to print the moving hound on the LCD
+//Funtion that prints the dead hound
+void print_mob_hound_dead()
 {
     for(int c=0; c<=12; c++) { // 12 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=7; r++) {
@@ -607,7 +601,8 @@
     }
 }
 
-void print_mob_bear_p1()            //funtion to print the still bear on the LCD
+//Funtion to print the still bear (position 1) on the LCD
+void print_mob_bear_p1()
 {
     for(int c=0; c<=18; c++) { //18 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=9; r++) {
@@ -624,7 +619,8 @@
     }
 }
 
-void print_mob_bear_p2()            //funtion to print the moving bear on the LCD
+//Funtion to print the moving bear (position 2) on the LCD
+void print_mob_bear_p2()
 {
     for(int c=0; c<=18; c++) { //18 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=9; r++) {
@@ -641,7 +637,8 @@
     }
 }
 
-void print_mob_bear_dead()            //funtion to print the bead bear on the LCD
+//Funtion to print the dead bear
+void print_mob_bear_dead()
 {
     for(int c=0; c<=18; c++) { //18 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=9; r++) {
@@ -658,7 +655,8 @@
     }
 }
 
-void print_mob_bird_p1()            //funtion to print the moving bird on the LCD
+//Funtion to print the moving (position 1) bird on the LCD
+void print_mob_bird_p1()
 {
     for(int c=0; c<=9; c++) { //9 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=9; r++) {
@@ -675,7 +673,8 @@
     }
 }
 
-void print_mob_bird_p2()            //funtion to print the moving bird on the LCD
+//Funtion to print the moving (position 2) bird on the LCD
+void print_mob_bird_p2()
 {
     for(int c=0; c<=9; c++) { //9 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=9; r++) {
@@ -692,7 +691,8 @@
     }
 }
 
-void print_mob_bird_dead()            //funtion to print the moving bird on the LCD
+//Funtion to print the dead bird on the LCD
+void print_mob_bird_dead()
 {
     for(int c=0; c<=9; c++) { //9 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=9; r++) {
@@ -705,23 +705,33 @@
     }
 }
 
-void print_cactus()            //funtion to print the moving bird on the LCD
+//Funtion to print the cactus
+void print_cactus()
 {
     for(int c=0; c<=4; c++) { //4 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=11; r++) {
-            if (cactus[r][c]==0) {
+            if (g_cactus[r][c]==0) {
                 if (lcd.getPixel(c+cactus_movement,r+35)!=0) {
                     lcd.setPixel(c+cactus_movement,r+35);
                 } else {
                     lcd.clearPixel(c+cactus_movement,r+35);
                 }
-            } else if (cactus[r][c]==1) {
+            } else if (g_cactus[r][c]==1) {
                 lcd.setPixel(c+cactus_movement,r+35);
             }
         }
     }
 }
 
+//Funtion to print the quick sand
+void print_quick_sand()
+{
+    for(int x=0; x<=16; x++) {
+        lcd.setPixel(x+quick_sand_movement,46);
+    }
+}
+
+//Funtion to print the T Rex still
 void print_t_rex()
 {
     for(int c=0; c<=24; c++) { //24 beacause the the loop stats from 0 but the array size from 1
@@ -739,13 +749,7 @@
     }
 }
 
-void print_chasm()
-{
-    for(int x=0; x<=16; x++) {
-        lcd.setPixel(x+chasm_movement,46);
-    }
-}
-
+//Funtion to print the T Rex moving
 void print_t_rex_moving()
 {
     for(int c=0; c<=24; c++) { //24 beacause the the loop stats from 0 but the array size from 1
@@ -763,6 +767,7 @@
     }
 }
 
+//Funtion to print the T Rex attack
 void print_t_rex_attack()
 {
     for(int c=0; c<=24; c++) { //24 beacause the the loop stats from 0 but the array size from 1
@@ -780,6 +785,7 @@
     }
 }
 
+//Funtion to print the fire ball (position 1)
 void print_fire_ball_p1()
 {
     for(int c=0; c<=8; c++) { //24 beacause the the loop stats from 0 but the array size from 1
@@ -797,6 +803,7 @@
     }
 }
 
+//Funtion to print the fire ball (position 2)
 void print_fire_ball_p2()
 {
     for(int c=0; c<=8; c++) { //24 beacause the loop stats from 0 but the array size from 1
@@ -814,10 +821,12 @@
     }
 }
 
-
+//Funtion to print the clouds
 void print_clouds()
 {
-    uint8_t clouds_movement=h_movement;               //8 bit unsigned interger
+    //8 bit unsigned integer that loops round to 0 when the h_movement variable is > than 255
+    //this means that the cloud array loops round when it finishes
+    uint8_t clouds_movement=h_movement;
     for(int c=clouds_movement; c<=clouds_movement+83; c++) {
         for(int r=0; r<=2; r++) {
             if (g_clouds[r][c]==0) {
@@ -831,6 +840,7 @@
 
 void print_locks()
 {
+    //depending on the value of story_progress locked padlocks are printed or unlocked ones
     int sp=8*story_progress;
     for(int c=0; c<=3; c++) { //24 beacause the the loop stats from 0 but the array size from 1
         for(int r=0; r<=5; r++) {
@@ -857,71 +867,74 @@
 }
 
 
-void shoot()
+//Funtion that is called when the player walks or jumps on quick sand, Recks falls and
+//looses all lives
+void falling_animation()
 {
-    lcd.setPixel(bullet,g_jump+4);
-    lcd.setPixel(bullet+1,g_jump+4);
+    while (fall<60) {
+        if (g_Ticker_Game_flag) {
+            g_Ticker_Game_flag=0;
+            print_recks_falling();
+            fall+=3;                //vertical poition of recks increases (goes down) every loop
+        }
+        lcd.refresh();
+        sleep();                    //puts mbed to sleep
+        lcd.clear();       //Clear all the pixels on the LCD screen
+    }
 }
 
-void print_score();
-void print_ammo();
-
+//Funtion that is called before the main menu the start and dislplayes the name of the game
 void intro()
 {
-
+    lcd.clear(); //clears all pixels on LCD
+    lcd.printString("ROBOZOEC",18,2);
+    lcd.printString("ERA",33,3);
+    lcd.refresh();
+    ticker_wait(30);
 }
 
+//Interrupt service routine for the menus ticker
 void Ticker_Menu_isr()
 {
+    //sets the menu flag to 1
     g_Ticker_Menu_flag=1;
 }
 
+//Interrupt service routine for the game ticker
 void Ticker_Game_isr()
 {
+    //sets the menu flag to 1
     g_Ticker_Game_flag=1;
 }
 
+//Interrupt service routine for the ticker_wait funtion ticker
 void Ticker_ds_isr()
 {
+    //sets ds flag to 1
     g_Ticker_ds_flag=1;
 }
 
+//Funtion that is called when the time out is timed out
 void music_tOut()
 {
+    //Turns the note off
     PWM.write(0.0);
 }
 
-
+//Interrupt service routine for the press_b_A interrupt
 void press_b_A_isr()
 {
+    //sets the g_press_b_A_flag to 1
     g_press_b_A_flag=1;
 }
 
+//Interrupt service routine for the press_b_B interrupt
 void press_b_B_isr()
 {
+    //sets the g_press_b_B_flag to 1
     g_press_b_B_flag=1;
 }
 
-enum joystickDirection {    //emunm type for every neccessary direction of the joystick
-    CENTRE,                 //when the joystick isn't moved
-    DOWN,
-    UP,
-    LEFT,
-    RIGHT,
-};
-
-typedef struct JoyStick Joystick;       //struct for Joystick
-struct JoyStick {
-    float x;    // current x value
-    float x0;   // 'centred' x value
-    float y;    // current y value
-    float y0;   // 'centred' y value
-    int swJoy; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
-    joystickDirection direction;  // current direction
-};
-// create struct variable
-Joystick joystick;
-
 // read default positions of the joystick to calibrate later readings
 void calibrateJoystick()
 {
@@ -953,70 +966,7 @@
     }
 }
 
-struct menuState {
-    int menu_select;  // output value
-    int nextState[5];  // array of next states 6 to account for all of the joystick states
-};
-
-typedef const struct menuState STyp;
-
-STyp fsm_main_menu[5] = {
-    {0,{0,1,4,0,0}},
-    {8,{1,2,0,1,1}},
-    {16,{2,3,1,2,2}},
-    {24,{3,4,2,3,3}},
-    {32,{4,0,3,4,4}}
-};
-
-STyp fsm_settings_menu[5] = {
-    {0,{0,1,2,0,0}},
-    {8,{1,2,0,1,1}},
-    {16,{2,3,1,2,2}},
-    {24,{3,0,2,3,3}},
-    {32,{4,4,4,4,4}}
-};
-
-
-
-
-void main_menu();
-void Game();
-void Story_Mode();
-void Tutorial();
-void Chapter1();
-void Chapter2();
-void Chapter3();
-void Chapter4();
-void Minigame();
-void Settings();
-void Brightness();
-void Difficulty();
-void set_difficulty();
-void Leaderboard();
-void guns();
-void Credits();
-int Game_over();
-void Pause();
-
-
-int main()                      //main function, currently used to test different functions
-{
-    initialize_values();
-    lcd.init();
-    Ticker_Menu.attach(&Ticker_Menu_isr,0.2);
-    Ticker_Game.attach(&Ticker_Game_isr,0.1);
-    Ticker_ds.attach(&Ticker_ds_isr,0.1);
-    press_b_A.fall(&press_b_A_isr);
-    press_b_A.mode(PullDown);
-    press_b_B.fall(&press_b_B_isr);
-    press_b_B.mode(PullDown);
-    calibrateJoystick();
-    main_menu();
-}
-
-
-// -----------------------------------------------------------------------------------------------------------------------------------------
-
+//Funtion that prints the main menu and all other funtions are called from it
 void main_menu()
 {
     menuState=0;
@@ -1029,12 +979,14 @@
             lcd.setBrightness(brightness);
             menu_select = fsm_main_menu[menuState].menu_select;  // set ouput depending on current state
             menuState = fsm_main_menu[menuState].nextState[joystick.direction]; // when joystick.direction has a vaule of CENTRE/RIGHT/LEFT the state machine input is 0 when it has a value of DOWN it is 0b01 when it has a value of UP is is 0b10
-            lcd.clear();
+            lcd.clear();       //Clear all the pixels on the LCD screen
+            //Print the options on the main menu
             lcd.printString("Story mode",13,0);
             lcd.printString("Minigame",18,1);
             lcd.printString("Settings",18,2);
             lcd.printString("Leaderboard",9,3);
             lcd.printString("Credits",21,4);
+            //inverts the pixels to highlight the option that would be selected if the buttion A is pressed
             for (int i=0; i<85; i++) {      //go through every pixel on the x axis
                 for (int j=menu_select; j<(menu_select+8); j++) {  // go through relevant pixels on the y axis
                     if (lcd.getPixel(i,j)== 0) {                   //if the pixel is on trun it off
@@ -1045,53 +997,62 @@
                 }
             }
             lcd.refresh();
+            //if the butto A is pressed with and the output of the menu fsm is 0, 8, 16, 24, 32
             if (b_A & menu_select==0) {
+                //calls story mode function
                 Story_Mode();
             } else if (b_A & menu_select==8) {
+                //calls game function
                 Game();
             } else if (b_A & menu_select==16) {
+                //calls settings function
                 Settings();
             } else if (b_A & menu_select==24) {
+                //calls leaderboard function and after it turns the mbes leds off
                 Leaderboard();
                 red_led=1;
                 green_led=1;
             } else if (b_A & menu_select==32) {
+                //calls the credits funtion
                 Credits();
             }
+            //CHEAT CODE that unlocks all the story mode chapters
+            //CODE: joystick LEFT, button swJoy and button b_B at the same time
             if (joystick.direction==LEFT&swJoy==1&b_B==1) {
                 story_progress=5;
                 writeSD_progress();
+                //Led turns on and off to show that the code was sucessfull
                 green_led=0;
                 ticker_wait(5);
                 green_led=1;
             }
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
-
+//Function that runs the game, when this funtion runs the game has no end
 void Minigame()
 {
-    ticker_wait(5);
+    ticker_wait(5); //wait 0.5s
     while (1) {
         if (g_Ticker_Game_flag) {
             g_Ticker_Game_flag=0;
-            lcd.clear();
+            lcd.clear();       //Clear all the pixels on the LCD screen
             updateJoystick();
-            Game();
+            Game();             //run the came
 
         }
-        i++;
         lcd.refresh();
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
+//Function that runs story mode menu
 void Story_Mode()
 {
     menuState=0;
-    story_mode_flag=1;
+    story_mode_flag=1;  //if this =1 the game funtion will end at different score levels depending on chapter
     led=0;
     readSD_progress();
     while(1) {
@@ -1101,8 +1062,10 @@
             lcd.setBrightness(brightness);
             menu_select = fsm_main_menu[menuState].menu_select;  // set ouput depending on current state
             menuState = fsm_main_menu[menuState].nextState[joystick.direction]; // when joystick.direction has a vaule of CENTRE/RIGHT/LEFT the state machine input is 0 when it has a value of DOWN it is 0b01 when it has a value of UP is is 0b10
-            lcd.clear();
+            lcd.clear();       //Clear all the pixels on the LCD screen
+            //prints the locks displaying what chapters are unlocked
             print_locks();
+            //prints the chapters
             lcd.printString("Tutorial",20,0);
             lcd.printString("Chapter 1",20,1);
             lcd.printString("Chapter 2",20,2);
@@ -1118,6 +1081,7 @@
                 }
             }
             lcd.refresh();
+            //selects chapter depending on the button A, the output of the menu fst and whether it is unlocked
             if (b_A & menu_select==0&story_progress>=1) {
                 Tutorial();
             } else if (b_A & menu_select==8&story_progress>=2) {
@@ -1129,19 +1093,23 @@
             } else if (b_A & menu_select==32&story_progress>=5) {
                 Chapter4();
             }
+            //if button b_B is presses it returns to the main menu clearing the story mode flag
             if (b_B) {
                 menuState=0;
                 story_mode_flag=0;
                 return;
             }
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
+
+//Funtion that introduces the game and the controls to the user
 void Tutorial()
 {
-    lcd.clear();
+    //prints message
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Welcome to",0,0);
     lcd.printString("boot camp",0,1);
     lcd.printString("soldier",0,2);
@@ -1149,14 +1117,16 @@
     lcd.refresh();
     ticker_wait(10);
     g_press_b_A_flag=0;
+    //when b_A is pressed it exits the while loop continueing to the next printed message
     while (1) {
         if (g_press_b_A_flag) {
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    //print message
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Are you ready",0,0);
     lcd.printString("to begin your",0,1);
     lcd.printString("training?",0,2);
@@ -1169,9 +1139,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Okay use",0,0);
     lcd.printString("joysick to",0,1);
     lcd.printString("move right and",0,2);
@@ -1185,9 +1155,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("... move",0,0);
     lcd.printString("forwards and",0,1);
     lcd.printString("backwards.",0,2);
@@ -1201,9 +1171,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Now you try...",0,0);
     lcd.printString("Okay!>>",30,5);
     lcd.refresh();
@@ -1214,11 +1184,13 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
+    //sets the difficulty to -1, no interactive elements in the game
+    //this allows the player to try the game contolls
     difficulty =-1;
     Game();
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Good!!!",0,0);
     lcd.printString("Now lets try",0,1);
     lcd.printString("jumping. To",0,2);
@@ -1232,11 +1204,13 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
+    //sets the difficulty to -1, no interactive elements in the game
+    //this allows the player to try the game contolls
     difficulty =-1;
     Game();
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("You can also",0,0);
     lcd.printString("crouch if you",0,1);
     lcd.printString("move your",0,2);
@@ -1250,9 +1224,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("And if you",0,0);
     lcd.printString("move the joy-",0,1);
     lcd.printString("stick up you",0,2);
@@ -1266,9 +1240,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("your shield,",0,0);
     lcd.printString("this will",0,1);
     lcd.printString("protect you",0,2);
@@ -1282,9 +1256,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("it'll cost",0,0);
     lcd.printString("you 10 score",0,1);
     lcd.printString("points.",0,2);
@@ -1297,9 +1271,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Try it...",0,0);
     lcd.printString("Okay>>",30,5);
     lcd.refresh();
@@ -1310,12 +1284,15 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
+    //sets the difficulty to -1, no interactive elements in the game
+    //this allows the player to try the game contolls
+    //Also increases the score to 30 so player can test using the shield
     difficulty =-1;
-    score=20;
+    score=30;
     Game();
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Great!!!",0,0);
     lcd.printString("To shoot press",0,1);
     lcd.printString("A, but watch",0,2);
@@ -1329,9 +1306,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("... might use",0,0);
     lcd.printString("all your ammo",0,1);
     lcd.printString("Give it a go!",0,3);
@@ -1344,11 +1321,13 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
+    //sets the difficulty to -1, no interactive elements in the game
+    //this allows the player to try the game contolls
     difficulty =-1;
     Game();
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Remember you",0,0);
     lcd.printString("can also shoot",0,1);
     lcd.printString("while jumping",0,2);
@@ -1362,9 +1341,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Information",0,0);
     lcd.printString("about your",0,1);
     lcd.printString("status (ammo",0,2);
@@ -1378,9 +1357,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("... is shown",0,0);
     lcd.printString("above, and the",0,1);
     lcd.printString("number",0,2);
@@ -1394,9 +1373,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("... have is",0,0);
     lcd.printString("displayed on",0,1);
     lcd.printString("the LED bar,",0,2);
@@ -1410,9 +1389,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("... all turn",0,0);
     lcd.printString("off you will",0,1);
     lcd.printString("die, so make",0,2);
@@ -1426,9 +1405,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("... it doesn't",0,0);
     lcd.printString("happen!!!",0,1);
     lcd.printString("Press A>>",24,5);
@@ -1440,9 +1419,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Excellent!!!",0,0);
     lcd.printString("Your training",0,1);
     lcd.printString("is over",0,2);
@@ -1455,9 +1434,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Are you ready",0,0);
     lcd.printString("for your first",0,1);
     lcd.printString("mission?",0,2);
@@ -1468,22 +1447,25 @@
     while (1) {
         if (g_press_b_A_flag) {
             g_press_b_A_flag=0;
+            //Increses story_pregress
             story_progress=2;
+            //autosaves progress
             writeSD_progress();
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
 void Chapter1()
 {
-    lcd.clear();
+    //Introduce story
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("150+ MISSIONS",0,1);
     lcd.printString("LATER",18,2);
     lcd.refresh();
     ticker_wait(20);
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("MISSION #158:",0,0);
     lcd.printString("We have intel",0,1);
     lcd.printString("of a new range",0,2);
@@ -1498,9 +1480,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("weapons being",0,0);
     lcd.printString("developed in",0,1);
     lcd.printString("a remote",0,2);
@@ -1515,10 +1497,10 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
     ticker_wait(10);
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("... Pacific.",0,0);
     lcd.printString("Your mission",0,1);
     lcd.printString("is to",0,2);
@@ -1532,10 +1514,10 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
     ticker_wait(10);
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("... destroy",0,0);
     lcd.printString("as many of",0,1);
     lcd.printString("the weapons as",0,2);
@@ -1550,10 +1532,10 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
     ticker_wait(10);
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Excellent, you",0,0);
     lcd.printString("will land on",0,1);
     lcd.printString("the farside of",0,2);
@@ -1568,10 +1550,10 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
     ticker_wait(10);
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("...way towards",0,0);
     lcd.printString("the centre the",0,1);
     lcd.printString("closer you get",0,2);
@@ -1586,10 +1568,10 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
     ticker_wait(20);
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("they'll have.",0,0);
     lcd.printString("For now you",0,1);
     lcd.printString("need to look",0,2);
@@ -1604,11 +1586,11 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 
     ticker_wait(20);
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("if you touch",0,0);
     lcd.printString("one you'll",0,1);
     lcd.printString("lose a life so",0,2);
@@ -1622,10 +1604,10 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
     ticker_wait(20);
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("...them, also,",0,0);
     lcd.printString("watch out for",0,1);
     lcd.printString("low tech cyber",0,2);
@@ -1640,10 +1622,10 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
     ticker_wait(20);
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("have to jump",0,0);
     lcd.printString("them aswell",0,1);
     lcd.printString("as you cannot",0,2);
@@ -1657,10 +1639,10 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
     ticker_wait(20);
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("That's all you",0,0);
     lcd.printString("need to know ",0,1);
     lcd.printString("for now. Get",0,2);
@@ -1675,13 +1657,18 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
+    //sets the difficulty to 0, only cactus and rats
+    //this allows the player to try the game contolls
     difficulty=0;
     Game();
+    //innreases the story progress to 3
     story_progress=3;
+    //autosaves progress
     writeSD_progress();
-    lcd.clear();
+    //prints post game message
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Well done!!!",0,0);
     lcd.printString("Oh no...",0,1);
     lcd.printString("It looks like",0,2);
@@ -1696,13 +1683,14 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
 void Chapter2()
 {
-    lcd.clear();
+    //Continuing the story, indroducing more mobs
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Now you'll",0,0);
     lcd.printString("encounter",0,1);
     lcd.printString("robotic birds",0,2);
@@ -1717,9 +1705,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Watch out for",0,0);
     lcd.printString("the birds as",0,1);
     lcd.printString("they may swoop",0,2);
@@ -1734,13 +1722,16 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
+    //Set difficulty to 1. Hounds and birds also appear
     difficulty=1;
     Game();
+    //When compleated it increases story_progress to 4
     story_progress=4;
+    //autosaves progress
     writeSD_progress();
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Oh dear...",0,0);
     lcd.printString("There is more",0,1);
     lcd.printString("trouble ahead",0,2);
@@ -1753,13 +1744,14 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
 void Chapter3()
 {
-    lcd.clear();
+    //Continuing the story, indroducing more mobs
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("It looks like",0,0);
     lcd.printString("there is some",0,1);
     lcd.printString("sort of",0,2);
@@ -1774,9 +1766,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("... watch out",0,0);
     lcd.printString("it looks like",0,1);
     lcd.printString("it will be",0,2);
@@ -1791,9 +1783,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("a few shots",0,0);
     lcd.printString("before",0,1);
     lcd.printString("destroying it",0,2);
@@ -1808,13 +1800,17 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
+    //Set difficulty to 2. Bears will appear
     difficulty=2;
     Game();
+    //Increases story progress
     story_progress=5;
+    //Autosaves game
     writeSD_progress();
-    lcd.clear();
+    //Post game message
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("OH DEAR",0,0);
     lcd.printString("LORD...",0,1);
     lcd.printString("Press A>>",24,5);
@@ -1826,14 +1822,15 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
 void Chapter4()
 {
+    ////Continuing the story, indroducing final boss
     g_press_b_A_flag=0;
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("You won't",0,0);
     lcd.printString("beleve this",0,1);
     lcd.printString("it's it's...",0,2);
@@ -1848,9 +1845,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("it's not",0,0);
     lcd.printString("possible...",0,1);
     lcd.printString("It's a T Rex,",0,2);
@@ -1865,9 +1862,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("It's it's...",0,0);
     lcd.printString("it's",0,1);
     lcd.printString("breathing",0,2);
@@ -1882,9 +1879,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("... like it",0,0);
     lcd.printString("will only",0,1);
     lcd.printString("take damage",0,2);
@@ -1899,9 +1896,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("and I think",0,0);
     lcd.printString("you'll have",0,1);
     lcd.printString("to shoot it",0,2);
@@ -1916,9 +1913,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("...destroy it",0,0);
     lcd.printString("I'll drop",0,1);
     lcd.printString("some ammo",0,2);
@@ -1932,9 +1929,9 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     lcd.printString("Good Luck",0,0);
     lcd.printString("You'll need",0,1);
     lcd.printString("it",0,2);
@@ -1947,13 +1944,13 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
     difficulty=3;
     Game();
     initialize_values();
     if (g_story_mode_win) {
-        lcd.clear();
+        lcd.clear();       //Clear all the pixels on the LCD screen
         lcd.printString("Well done",0,0);
         lcd.printString("Recks",0,1);
         lcd.printString("Lets clear",0,2);
@@ -1968,18 +1965,20 @@
             g_press_b_A_flag=0;
             break;
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
+//Funtion that inverst the pixels and stops the game for 0.5s when a life is lost
 void freeze()
 {
-    lcd.inverseMode();
+    lcd.inverseMode(); //invert pixels
     lcd.refresh();
     ticker_wait(5);
     lcd.normalMode();
 }
 
+//Print the settings menu
 void Settings()
 {
     menuState=0;
@@ -1989,7 +1988,8 @@
             updateJoystick();
             menu_select = fsm_settings_menu[menuState].menu_select;  // set ouput depending on current state
             menuState = fsm_settings_menu[menuState].nextState[joystick.direction]; // when joystick.direction has a vaule of CENTRE/RIGHT/LEFT the state machine input is 0 when it has a value of DOWN it is 0b01 when it has a value of UP is is 0b10
-            lcd.clear();
+            lcd.clear();       //Clear all the pixels on the LCD screen
+            //print the options
             lcd.printString("Brightness",13,0);
             lcd.printString("Difficulty",13,1);
             lcd.printString("SD card",13,2);
@@ -2003,6 +2003,7 @@
                     }
                 }
             }
+            //Depending of the selected option, call the respective funtion
             lcd.refresh();
             if (b_A & menu_select==0) {
                 Brightness();
@@ -2025,6 +2026,7 @@
     }
 }
 
+//Funtion to choose the difficulty of the game
 void Difficulty()
 {
     menuState=0;
@@ -2034,7 +2036,8 @@
             updateJoystick();
             menu_select = fsm_main_menu[menuState].menu_select;  // set ouput depending on current state
             menuState = fsm_main_menu[menuState].nextState[joystick.direction]; // when joystick.direction has a vaule of CENTRE/RIGHT/LEFT the state machine input is 0 when it has a value of DOWN it is 0b01 when it has a value of UP is is 0b10
-            lcd.clear();
+            lcd.clear();       //Clear all the pixels on the LCD screen
+            //print all dificulty options
             lcd.printString("Piece of Cake",3,0);
             lcd.printString("Easy",30,1);
             lcd.printString("Regular",23,2);
@@ -2049,6 +2052,7 @@
                     }
                 }
             }
+            //Depending on the option chosen set the difficulty to a certain value, the higher the value the higher the dificulty and return to main menu
             lcd.refresh();
             if (b_A & menu_select==0) {
                 difficulty=0;
@@ -2071,10 +2075,11 @@
                 return;
             }
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
+//Menu to chose brightness
 void Brightness()
 {
     menuState=0;
@@ -2084,7 +2089,8 @@
             updateJoystick();
             menu_select = fsm_main_menu[menuState].menu_select;  // set ouput depending on current state
             menuState = fsm_main_menu[menuState].nextState[joystick.direction]; // when joystick.direction has a vaule of CENTRE/RIGHT/LEFT the state machine input is 0 when it has a value of DOWN it is 0b01 when it has a value of UP is is 0b10
-            lcd.clear();
+            lcd.clear();       //Clear all the pixels on the LCD screen
+            //Print brightness options
             lcd.printString("Dark",30,0);
             lcd.printString("Eco",33,1);
             lcd.printString("Regular",23,2);
@@ -2099,6 +2105,7 @@
                     }
                 }
             }
+            //Depending on chosen option, set the brightness between 0 anf 1 and return to main menu
             lcd.refresh();
             if (b_A & menu_select==0) {
                 brightness=0;
@@ -2121,25 +2128,29 @@
                 return;
             }
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
+//Prints the leaderboard
 void Leaderboard()
 {
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
+    //reads and prints the leaderboard
     readSD_and_print_top_score();
     g_press_b_B_flag=0;
+    //if the b_B button is presses return to menu
     while(1) {
         if (g_press_b_B_flag) {
             g_press_b_B_flag=0;
             return;
         }
         lcd.refresh();
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
+//Print the guns options
 void guns()
 {
     menuState=0;
@@ -2149,7 +2160,8 @@
             updateJoystick();
             menu_select = fsm_settings_menu[menuState].menu_select;  // set ouput depending on current state
             menuState = fsm_settings_menu[menuState].nextState[joystick.direction]; // when joystick.direction has a vaule of CENTRE/RIGHT/LEFT the state machine input is 0 when it has a value of DOWN it is 0b01 when it has a value of UP is is 0b10
-            lcd.clear();
+            lcd.clear();       //Clear all the pixels on the LCD screen
+            //Print the guns options
             lcd.printString("Pistol",10,0);
             lcd.printString("Revolver",10,1);
             lcd.printString("Rifle",10,2);
@@ -2164,7 +2176,8 @@
                 }
             }
             lcd.refresh();
-
+            //Depending on the options selected g_g1, g_g2 set to one
+            //if g_g1=1 and g_g2=1 it increases the dmage taken by certain mobs
             if (b_A & menu_select==0) {
                 g_g1=0;
                 g_g2=0;
@@ -2195,18 +2208,521 @@
                 return;
             }
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
+    }
+}
+
+//prints the credits
+void Credits()
+{
+    lcd.clear();
+    lcd.printString("Game made by",6,2);
+    lcd.refresh();
+    ticker_wait(30);
+    lcd.clear();
+    lcd.printString("ROBIN",6,1);
+    lcd.printString("MILWARD",6,2);
+    lcd.printString("COONEY",6,3);
+    lcd.refresh();
+    ticker_wait(30);
+    lcd.clear();
+    lcd.printString("Game made for",0,2);
+    lcd.refresh();
+    ticker_wait(30);
+    lcd.clear();
+    lcd.printString("ELEC2645",6,2);
+    lcd.refresh();
+    ticker_wait(30);
+}
+
+
+//Physics related to Recks
+void Recks()
+{
+    //if the joystick is centred recks is still
+    if (joystick.direction==CENTRE&jump_flag!=1&shield_flag!=1) {
+        lcd.setPixel(bullet,bullet_height);
+        lcd.setPixel(bullet+1,bullet_height);
+        print_recks_still_gun();
+        if (shoot_flag==1) {
+            bullet+=20;
+            if (bullet>=84) {
+                shoot_flag=0;
+                g_shoot_loop=0;
+            }
+        }
+        //if the joystick is left then everything except recks moves to the left
+    } else if (joystick.direction==LEFT&jump_flag!=1&shield_flag!=1) {
+        if ( i%4>=2) {
+            print_recks_still_gun();
+        } else if ( i%4<2) {
+            print_recks_moving_gun();
+        }
+        lcd.setPixel(bullet,bullet_height);
+        lcd.setPixel(bullet+1,bullet_height);
+        if (shoot_flag==1) {
+            bullet+=21;
+            if (bullet>=84) {
+                shoot_flag=0;
+                g_shoot_loop=0;
+            }
+        }
+        h_movement--;
+        //if the joystick is right then everything except recks moves to the right
+    } else if (joystick.direction==RIGHT&jump_flag!=1&shield_flag!=1) {
+        if ( i%4>=2) {
+            print_recks_still_gun();
+        } else if ( i%4<2) {
+            print_recks_moving_gun();
+        }
+        lcd.setPixel(bullet,bullet_height);
+        lcd.setPixel(bullet+1,bullet_height);
+        if (shoot_flag==1) {
+            bullet+=19;
+            if (bullet>=84) {
+                shoot_flag=0;
+                g_shoot_loop=0;
+            }
+        }
+        h_movement++;
+        //If joystick is down recks crouches
+    } else if (joystick.direction==DOWN&jump_flag!=1&shield_flag!=1) {
+        lcd.setPixel(bullet,bullet_height);
+        lcd.setPixel(bullet+1,bullet_height);
+        print_recks_crouch_gun();
+        bullet_height=42;
+        if (shoot_flag==1) {
+            bullet+=20;
+            if (bullet>=84) {
+                shoot_flag=0;
+                g_shoot_loop=0;
+            }
+        }
+        //If the jump_flag is 1 (then teh jump button has been pressed) Recks jumps
+        //If the joystick moves while the jump_flag is 1 then Recks moves left or right
+    } else if (jump_flag==1&shield_flag!=1) {
+        if (joystick.direction==LEFT) {
+            if (shoot_flag==1) {
+                bullet+=21;
+                if (bullet>=84) {
+                    shoot_flag=0;
+                    g_shoot_loop=0;
+                }
+            }
+            h_movement--;
+        } else if (joystick.direction==RIGHT) {
+            if (shoot_flag==1) {
+                bullet+=19;
+                if (bullet>=84) {
+                    shoot_flag=0;
+                    g_shoot_loop=0;
+                }
+            }
+            h_movement++;
+        } else if (joystick.direction==CENTRE) {
+            if (shoot_flag==1) {
+                bullet+=20;
+                if (bullet>=84) {
+                    shoot_flag=0;
+                    g_shoot_loop=0;
+                }
+            }
+        }
+        if (g_jump<=36&jumpUp==0&g_jump!=15) {
+            lcd.setPixel(bullet,bullet_height);
+            lcd.setPixel(bullet+1,bullet_height);
+            if (bullet>=84) {
+                shoot_flag=0;
+                g_shoot_loop=0;
+            }
+            print_recks_jump_gun();
+            g_jump-=6-accel;
+            accel++;
+        } else if (g_jump>=15&g_jump!=36) {
+            lcd.setPixel(bullet,bullet_height);
+            lcd.setPixel(bullet+1,bullet_height);
+            if (bullet>=84) {
+                shoot_flag=0;
+                g_shoot_loop=0;
+            }
+            print_recks_jump_gun();
+            g_jump+=6-accel;
+            accel--;
+            jumpUp=1;
+        } else if (g_jump==36&jumpUp==1) {
+            lcd.setPixel(bullet,bullet_height);
+            lcd.setPixel(bullet+1,bullet_height);
+            if (bullet>=84) {
+                shoot_flag=0;
+                g_shoot_loop=0;
+            }
+            print_recks_still_gun();
+            jump_flag=0;
+            jumpUp=0;
+            g_jump=36;
+            accel=0;
+        }
+    }
+}
+
+//Physics for rat
+void rat()
+{
+    //rat array p1 or p2 changes every 2 itterations
+    if (i%4>=2) {
+        print_mob_rat_p1();
+    } else if (i%4<2) {
+        print_mob_rat_p2();
+    }
+    if (joystick.direction==LEFT) {
+        rat_movement+=recks_movement;
+    } else if (joystick.direction==RIGHT) {
+        rat_movement-=recks_movement;
+    }
+    //rat velocity is 3 pixels per itteration
+    rat_movement-=3;
+    if (rat_movement<=-15) {
+        rat_movement=100;
+        print_rat_flag=0;
+    }
+    //when rat is in same vertical and horizontal position as Recks, Recks loses a life and the freeze duntion runs
+    if (rat_movement<=5&rat_movement>=-3&g_jump>32&lose_lives_delay_flag==0&shield_flag!=1) {     //a life is lost if recks has an vertical and horizontal position equal to one of the pixels corresponding to the bears position
+        lives--;
+        freeze();
+        lose_lives_delay_flag=1;
+    }
+
+}
+
+void hound()
+{
+        //hound array p1 or p2 changes every 2 itterations
+    if (i%4>=2&hound_jump_flag!=1) {
+        print_mob_hound_p1();
+    } else if (i%4<2&hound_jump_flag!=1) {
+        print_mob_hound_p2();
+    }
+    if (joystick.direction==LEFT) {
+        hound_hMovement+=recks_movement;
+    } else if (joystick.direction==RIGHT) {
+        hound_hMovement-=recks_movement;
+    }
+    //hound velocity is 2 pixels per itteration
+    hound_hMovement-=2;
+    if (hound_hMovement<=-15) {
+        hound_hMovement=100;
+        print_hound_flag=0;
+    }
+    if (random_num%10==0) {
+        hound_jump_flag=1;
+    }
+    //if the hound_jump_flag is one the houd jumps and increases it's horizontal velocity to 3 pixels per itteration
+    if (hound_jump_flag==1) {
+        hound_jump++;
+        hound_hMovement--;
+        if (hound_jump==1) {
+            hound_vMovement-=3;
+        } else if (hound_jump==2) {
+            hound_vMovement-=2;
+        } else if (hound_jump==3) {
+            hound_vMovement-=1;
+        } else if (hound_jump==4) {
+            hound_vMovement+=1;
+        } else if (hound_jump==5) {
+            hound_vMovement+=2;
+        } else if (hound_jump==6) {
+            hound_vMovement+=3;
+        } else if (hound_jump==7) {
+            hound_jump_flag=0;
+            hound_jump=0;
+        }
+        print_mob_hound_p2();
+
+    }
+    //if hound possiton = recks possition, lives decrease by one
+    if ((hound_hMovement<=8&hound_hMovement>=-5&g_jump>30&lose_lives_delay_flag==0&hound_jump_flag!=1&shield_flag!=1)|(hound_hMovement<=8&hound_hMovement>=-5&g_jump>26&lose_lives_delay_flag==0&hound_jump_flag==1&shield_flag!=1)) {     //a life is lost if recks has an vertical and horizontal position equal to one of the pixels corresponding to the hounds position
+        lives--;
+        freeze();
+        lose_lives_delay_flag=1;
+    }
+    //if bullet is the same hight as hound then hound dies
+    if (shoot_flag==1&bullet_height>hound_vMovement&bullet_height<hound_vMovement+8) {
+        print_mob_hound_dead();
+        print_hound_flag=0;
+        hound_hMovement=90;
+        kill_score+=5;
     }
 }
 
-void Credits()
+//Prints bear physics
+void bear()
+{
+    if (i%4>=2) {
+        print_mob_bear_p1();
+    } else if (i%4<2) {
+        print_mob_bear_p2();
+    }
+    if (joystick.direction==LEFT) {
+        bear_movement+=recks_movement;
+    } else if (joystick.direction==RIGHT) {
+        bear_movement-=recks_movement;
+    }
+    bear_movement-=2;
+    if (bear_movement<=-15) {
+        bear_movement=100;
+        print_bear_flag=0;
+    }
+    if (bear_movement<=8&bear_movement>=-5&g_jump>26&lose_lives_delay_flag==0&shield_flag!=1) {     //a life is lost if recks has an vertical and horizontal position equal to one of the pixels corresponding to the bears position
+        lives--;
+        freeze();
+        lose_lives_delay_flag=1;
+    }
+    if (shoot_flag==1&bullet_height>38) {
+        bear_lives++;
+        //if bullet hits bear 4 (or 3 or 2 depending on g_g1 and g_g2) bear dies
+        if (bear_lives==12-3*g_g1-3*g_g2) {
+            print_mob_bear_dead();
+            print_bear_flag=0;
+            bear_movement=100;
+            kill_score+=7;
+            bear_lives=0;
+        }
+    }
+}
+
+//Bird physins, has a constant horizontal velocity and the vertical one changes randomly
+void bird()
 {
+    if (i%8>=4) {
+        print_mob_bird_p1();
+    } else if (i%8<4) {
+        print_mob_bird_p2();
+    }
+    bird_hMovement-=2;
+    if (joystick.direction==LEFT) {
+        bird_hMovement+=recks_movement;
+    } else if (joystick.direction==RIGHT) {
+        bird_hMovement-=recks_movement;
+    }
+    if (random_num%6==0) {
+        bird_vMovement--;
+    } else if (random_num%6>=4) {
+        bird_vMovement++;
+    }
+    if (bird_vMovement>=37) {
+        bird_vMovement=37;
+    } else if (bird_vMovement<=10) {
+        bird_vMovement=10;
+    }
+    if (bird_hMovement<=-10) {
+        print_bird_flag=0;
+        bird_hMovement=100;
+        bird_vMovement=20;
+        bear_lives=0;
+    }
+    if ((bird_hMovement>=0&bird_hMovement<=10)&(bird_vMovement+5>=g_jump&bird_vMovement+5<=g_jump+10&lose_lives_delay_flag==0)&shield_flag!=1) {
+        lives--;
+        freeze();
+        lose_lives_delay_flag=1;
+    }
+    if (shoot_flag==1&(bullet_height==bird_vMovement+5|bullet_height==bird_vMovement+4)) {
+        print_mob_bird_dead();
+        print_bird_flag=0;
+        bird_hMovement=100;
+        bird_vMovement=20;
+        kill_score+=5;
+    }
+}
 
+//Cactus physics
+void cactus()
+{
+    print_cactus();
+    if (joystick.direction==LEFT) {
+        cactus_movement+=recks_movement;
+    } else if (joystick.direction==RIGHT) {
+        cactus_movement-=recks_movement;
+    }
+    if (cactus_movement<=-10) {
+        cactus_movement=110;
+        print_cactus_flag=0;
+    }
+    if (cactus_movement<=10&cactus_movement>=2&g_jump>32&lose_lives_delay_flag==0&shield_flag!=1) {
+        lives--;
+        freeze();
+        lose_lives_delay_flag=1;
+    }
+}
+
+//T Rex physics
+void t_rex()
+{
+    if (joystick.direction==LEFT) {
+        t_rex_movement+=recks_movement;
+    } else if (joystick.direction==RIGHT) {
+        t_rex_movement-=recks_movement;
+    }
+    if (random_num%4==0&print_fire_ball_flag!=1) {
+        t_rex_movement+=3;
+        print_t_rex_moving();
+    } else if (random_num%4==1&print_fire_ball_flag!=1) {
+        t_rex_movement-=3;
+        print_t_rex_moving();
+    } else if (random_num%4>1&print_fire_ball_flag!=1) {
+        print_t_rex();
+    }
+    if (t_rex_movement<=-100) {
+        t_rex_movement=120;
+        print_t_rex_flag=0;
+    }
+    if (t_rex_movement<=6&t_rex_movement>=2&lose_lives_delay_flag==0&shield_flag!=1) {
+        lives--;
+        freeze();
+        lose_lives_delay_flag=1;
+    }
+    if (print_t_rex_flag==1&random_num%10==0&fire_on_screen==0) {
+        fire_on_screen=1;
+        print_fire_ball_flag=1;
+        fire_ball_hMovement=t_rex_movement-6;
+        fire_ball_vMovement=25;
+    }
 }
 
+//Fire ball physics, T Rex only loses lives when fire ball flag is on
+void fire_ball()
+{
+    print_t_rex_attack();
+    fire_ball_hMovement-=4;
+    if (joystick.direction==LEFT) {
+        fire_ball_hMovement+=recks_movement;
+    } else if (joystick.direction==RIGHT) {
+        fire_ball_hMovement-=recks_movement;
+    }
+    if (i%4>=2) {
+        print_fire_ball_p1();
+    } else {
+        print_fire_ball_p2();
+    }
+    if (fire_ball_vMovement>=37) {
+        fire_ball_vMovement=37;
+    }
+    if (random_num%3==0) {
+        fire_ball_vMovement++;
+    } else if (random_num%3==1) {
+        fire_ball_vMovement+=2;
+    }
+    if (fire_ball_hMovement<=-10) {
+        fire_ball_vMovement=27;
+        fire_ball_hMovement=t_rex_movement-6;
+        print_fire_ball_flag=0;
+        fire_on_screen=0;
+    }
+    if (fire_ball_hMovement>=3&fire_ball_hMovement<=8&fire_ball_vMovement>g_jump-5&fire_ball_vMovement<g_jump+10&lose_lives_delay_flag==0&shield_flag!=1) {
+        lives--;
+        freeze();
+        lose_lives_delay_flag=1;
+    }
+    if (shoot_flag==1) {
+        t_rex_lives++;
+        if (t_rex_lives>=27-3*g_g1-3*g_g2) {
+            print_t_rex_flag=0;
+            t_rex_movement=120;
+            kill_score+=20;
+            t_rex_lives=0;
+        }
+    }
+}
+
+//Physics for quicksand
+void quick_sand()
+{
+    print_quick_sand();
+    if (joystick.direction==LEFT) {
+        quick_sand_movement+=recks_movement;
+    } else if (joystick.direction==RIGHT) {
+        quick_sand_movement-=recks_movement;
+    }
+    if (quick_sand_movement<7&quick_sand_movement>-5&jump_flag!=1) {
+        lives-=5;
+        falling_animation();
+        quick_sand_movement=85;
+        if (quick_sand_movement<-8) {
+            print_quick_sand_flag=0;
+        }
+    }
+}
+
+//Heart physics
+void heart()
+{
+    print_heart();
+    if (joystick.direction==LEFT) {
+        heart_movement+=recks_movement;
+    } else if (joystick.direction==RIGHT) {
+        heart_movement-=recks_movement;
+    }
+    if (heart_movement<=7&g_jump>26) {
+        heart_movement=90;
+        print_heart_flag=0;
+        lives++;
+    }
+}
+
+//Ammo pickup physics
+void pickUp_ammo()
+{
+    print_ammo_pickUp();
+    if (joystick.direction==LEFT) {
+        ammo_movement+=recks_movement;
+    } else if (joystick.direction==RIGHT) {
+        ammo_movement-=recks_movement;
+    }
+    if (ammo_movement<=7&g_jump>26) {
+        ammo_movement=90;
+        print_ammo_flag=0;
+        ammo+=5;
+        ammo+=rand()%7;
+    }
+}
+
+//Speedboost physcis. Recks speed increases by one when pucked up
+void speed_boost()
+{
+    print_speed_boost();
+    if (joystick.direction==LEFT) {
+        speed_boost_movement+=recks_movement;
+    } else if (joystick.direction==RIGHT) {
+        speed_boost_movement-=recks_movement;
+    }
+    if (speed_boost_movement<=5&g_jump>26) {
+        speed_boost_movement=120;
+        print_speed_boost_flag=0;
+        recks_movement++;
+    }
+}
+
+//Shield physics
+void shield()
+{
+    print_recks_shield();
+    recks_movement=0;
+    jump_flag=0;
+    shoot_flag=0;
+    shield_counter++;
+    if (shield_counter>=10) {
+        shield_counter=0;
+        recks_movement=2;
+        shield_score+=10;
+        shield_flag=0;
+    }
+}
+
+
+//Game funtion
+//Combines all the privious physics funtions
+//if the story mode is on then it ends after certain tasks are complete
 void Game()
 {
-
     int run_game=1;
     g_music_count=1;
     while (run_game==1) {
@@ -2215,7 +2731,7 @@
         if (g_Ticker_Game_flag) {
             play_music();
             g_Ticker_Game_flag=0;
-            lcd.clear();
+            lcd.clear();       //Clear all the pixels on the LCD screen
             updateJoystick();
             led_bar();
             print_score();
@@ -2245,8 +2761,8 @@
                 } else {
                     bullet_height=g_jump+4;
                 }
-            } else if (shoot_flag==1&loop==0) {
-                loop++;
+            } else if (shoot_flag==1&g_shoot_loop==0) {
+                g_shoot_loop++;
                 ammo--;
                 if (joystick.direction==DOWN&jump_flag!=1) {
                     bullet_height=42;
@@ -2266,421 +2782,43 @@
             } else if (joystick.direction==UP&score<10&jump_flag!=1) {
                 print_recks_still_gun();
             }
-            if (print_t_rex_flag==1&random_num%10==0&fire_on_screen==0) {
-                fire_on_screen=1;
-                print_fire_ball_flag=1;
-                fire_ball_hMovement=t_rex_movement-6;
-                fire_ball_vMovement=25;
-            }
-            if (joystick.direction==CENTRE&jump_flag!=1&shield_flag!=1) {
-                lcd.setPixel(bullet,bullet_height);
-                lcd.setPixel(bullet+1,bullet_height);
-                print_recks_still_gun();
-                if (shoot_flag==1) {
-                    bullet+=20;
-                    if (bullet>=84) {
-                        shoot_flag=0;
-                        loop=0;
-                    }
-                }
-            } else if (joystick.direction==LEFT&jump_flag!=1&shield_flag!=1) {
-                if (run%2==0) {
-                    print_recks_still_gun();
-                } else if (run%2==1) {
-                    print_recks_moving_gun();
-                }
-                lcd.setPixel(bullet,bullet_height);
-                lcd.setPixel(bullet+1,bullet_height);
-                if (shoot_flag==1) {
-                    bullet+=21;
-                    if (bullet>=84) {
-                        shoot_flag=0;
-                        loop=0;
-                    }
-                }
-                h_movement--;
-                run++;
-            } else if (joystick.direction==RIGHT&jump_flag!=1&shield_flag!=1) {
-                if (run%2==0) {
-                    print_recks_still_gun();
-                } else if (run%2==1) {
-                    print_recks_moving_gun();
-                }
-                lcd.setPixel(bullet,bullet_height);
-                lcd.setPixel(bullet+1,bullet_height);
-                if (shoot_flag==1) {
-                    bullet+=19;
-                    if (bullet>=84) {
-                        shoot_flag=0;
-                        loop=0;
-                    }
-                }
-                h_movement++;
-                run++;
-            } else if (joystick.direction==DOWN&jump_flag!=1&shield_flag!=1) {
-                lcd.setPixel(bullet,bullet_height);
-                lcd.setPixel(bullet+1,bullet_height);
-                print_recks_crouch_gun();
-                bullet_height=42;
-                if (shoot_flag==1) {
-                    bullet+=20;
-                    if (bullet>=84) {
-                        shoot_flag=0;
-                        loop=0;
-                    }
-                }
-            } else if (jump_flag==1&shield_flag!=1) {
-                if (joystick.direction==LEFT) {
-                    if (shoot_flag==1) {
-                        bullet+=21;
-                        if (bullet>=84) {
-                            shoot_flag=0;
-                            loop=0;
-                        }
-                    }
-                    h_movement--;
-                } else if (joystick.direction==RIGHT) {
-                    if (shoot_flag==1) {
-                        bullet+=19;
-                        if (bullet>=84) {
-                            shoot_flag=0;
-                            loop=0;
-                        }
-                    }
-                    h_movement++;
-                } else if (joystick.direction==CENTRE) {
-                    if (shoot_flag==1) {
-                        bullet+=20;
-                        if (bullet>=84) {
-                            shoot_flag=0;
-                            loop=0;
-                        }
-                    }
-                }
-                if (g_jump<=36&jumpUp==0&g_jump!=15) {
-                    lcd.setPixel(bullet,bullet_height);
-                    lcd.setPixel(bullet+1,bullet_height);
-                    if (bullet>=84) {
-                        shoot_flag=0;
-                        loop=0;
-                    }
-                    print_recks_jump_gun();
-                    g_jump-=6-accel;
-                    accel++;
-                } else if (g_jump>=15&g_jump!=36) {
-                    lcd.setPixel(bullet,bullet_height);
-                    lcd.setPixel(bullet+1,bullet_height);
-                    if (bullet>=84) {
-                        shoot_flag=0;
-                        loop=0;
-                    }
-                    print_recks_jump_gun();
-                    g_jump+=6-accel;
-                    accel--;
-                    jumpUp=1;
-                } else if (g_jump==36&jumpUp==1) {
-                    lcd.setPixel(bullet,bullet_height);
-                    lcd.setPixel(bullet+1,bullet_height);
-                    if (bullet>=84) {
-                        shoot_flag=0;
-                        loop=0;
-                    }
-                    print_recks_still_gun();
-                    jump_flag=0;
-                    jumpUp=0;
-                    g_jump=36;
-                    accel=0;
-                }
+
+            Recks();
+            if (shield_flag==1) {
+                shield();
             }
             if (print_rat_flag==1) {
-                if (i%4>=2) {
-                    print_mob_rat_p1();
-                } else if (i%4<2) {
-                    print_mob_rat_p2();
-                }
-                if (joystick.direction==LEFT) {
-                    rat_movement+=recks_movement;
-                } else if (joystick.direction==RIGHT) {
-                    rat_movement-=recks_movement;
-                }
-                rat_movement-=3;
-                if (rat_movement<=-15) {
-                    rat_movement=100;
-                    print_rat_flag=0;
-                }
-                if (rat_movement<=5&rat_movement>=-3&g_jump>32&lose_lives_delay_flag==0&shield_flag!=1) {     //a life is lost if recks has an vertical and horizontal position equal to one of the pixels corresponding to the bears position
-                    lives--;
-                    freeze();
-                    lose_lives_delay_flag=1;
-                }
+                rat();
             }
             if (print_hound_flag==1) {
-                if (i%4>=2&hound_jump_flag!=1) {
-                    print_mob_hound_p1();
-                } else if (i%4<2&hound_jump_flag!=1) {
-                    print_mob_hound_p2();
-                }
-                if (joystick.direction==LEFT) {
-                    hound_hMovement+=recks_movement;
-                } else if (joystick.direction==RIGHT) {
-                    hound_hMovement-=recks_movement;
-                }
-                hound_hMovement-=2;
-                if (hound_hMovement<=-15) {
-                    hound_hMovement=100;
-                    print_hound_flag=0;
-                }
-                if (random_num%10==0) {
-                    hound_jump_flag=1;
-                }
-                if (hound_jump_flag==1) {
-                    hound_jump++;
-                    hound_hMovement--;
-                    if (hound_jump==1) {
-                        hound_vMovement-=3;
-                    } else if (hound_jump==2) {
-                        hound_vMovement-=2;
-                    } else if (hound_jump==3) {
-                        hound_vMovement-=1;
-                    } else if (hound_jump==4) {
-                        hound_vMovement+=1;
-                    } else if (hound_jump==5) {
-                        hound_vMovement+=2;
-                    } else if (hound_jump==6) {
-                        hound_vMovement+=3;
-                    } else if (hound_jump==7) {
-                        hound_jump_flag=0;
-                        hound_jump=0;
-                    }
-                    print_mob_hound_p2();
-
-                }
-                if ((hound_hMovement<=8&hound_hMovement>=-5&g_jump>30&lose_lives_delay_flag==0&hound_jump_flag!=1&shield_flag!=1)|(hound_hMovement<=8&hound_hMovement>=-5&g_jump>26&lose_lives_delay_flag==0&hound_jump_flag==1&shield_flag!=1)) {     //a life is lost if recks has an vertical and horizontal position equal to one of the pixels corresponding to the hounds position
-                    lives--;
-                    freeze();
-                    lose_lives_delay_flag=1;
-                }
-                if (shoot_flag==1&bullet_height>hound_vMovement&bullet_height<hound_vMovement+8) {
-                    print_mob_hound_dead();
-                    print_hound_flag=0;
-                    hound_hMovement=90;
-                    kill_score+=5;
-                }
+                hound();
             }
             if (print_bear_flag==1) {
-                if (i%4>=2) {
-                    print_mob_bear_p1();
-                } else if (i%4<2) {
-                    print_mob_bear_p2();
-                }
-                if (joystick.direction==LEFT) {
-                    bear_movement+=recks_movement;
-                } else if (joystick.direction==RIGHT) {
-                    bear_movement-=recks_movement;
-                }
-                bear_movement-=2;
-                if (bear_movement<=-15) {
-                    bear_movement=100;
-                    print_bear_flag=0;
-                }
-                if (bear_movement<=8&bear_movement>=-5&g_jump>26&lose_lives_delay_flag==0&shield_flag!=1) {     //a life is lost if recks has an vertical and horizontal position equal to one of the pixels corresponding to the bears position
-                    lives--;
-                    freeze();
-                    lose_lives_delay_flag=1;
-                }
-                if (shoot_flag==1&bullet_height>38) {
-                    bear_lives++;
-                    if (bear_lives==12-3*g_g1-3*g_g2) {
-                        print_mob_bear_dead();
-                        print_bear_flag=0;
-                        bear_movement=100;
-                        kill_score+=7;
-                        bear_lives=0;
-                    }
-                }
+                bear();
             }
             if (print_bird_flag==1) {
-                if (i%8>=4) {
-                    print_mob_bird_p1();
-                } else if (i%8<4) {
-                    print_mob_bird_p2();
-                }
-                bird_hMovement-=2;
-                if (joystick.direction==LEFT) {
-                    bird_hMovement+=recks_movement;
-                } else if (joystick.direction==RIGHT) {
-                    bird_hMovement-=recks_movement;
-                }
-                if (random_num%6==0) {
-                    bird_vMovement--;
-                } else if (random_num%6>=4) {
-                    bird_vMovement++;
-                }
-                if (bird_vMovement>=37) {
-                    bird_vMovement=37;
-                } else if (bird_vMovement<=10) {
-                    bird_vMovement=10;
-                }
-                if (bird_hMovement<=-10) {
-                    print_bird_flag=0;
-                    bird_hMovement=100;
-                    bird_vMovement=20;
-                    bear_lives=0;
-                }
-                if ((bird_hMovement>=0&bird_hMovement<=10)&(bird_vMovement+5>=g_jump&bird_vMovement+5<=g_jump+10&lose_lives_delay_flag==0)&shield_flag!=1) {
-                    lives--;
-                    freeze();
-                    lose_lives_delay_flag=1;
-                }
-                if (shoot_flag==1&(bullet_height==bird_vMovement+5|bullet_height==bird_vMovement+4)) {
-                    print_mob_bird_dead();
-                    print_bird_flag=0;
-                    bird_hMovement=100;
-                    bird_vMovement=20;
-                    kill_score+=5;
-                }
+                bird();
             }
             if (print_cactus_flag==1) {
-                print_cactus();
-                if (joystick.direction==LEFT) {
-                    cactus_movement+=recks_movement;
-                } else if (joystick.direction==RIGHT) {
-                    cactus_movement-=recks_movement;
-                }
-                if (cactus_movement<=-10) {
-                    cactus_movement=110;
-                    print_cactus_flag=0;
-                }
-                if (cactus_movement<=10&cactus_movement>=2&g_jump>32&lose_lives_delay_flag==0&shield_flag!=1) {
-                    lives--;
-                    freeze();
-                    lose_lives_delay_flag=1;
-                }
+                cactus();
             }
-
             if (print_t_rex_flag==1) {
-                if (joystick.direction==LEFT) {
-                    t_rex_movement+=recks_movement;
-                } else if (joystick.direction==RIGHT) {
-                    t_rex_movement-=recks_movement;
-                }
-                if (random_num%4==0&print_fire_ball_flag!=1) {
-                    t_rex_movement+=3;
-                    print_t_rex_moving();
-                } else if (random_num%4==1&print_fire_ball_flag!=1) {
-                    t_rex_movement-=3;
-                    print_t_rex_moving();
-                } else if (random_num%4>1&print_fire_ball_flag!=1) {
-                    print_t_rex();
-                }
-                if (t_rex_movement<=-100) {
-                    t_rex_movement=120;
-                    print_t_rex_flag=0;
-                }
-                if (t_rex_movement<=6&t_rex_movement>=2&lose_lives_delay_flag==0&shield_flag!=1) {
-                    lives--;
-                    freeze();
-                    lose_lives_delay_flag=1;
-                }
+                t_rex();
             }
             if (print_fire_ball_flag==1) {
-                print_t_rex_attack();
-                fire_ball_hMovement-=4;
-                if (joystick.direction==LEFT) {
-                    fire_ball_hMovement+=recks_movement;
-                } else if (joystick.direction==RIGHT) {
-                    fire_ball_hMovement-=recks_movement;
-                }
-                if (i%4>=2) {
-                    print_fire_ball_p1();
-                } else {
-                    print_fire_ball_p2();
-                }
-                if (fire_ball_vMovement>=37) {
-                    fire_ball_vMovement=37;
-                }
-                if (random_num%3==0) {
-                    fire_ball_vMovement++;
-                } else if (random_num%3==1) {
-                    fire_ball_vMovement+=2;
-                }
-                if (fire_ball_hMovement<=-10) {
-                    fire_ball_vMovement=27;
-                    fire_ball_hMovement=t_rex_movement-6;
-                    print_fire_ball_flag=0;
-                    fire_on_screen=0;
-                }
-                if (fire_ball_hMovement>=3&fire_ball_hMovement<=8&fire_ball_vMovement>g_jump-5&fire_ball_vMovement<g_jump+10&lose_lives_delay_flag==0&shield_flag!=1) {
-                    lives--;
-                    freeze();
-                    lose_lives_delay_flag=1;
-                }
-                if (shoot_flag==1) {
-                    t_rex_lives++;
-                    if (t_rex_lives>=27-3*g_g1-3*g_g2) {
-                        print_t_rex_flag=0;
-                        t_rex_movement=120;
-                        kill_score+=20;
-                        t_rex_lives=0;
-                    }
-                }
+                fire_ball();
             }
-            if (print_chasm_flag==1) {
-                print_chasm();
-                if (joystick.direction==LEFT) {
-                    chasm_movement+=recks_movement;
-                } else if (joystick.direction==RIGHT) {
-                    chasm_movement-=recks_movement;
-                }
-                if (chasm_movement<3&chasm_movement>-5&jump_flag!=1) {
-                    lives-=5;
-                    falling_animation();
-                    chasm_movement=85;
-                    if (chasm_movement<-8) {
-                        print_chasm_flag=0;
-                    }
-
-                }
+            if (print_quick_sand_flag==1) {
+                quick_sand();
             }
             if (print_heart_flag==1) {
-                print_heart();
-                if (joystick.direction==LEFT) {
-                    heart_movement+=recks_movement;
-                } else if (joystick.direction==RIGHT) {
-                    heart_movement-=recks_movement;
-                }
-                if (heart_movement<=7&g_jump>26) {
-                    heart_movement=90;
-                    print_heart_flag=0;
-                    lives++;
-                }
+                heart();
             }
             if (print_ammo_flag==1) {
-                print_ammo_pickUp();
-                if (joystick.direction==LEFT) {
-                    ammo_movement+=recks_movement;
-                } else if (joystick.direction==RIGHT) {
-                    ammo_movement-=recks_movement;
-                }
-                if (ammo_movement<=7&g_jump>26) {
-                    ammo_movement=90;
-                    print_ammo_flag=0;
-                    ammo+=5;
-                    ammo+=rand()%7;
-                }
+                pickUp_ammo();
             }
             if (print_speed_boost_flag==1) {
-                print_speed_boost();
-                if (joystick.direction==LEFT) {
-                    speed_boost_movement+=recks_movement;
-                } else if (joystick.direction==RIGHT) {
-                    speed_boost_movement-=recks_movement;
-                }
-                if (speed_boost_movement<=5&g_jump>26) {
-                    speed_boost_movement=120;
-                    print_speed_boost_flag=0;
-                    recks_movement++;
-                }
+                speed_boost();
             }
             if (recks_movement>=3&i%150==0) {
                 recks_movement=2;
@@ -2691,19 +2829,7 @@
             if (swJoy==1) {
                 Pause();
             }
-            if (shield_flag==1) {
-                print_recks_shield();
-                recks_movement=0;
-                jump_flag=0;
-                shoot_flag=0;
-                shield_counter++;
-                if (shield_counter>=10) {
-                    shield_counter=0;
-                    recks_movement=2;
-                    shield_score+=10;
-                    shield_flag=0;
-                }
-            }
+
 
             if (difficulty==-1&story_mode_flag==1) {
                 if (i>70) {
@@ -2735,31 +2861,33 @@
             print_clouds();
         }
         lcd.refresh();
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
+//Funtion for pause
 void Pause()
 {
     int q;
     lcd.printString("PAUSED",25,3);
     ticker_wait(10);
     while (!swJoy) {
+        q++;
         if (g_Ticker_Menu_flag) {
             g_Ticker_Menu_flag=0;
-            if (swJoy&q>5) {
-                q=0;
-                lcd.setBrightness(brightness);
-                led_bar();
-            } else if (q>=20) {
+            if (q>=20) {
                 lcd.setBrightness(0);
                 led=0;
             }
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
+    lcd.setBrightness(brightness);
+    led_bar();
 }
 
+
+//Funtion that increases game difficuly as difficulty increases
 void set_difficulty()
 {
     switch(difficulty) {
@@ -2851,16 +2979,18 @@
             }  else if (random_num>=8000&random_num<8200) {
                 print_speed_boost_flag=1;
             } else if (random_num>=8200&random_num<9000) {
-                print_chasm_flag=1;
+                print_quick_sand_flag=1;
             }
             break;
     }
 }
 
+
+//Game over funtion
 int Game_over()
 {
     led_bar();
-    lcd.clear();
+    lcd.clear();       //Clear all the pixels on the LCD screen
     sort_top_scores();
     writeSD();
     lcd.printString("GAME",25,1);
@@ -2884,11 +3014,11 @@
                 return 0;
             }
         }
-        sleep();
+        sleep();                    //puts mbed to sleep
     }
 }
 
-
+//Print ammo
 void print_ammo()
 {
     for(int c=0; c<=2; c++) { // 2 beacause the the loop stats from 0 but the array size from 1
@@ -3035,6 +3165,7 @@
     lcd.refresh();
 }
 
+//Print score
 void print_score()
 {
     score=h_movement/10+kill_score-shield_score;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Thu May 05 14:59:45 2016 +0000
@@ -0,0 +1,584 @@
+/**
+@file main.h
+@brief Revision 1.0.
+@author Robin Milward Cooney
+@date   May 2015
+*/
+
+//--------------------------------------INCLUSIONS---------------------------------------------------
+
+#include "mbed.h"
+#include "N5110.h"
+#include "math.h"
+#include "stdint.h"
+#include "SDFileSystem.h"
+#include "gameCharacters.h"
+
+//---------------------------------------------------------------------------------------------------
+
+//-------------------------------------DEFINITIONS---------------------------------------------------
+
+#define joystickTolerance 0.05f
+
+//---------------------------------------------------------------------------------------------------
+
+//--------------------------------------NAMESPACES---------------------------------------------------
+
+/**
+@namespace lcd
+@brief Output pins for lcd screen pin order: VCC,SCE,RST,D/C,MOSI,SCLK,LED
+*/
+N5110 lcd(PTE26,PTA0,PTC4,PTD0,PTD2,PTD1,PTC3);
+
+/**
+@namespace led
+@brief LED bus output, each pinout represents a LED on a LED bar, from bottom to top
+*/
+BusOut led(PTC8,PTC9,PTC0,PTC7,PTC5);
+
+/**
+@namespace sd
+@brief SD card output, the pins are in the following order: MOSI, MISO, SCK, CS
+*/
+SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd");
+
+/**
+@namespace red_led
+@brief Red LED output on mbed, used for error messages and debugging when reading and or writing on SD card
+*/
+DigitalOut red_led(LED_RED);
+
+/**
+@namespace green_led
+@brief Green LED output on mbed, used for success messages when reading and or writing on SD card
+*/
+DigitalOut green_led(LED_GREEN);
+
+/**
+@namespace swJoy
+@brief Switch on potentiomiter. DigitalIn and to be polled using a ticker
+*/
+DigitalIn swJoy(PTB18);                                 //define potentiomiter switch
+
+/**
+@namespace xPot
+@brief AnalogIn that correspods the horizontal movement of the joystick
+*/
+AnalogIn xPot(PTB2);
+
+/**
+@namespace yPot
+@brief AnalogIn that correspods the virtical movement of the joystick
+*/
+AnalogIn yPot(PTB3);
+
+/**
+@namespace b_A
+@brief Additional pushbutton (PullDown). DigitalIn and to be polled using a ticker
+*/
+DigitalIn b_A(PTE24);
+
+/**
+@namespace b_A
+@brief Additional pushbutton (PullDown). DigitalIn and to be polled using a ticker
+*/
+DigitalIn b_B(PTE25);
+
+/**
+@namespace press_bA
+@brief IterruptIn corresponding to the pushbutton A (PullDown). To be used when polling using a ticker is inconvinient or inefficient
+*/
+InterruptIn press_b_A(PTE24);
+
+/**
+@namespace press_bA
+@brief IterruptIn corresponding to the pushbutton B (PullDown). To be used when polling using a ticker is inconvinient or inefficient
+*/
+InterruptIn press_b_B(PTE25);
+
+/**
+@namespace PWM
+@brief Pulse width modulation output conected to buzzer to contol the music
+*/
+PwmOut PWM(PTC11);
+
+
+/**
+@namespace Ticker_Menu
+@brief Ticker used for polling the joysick and the digital inputs while the menu funtions are running
+*/
+Ticker Ticker_Menu;
+
+/**
+@namespace Ticker_Game
+@brief Ticker used for polling the joysick and the digital inputs while the game funtion is running
+*/
+Ticker Ticker_Game;
+
+/**
+@namespace Ticker_ds
+@brief Ticker used to create a more energy efficient wait() funtion
+*/
+Ticker Ticker_ds;
+
+/**
+@namespace tOut
+@brief Timeout used to implement music. It turns the buzzer off at the correct moment
+*/
+Timeout tOut;
+
+/**
+@namespace Highscores
+@brief File that stores an array of the top 5 highscores
+*/
+FILE *Highscores;
+
+/**
+@namespace Progress
+@brief File that stores the progress (i.e unlocked chapeters) of the Story Mode
+*/
+FILE *Progress;
+
+//--------------------------------------------------------------------------------------
+
+//---------------------------------VARIABLES--------------------------------------------
+
+int i=0;                   /*!< Loop counter for the game() funtion */
+int recks_movement=2;      /*!< Global variable that deffines the direction of all mobs with respect to Recks (main character)*/
+int g_jump=36;             /*!< Global variable that deffines the vertical possition of Recks and the bullet during the jumping action*/
+int jumpUp;                /*!< Global variable that flags depending on the direction of Recks while jumping. 0 when going up, 1 when going down*/
+int accel=0;               /*!< Global variable that changes every loop during the jump to increase or decrease the velociry of Recks during the jump. Providing real time physics*/
+int hound_jump=0;          /*!< Global variable that changes every loop during the jump to increase or decrease the velociry of the hound during the jump. Providing real time physics*/
+int fall=37;               /*!< Variable that deffines the vertical possition of Recks when he is in Quick sand, decreases at a constant velocity*/
+int bullet=9;              /*!< Global variable that deffines the horizontal possition of the bullet*/
+int bullet_height;         /*!< Global variable that deffines the vertical possition of the bullet*/
+int menu_select;            /*!< Global variable, it the output of the fsm that deffines what item on the menus have been selected*/
+int menuState=0;            /*!< Global variable, it is the current state of the fsm*/
+double lives=4;                 /*!< Global variable that indicates the number of lives Recks has*/
+int score=0;                /*!< Global variable inticating the overall number of points achieved duning the game, it is the variable saved to the highscores[] array after.
+                            Score=h_movement/10+killscore-shield_score*/
+int kill_score;             /*!< Global variable inticating the number of points achieved duning by destroying the mobsr*/
+int shield_score;           /*!< Global variable counting the ammount of times the shield has been used and for every time it decreases the overall score by 10 points*/
+int shield_counter=0;       /*!< Global variable that counts the number of loops the shield has been "On" for*/
+int h_movement=0;           /*!< Global variable that counts the distance travelled by Recks, and is used
+                                 to contol the horizontal possition of the clouds. Diffrent to recks_movement in order so the
+                                 forgrond can move faster than than the background giving it a sense of perspective. Also used
+                                 to calcualte the score.*/
+int ammo=24;                /*!< Global variable indicating the number of bullets left to use, decreases when a bullet is shot, increasis when ammo is picked up*/
+int g_shoot_loop=0;             /*!< Global variable that prevents a bullet beeing shot while there is already a bullet on screen, when the bullet is onscreen it is >0 otherwhise it is 0*/
+int fire_on_screen=0;           /*!< Global variable that prevents another fireball beeing shot while there is already a fire ball on screen, when the fire ball is onscreen it is >0 otherwhise it is 0*/
+int story_mode_flag=0;          /*!< Global variable that flags when the player is in the story mode, rather than in the minigame */
+int lose_lives_delay_flag=0;    /*!< Global variable that flags when the player loses a life and resets to 0 after 1 second. This means that there is a recovery time after losing a life*/
+int lives_delay_loop=0;         /*!< Global variable indicating the number of times the lose_lives_delay_flag statement has iterated, after a certain numeer of itterations it resets the
+                                    flag and the value to 0. Mening the revovery time is over*/
+int difficulty=2;               /*!< Global variable that dictates the probability of certain flags swtiching, i.e it it's low then less enemies appear therefore the game is easier*/
+int story_progress=1;           /*!< Global variable that indicates the story mode progress, it increases after each chapter then autosaves to the Progress file on SD card*/
+int g_story_mode_win=0;         /*!< Global variable that indicates whether the final chapter is complete*/
+int bear_lives=0;               /*!< Global vairable that indicates the number of bullets taken by the bear/3*/
+int t_rex_lives=0;              /*!< Global vairable that indicates the number of bullets taken by the T Rex/3*/
+int g_music_count=1;            /*!< Global vairable that indicates the location of the note in the song array*/
+int g_top_scores[6];            /*!< Global array that stores the 6 top scores, only the 5 highest are printed*/
+float brightness=0.5;           /*!< Global vairable that indicated the brighntness of the lcd screen*/
+int random_num;                 /*!< Global vairable, random number created in the generate_random_number() funtion*/
+int g_g1;                       /*!< Global vaiable that is is 1 when the players selects revolver*/
+int g_g2;                       /*!< Global vaiable that is is 1 when the players selects rifle*/
+
+//******************MOVEMENT GLOBAL VARIABLES*******************
+// These global variables indicate the horizontal (or vertical) movement of all the different interactive elements (mobs, pick ups, speed boosts...)
+//If it's horizontal movement it is indicated by either "element name"_movement or "element name"_hMovement the vertical movement is indicaded by "element name"_vMovement
+int rat_movement=95;        /*!< Global variable indicating the horizontal movement of the rat*/
+int hound_hMovement=98;     /*!< Global variable indicating the horizontal movement of the hound*/
+int hound_vMovement=40;     /*!< Global variable indicating the vertical movement of the hound*/
+int bear_movement=100;      /*!< Global variable indicating the horizontal movement of the bear*/
+int bird_hMovement=95;      /*!< Global variable indicating the horizontal movement of the bird*/
+int bird_vMovement=20;      /*!< Global variable indicating the vertical movement of the bird*/
+int cactus_movement=110;    /*!< Global variable indicating the horizontal movement of the cactus*/
+int t_rex_movement=120;     /*!< Global variable indicating the horizontal movement of the T Rex*/
+int quick_sand_movement=85; /*!< Global variable indicating the horizontal movement of the Quick sand*/
+int fire_ball_hMovement=t_rex_movement-6; /*!< Global variable indicating the horizontal movement of the fire ball made by the T Rex*/
+int fire_ball_vMovement=25;               /*!< Global variable indicating the vertical movement of the fire ball made by the T Rex*/
+int heart_movement=90;      /*!< Global variable indicating the horizontal movement of the fire ball made by the heart pick up*/
+int ammo_movement=100;      /*!< Global variable indicating the horizontal movement of the fire ball made by the ammo pick up*/
+int speed_boost_movement=130;   /*!< Global variable indicating the horizontal movement of the fire ball made by the speed boost pick up*/
+//**************************************************************
+
+//*****FLAGS FOR ACCTIONS AND PRINTING INTERACTIVE ELEMENTS*****
+//These falgs are randomly activated (more or less frequently depending on the difficulty). For interactive elements when the flag is "On" (=1) the
+//element is printed, the flag is then cleared when the element either moves offscreen or is destroyed or picked up. For the action flags (jump, shoot
+//shield) the flag is cleared when the action is over.
+int jump_flag=0;            /*!< Global variable that flags (=1) when the jump button is pressed and unflags(=0) when the jump has finished*/
+int shoot_flag=0;           /*!< Global variable that flags (=1) when the shoot button is pressed and unflags(=0) when the bulllet has left the screen*/
+int shield_flag=0;          /*!< Global variable that flags (=1) when the shield is activated (joystick pointed upwards)and unflags(=0) after 1 second*/
+int print_rat_flag=0;       /*!< Global variable that flags (=1) randomly and prints the rat onscreen. It unflags(=0) when the rat leaves the screen*/
+int print_hound_flag=0;     /*!< Global variable that flags (=1) randomly and prints the hound onscreen. It unflags(=0) when the hound leaves the screen or is destroyed*/
+int hound_jump_flag=0;      /*!< Global variable that flags (=1) randomly to make the hound jump. It unflags(=0) when the jump is over*/
+int print_bear_flag=0;      /*!< Global variable that flags (=1) randomly and prints the bear onscreen. It unflags(=0) when the bear leaves the screen or is destroyed*/
+int print_bird_flag=0;      /*!< Global variable that flags (=1) randomly and prints the bird onscreen. It unflags(=0) when the bird leaves the screen or is destroyed*/
+int print_heart_flag=0;     /*!< Global variable that flags (=1) randomly and prints the heart pickup onscreen. It unflags(=0) when the pickup leaves the screen or is picked up*/
+int print_ammo_flag=0;       /*!< Global variable that flags (=1) randomly and prints the ammo pickup onscreen. It unflags(=0) when the pickup leaves the screen or is picked up*/
+int print_speed_boost_flag=0;    /*!< Global variable that flags (=1) randomly and prints the speed boost pickup onscreen. It unflags(=0) when the pickup leaves the screen or is picked up*/
+int print_cactus_flag=0;      /*!< Global variable that flags (=1) randomly and prints the cactus onscreen. It unflags(=0) when the cactus leaves the screen*/
+int print_t_rex_flag=0;        /*!< Global variable that flags (=1) randomly and prints the T Rex onscreen. It unflags(=0) when the T Rex leaves the screen or is destroyed*/
+int print_fire_ball_flag=0;     /*!< Global variable that flags (=1) randomly when the print_t_rex_flag is flagged and prints the T Rex onscreen. It unflags(=0) when the fire ball leaves the screen*/
+int print_quick_sand_flag=0;    /*!< Global variable that flags (=1) randomly and prints the quicksand onscreen. It unflags(=0) when the quicksand leaves the screen*/
+//****************************************************************
+
+//*******************FLAGS FOR TICKERS AND INTERRUPTS*************
+volatile int g_Ticker_Menu_flag=0;  /*!<Global variable to flag the menu ticker*/
+volatile int g_Ticker_Game_flag=0;  /*!<Global variable to flag the game ticker*/
+volatile int g_Ticker_Music_flag=0; /*!<Global variable to flag the music ticker*/
+volatile int g_Ticker_ds_flag=0;    /*!<Global variable to flag the ticker for the ticker wait funtion*/
+volatile int g_press_b_A_flag=0;    /*!<Global variable to flag the Interrupt of button A*/
+volatile int g_press_b_B_flag=0;    /*!<Global variable to flag the Interrupt of button B*/
+//*****************************************************************
+
+//***********************FINITE STATE MACHINE**********************
+struct menuState {      /*!<Struct declaring the fsm */
+    int menu_select;
+    int nextState[5];
+};
+typedef const struct menuState STyp;
+
+STyp fsm_main_menu[5] = {
+    {0,{0,1,4,0,0}},
+    {8,{1,2,0,1,1}},
+    {16,{2,3,1,2,2}},
+    {24,{3,4,2,3,3}},
+    {32,{4,0,3,4,4}}
+};
+
+STyp fsm_settings_menu[5] = {
+    {0,{0,1,2,0,0}},
+    {8,{1,2,0,1,1}},
+    {16,{2,3,1,2,2}},
+    {24,{3,0,2,3,3}},
+    {32,{4,4,4,4,4}}
+};
+//*****************************************************************
+
+enum joystickDirection {    //enum type for every neccessary direction of the joystick
+    CENTRE,                 //when the joystick isn't moved
+    DOWN,
+    UP,
+    LEFT,
+    RIGHT,
+};
+
+typedef struct JoyStick Joystick;       //struct for Joystick
+struct JoyStick {
+    float x;    // current x value
+    float x0;   // 'centred' x value
+    float y;    // current y value
+    float y0;   // 'centred' y value
+    int swJoy; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
+    joystickDirection direction;  // current direction
+};
+
+// create struct variable
+Joystick joystick;
+
+
+
+//------------------------------------------------------------------------------------------------------------------
+
+//---------------------------------------------FUNTIONS-------------------------------------------------------------
+
+/// Initializes all game values so that when the game ends everything returns to it's normal state
+void initialize_values();
+
+/**Waits for t/10 seconds, a more energy efficient but same funtionality as wait()
+@param t - time in 0.1*seconds*/
+void ticker_wait(int t);
+
+///Generates a random munber between 0 and 9999 using the clock on the mbed as a source for the srand() funtion
+void generate_random_number();
+
+///Displayes the current number of lives on the led bar
+void led_bar();
+
+///Plays the next note form song1 array on the piezo buzzer
+void play_music();
+
+//*******************TICKERS, INTERUPTS AND TIMEOUTS****************
+///Funtion that sets g_Ticker_Menu_flag=1
+void Ticker_Menu_isr();
+
+///Funtion that sets g_Ticker_Game_flag=1
+void Ticker_Game_isr();
+
+///Funtion that sets g_Ticker_ds_flag=1
+void Ticker_ds_isr();
+
+///Funtion that sets PWM.period=0.0, so that the tune stops when it times-out
+void music_tOut();
+
+///Funtion that sets g_press_b_A_flag=1
+void press_b_A_isr();
+
+///Funtion that sets g_press_b_B_flag=1
+void press_b_B_isr();
+
+//*******************************************************************
+
+//******************************JOYSTICK*****************************
+/**Funtion that reads the joystick position when it is still and form those readings it allocates
+values of xPot and yPot that are equicalent to the directions UP, DOWN, LEFT, RIGHT, CENTRE*/
+void calibrateJoystick();
+
+/**Reads the current values of xPot and yPot and detemins the position of the joysick*/
+void updateJoystick();
+
+//*******************************************************************
+
+//*******************SD CARD & FILE MANAGEMENT***********************
+/**Reads the Pregress file on the SD card*/
+void readSD_progress();
+
+/**Writes the current game progress onto the Progress file on the SD card*/
+void writeSD_progress();
+
+/**Reads the Highscores file on the SD card and prints the 5 highest numbers in the Highscores array on the lcd screen*/
+void readSD_and_print_top_score();
+
+/**Writes the topscore on the 6th position in the Highscores array (so it doesn't overwrite any values that are already stored)*/
+void writeSD();
+
+///Sorts the values and orders them in descending order
+void sort_top_scores();
+
+/**Funtion to delete a file
+@param filename[] - Name of file that is to be deleted*/
+void delete_file(char filename[]);
+
+///Delete the Highscores file
+void Delete_Highscores();
+
+//*****************************************************************
+
+//************************PRINTING ON LCD**************************
+///Prints the name of the game for 3 seconds when it's turned on
+void intro();
+
+///Prints the credits on the LCD
+void Credits();
+
+///Prints the floor on the LCD
+void ground();
+
+///Prints the g_heart array on the LCD
+void print_heart();
+
+///Prints the g_ammo_pickUP on the LCD
+void print_ammo_pickUp();
+
+///Prints the g_speed_boost on the LCD
+void print_speed_boost();
+
+///Prints Recks (main character), the g_recks_still_gun array on the LCD
+void print_recks_still_gun();
+
+///Prints the g_recks_moving_gun array on the LCD
+void print_recks_moving_gun();
+
+///Prints the g_recks_crouch_gun array on the LCD
+void print_recks_crouch_gun();
+
+///Prints the g_recks_shield array on the LCD
+void print_recks_shield();
+
+///Prints the g_recks_jump_gun array on the LCD
+void print_recks_jump_gun();
+
+///Prints the g_recks_falling array on the LCD
+void print_recks_falling();
+
+///Prints the g_mob_rat_p1 (position 1) array on the LCD
+void print_mob_rat_p1();
+
+///Prints the g_mob_rat_p2 (position 2) array on the LCD
+void print_mob_rat_p2();
+
+///Prints the g_mob_hound_p1 (position 1) array on the LCD
+void print_mob_hound_p1();
+
+///Prints the g_mob_hound_p2 (position 2) array on the LCD
+void print_mob_hound_p2();
+
+///Prints the g_mob_hound_dead array on the LCD
+void print_mob_hound_dead();
+
+///Prints the g_mob_bear_p1 (position 1) array on the LCD
+void print_mob_bear_p1();
+
+///Prints the g_mob_bear_p2 (position 2) array on the LCD
+void print_mob_bear_p2();
+
+///Prints the g_mob_bear_dead array on the LCD
+void print_mob_bear_dead();
+
+///Prints the g_mob_bird_p1 (position 1) array on the LCD
+void print_mob_bird_p1();
+
+///Prints the g_mob_bird_p2 (position 2) array on the LCD
+void print_mob_bird_p2();
+
+///Prints the g_mob_bear_dead array on the LCD
+void print_mob_bird_dead();
+
+///Prints the cactus array on the LCD
+void print_cactus();
+
+///Prints the g_t_rex array on the LCD
+void print_t_rex();
+
+///Prints the g_t_rex_moving array on the LCD
+void print_t_rex_moving();
+
+///Prints the g_t_rex_attack array on the LCD
+void print_t_rex_attack();
+
+///Prints the g_fire_ball_p1 (position 1) array on the LCD
+void print_fire_ball_p1();
+
+///Prints the g_fire_ball_p2 (position 2) array on the LCD
+void print_fire_ball_p2();
+
+///Prints the g_clouds array on the LCD
+void print_clouds();
+
+/**Prints the g_clouds array on the LCD. It prints it multiple times next to the
+corresponding chapter. They are either locked or unlocked depending on the 
+story_progress value*/
+void print_locks();
+
+/// Prints a line of lengh 16 one pixel above the ground
+void print_quick_sand();
+
+/// Prints animation of Recks sinking in quick sand
+void falling_animation();
+
+///Prints "SCORE" and the current score value on the top left of the LCD screen
+void print_score();
+
+///Pritns "AMMO" and the remaining ammo on the top right of the LCD screen
+void print_ammo();
+//***************************************************************
+
+//******************************MENU'S***************************
+/**Funtion that pritns the main menu options and allows the user to select 
+one of the options by pressing the button A. */
+void main_menu();
+
+/**Funtion that pritns the story mode menu options and allows the user to select 
+one of the chapters by pressing the button A or returning to the main menu by
+pressing the button B. */
+void Story_Mode();
+
+/**Funtion that pritns the settings menu options and allows the user to select 
+one of the options by pressing the button A or returning to the main menu by
+pressing the button B. */
+void Settings();
+
+/**Funtion that pritns the brightness menu options and allows the user to select 
+one of the different brightnesses by pressing the button A or returning to the 
+main menu by pressing the button B. */
+void Brightness();
+
+/**Funtion that pritns the difficulty menu options and allows the user to select 
+one of the different difficulties by pressing the button A or returning to the 
+main menu by pressing the button B. */
+void Difficulty();
+
+/**Funtion that allows the user to view the highscores and returning to the main 
+menu by pressing the button B. */
+void Leaderboard();
+
+/**Funtion that pritns the guns options and allows the user to select 
+one of the different guns by pressing the button A or returning to the 
+main menu by pressing the button B. */
+void guns();
+//****************************************************************
+
+//***************************GAME PHYSICS*************************
+/**Funtion that contols the motion, physics and interations of Recks with the other
+ interactive elements*/
+void Recks();
+
+/**Funtion that contols the motion, physics and interations of the rat with Recks*/
+void rat();
+
+/**Funtion that contols the motion, physics and interations of the hound with Recks*/
+void hound();
+
+/**Funtion that contols the motion, physics and interations of the bear with Recks*/
+void bear();
+
+/**Funtion that contols the motion, physics and interations of the bird with Recks*/
+void bird();
+
+/**Funtion that contols the motion, physics and interations of the cactus with Recks*/
+void cactus();
+
+/**Funtion that contols the motion, physics and interations of the T Rex with Recks*/
+void t_rex();
+
+/**Funtion that contols the motion, physics and interations of the fire ball with Recks*/
+void fire_ball();
+
+/**Funtion that contols the motion, physics and interations of the quick sand with Recks*/
+void quick_sand();
+
+/**Funtion that contols the motion, physics and interations of the heart pickup with Recks*/
+void heart();
+
+/**Funtion that contols the motion, physics and interations of the ammo pickup with Recks*/
+void pickUp_ammo();
+
+/**Funtion that contols the motion, physics and interations of the speed boost with Recks*/
+void speed_boost();
+
+/**Funtion that turns on the shield*/
+void shield();
+//****************************************************************
+
+//***************************GAME MODES***************************
+/**This funtion sets flags for printing interactive elements, depending on the difficulty
+leavel selected*/
+void set_difficulty();
+
+/**Funtion that runs the game*/
+void Game();
+
+/**Funtion that runs the game without the sory mode*/
+void Minigame();
+
+/**Funtion that prints sequential text introducing the game, and the game funtions*/
+void Tutorial();
+
+/**Funtion that prints sequential text introducing the story and then runs the game
+on a easy difficulty setting*/
+void Chapter1();
+
+/**Funtion that prints sequential text expanding the story and then runs the game
+on a increased difficulty setting*/
+void Chapter2();
+
+/**Funtion that prints sequential text expanding the story and then runs the game
+on a increased difficulty setting*/
+void Chapter3();
+
+/**Funtion that prints sequential text expanding the story and then runs the game
+with a final boss fight*/
+void Chapter4();
+
+/**Funtion that runs when the lives global variable is 0. Printing a game over message
+@returns 0 or 1. 0 returns back to the main menu and 1 re-plays the game after initializing values
+*/
+int Game_over();
+
+/**Funtion that stops the game and powers down the LED's until the joystick button is pressed*/
+void Pause();
+//*****************************************************************
+
+
+
--- a/tone.lib	Wed May 04 10:12:58 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-tone#49f37519d581