Robin Milward Cooney 200849894
Dependencies: N5110 SDFileSystem gameCharacters mbed
Revision 3:4b254b4bd6d4, committed 2016-05-05
- Comitter:
- robinmc
- Date:
- Thu May 05 14:59:45 2016 +0000
- Parent:
- 2:158d57cdbf1e
- Commit message:
- Fun game
Changed in this revision
--- 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