Robin Milward Cooney 200849894
Dependencies: N5110 SDFileSystem gameCharacters mbed
main.cpp
- Committer:
- robinmc
- Date:
- 2016-05-05
- Revision:
- 3:4b254b4bd6d4
- Parent:
- 2:158d57cdbf1e
File content as of revision 3:4b254b4bd6d4:
/**
@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
(c) Robni Milward Cooney Uniersity of Leeds, 06/03/16
*/
#include "main.h"
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()
{
//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;
hound_jump=0;
bear_movement=100;
bird_hMovement=95;
bird_vMovement=20;
cactus_movement=110;
t_rex_movement=120;
quick_sand_movement=85;
fire_ball_hMovement=t_rex_movement-6;
fire_ball_vMovement=25;
heart_movement=90;
ammo_movement=100;
//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;
hound_jump_flag=0;
//All print flags are set to 0
print_rat_flag=0;
print_hound_flag=0;
print_bear_flag=0;
print_bird_flag=0;
print_heart_flag=0;
print_ammo_flag=0;
print_speed_boost_flag=0;
print_cactus_flag=0;
print_t_rex_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;
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++) { //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 increases every loop until q=t
}
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"); //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"); //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"); //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); //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); //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"); //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); //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); //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
remove(filename); // and then delete
lcd.printString("Done!",0,5);
ticker_wait(10);
}
// if we can't open it, it doesn't exist and so we can't delete it
lcd.refresh();
}
void Delete_Highscores()
{
lcd.clear(); //Clear all the pixels on the LCD screen
while (1) {
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) { //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); //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) { //If it's not, returns to the main menu
return;
}
}
lcd.refresh();
sleep(); //puts mbed to sleep
}
} else if (b_B==1) { //If it's not, returns to the main menu
return;
}
}
lcd.refresh();
sleep(); //puts mbed to sleep
}
}
//Sorts all the top scores in descending order
void sort_top_scores()
{
g_top_scores[5]=score; //The 5 element is equal to the score
int 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
}
}
}
}
//Funtion that plays the song1
void play_music()
{
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]))) { //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; //otherwise it sets it back to one
}
}
//Generates a random number between 0 and 9999
void generate_random_number()
{
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
}
//Converts the socre value so it can be dysplayed as a bar
void led_bar()
{
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;
}
}
void ground() //funtion to print the ground
{
for (int x = 0; x<=84 ; x++) {
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
for(int r=0; r<=4; r++) {
if (g_heart[r][c]==0) {
if (lcd.getPixel(c+heart_movement,r+35)!=0) {
lcd.setPixel(c+heart_movement,r+35);
} else {
lcd.clearPixel(c+heart_movement,r+35);
}
} else if (g_heart[r][c]==1) {
lcd.setPixel(c+heart_movement,r+35);
}
}
}
}
//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
for(int r=0; r<=7; r++) {
if (g_ammo_pickUp[r][c]==0) {
if (lcd.getPixel(c+ammo_movement,r+35)!=0) {
lcd.setPixel(c+ammo_movement,r+35);
} else {
lcd.clearPixel(c+ammo_movement,r+35);
}
} else if (g_ammo_pickUp[r][c]==1) {
lcd.setPixel(c+ammo_movement,r+35);
}
}
}
}
//Funtion that prints the speed boost pickup
void print_speed_boost()
{
for (int c=0; c<=13; c++) {
for (int r=0; r<=6; r++) {
if (g_speed_boost[r][c]==0) {
if (lcd.getPixel(c+speed_boost_movement,r+38)!=0) {
lcd.setPixel(c+speed_boost_movement,r+38);
} else {
lcd.clearPixel(c+speed_boost_movement,r+38);
}
} else if (g_speed_boost[r][c]==1) {
lcd.setPixel(c+speed_boost_movement,r+38);
}
}
}
}
//Funtion that prints recks still
void print_recks_still_gun()
{
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++) {
if (g_recks_still_gun[r][c]==0) {
if (lcd.getPixel(c+3,r+37)!=0) {
lcd.setPixel(c+3,r+37);
} else {
lcd.clearPixel(c+3,r+37);
}
} else if (g_recks_still_gun[r][c]==1) {
lcd.setPixel(c+3,r+37);
}
}
}
}
//Funtion that prints recks moveing
void print_recks_moving_gun()
{
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++) {
if (g_recks_moving_gun[r][c]==0) {
if (lcd.getPixel(c+3,r+37)!=0) {
lcd.setPixel(c+3,r+37);
} else {
lcd.clearPixel(c+3,r+37);
}
} else if (g_recks_moving_gun[r][c]==1) {
lcd.setPixel(c+3,r+37);
}
}
}
}
//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
for(int r=0; r<=9; r++) {
if (g_recks_crouch_gun[r][c]==0) {
if (lcd.getPixel(c+3,r+37)!=0) {
lcd.setPixel(c+3,r+37);
} else {
lcd.clearPixel(c+3,r+37);
}
} else if (g_recks_crouch_gun[r][c]==1) {
lcd.setPixel(c+3,r+37);
}
}
}
}
//Funtion that prints recks with the shield
void print_recks_shield()
{
for(int c=0; c<=14; c++) {
for(int r=0; r<=14; r++) {
if (g_recks_shield[r][c]==0) {
if (lcd.getPixel(c,r+33)!=0) {
lcd.setPixel(c,r+33);
} else {
lcd.clearPixel(c,r+33);
}
} else if (g_recks_shield[r][c]==1) {
lcd.setPixel(c,r+33);
}
}
}
}
//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
for(int r=0; r<=9; r++) {
if (g_recks_jump_gun[r][c]==0) {
if (lcd.getPixel(c+3,r+g_jump)!=0) {
lcd.setPixel(c+3,r+g_jump);
} else {
lcd.clearPixel(c+3,r+g_jump);
}
} else if (g_recks_jump_gun[r][c]==1) {
lcd.setPixel(c+3,r+g_jump);
}
}
}
}
//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
for(int r=0; r<=9; r++) {
if (g_recks_still_gun[r][c]==0) {
if (lcd.getPixel(c+3,r+fall)!=0) {
lcd.setPixel(c+3,r+fall);
} else {
lcd.clearPixel(c+3,r+fall);
}
} else if (g_recks_still_gun[r][c]==1) {
lcd.setPixel(c+3,r+fall);
}
}
}
}
//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++) {
if (g_mob_rat_p1[r][c]==0) {
if (lcd.getPixel(c+rat_movement,r+44)!=0) {
lcd.setPixel(c+rat_movement,r+44);
} else {
lcd.clearPixel(c+rat_movement,r+44);
}
} else if (g_mob_rat_p1[r][c]==1) {
lcd.setPixel(c+rat_movement,r+44);
}
}
}
}
//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++) {
if (g_mob_rat_p2[r][c]==0) {
if (lcd.getPixel(c+rat_movement,r+44)!=0) {
lcd.setPixel(c+rat_movement,r+44);
} else {
lcd.clearPixel(c+rat_movement,r+44);
}
} else if (g_mob_rat_p2[r][c]==1) {
lcd.setPixel(c+rat_movement,r+44);
}
}
}
}
//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++) {
if (g_mob_hound_p1[r][c]==0) {
if (lcd.getPixel(c+hound_hMovement,r+hound_vMovement)!=0) {
lcd.setPixel(c+hound_hMovement,r+hound_vMovement);
} else {
lcd.clearPixel(c+hound_hMovement,r+hound_vMovement);
}
} else if (g_mob_hound_p1[r][c]==1) {
lcd.setPixel(c+hound_hMovement,r+hound_vMovement);
}
}
}
}
//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++) {
if (g_mob_hound_p2[r][c]==0) {
if (lcd.getPixel(c+hound_hMovement,r+hound_vMovement)!=0) {
lcd.setPixel(c+hound_hMovement,r+hound_vMovement);
} else {
lcd.clearPixel(c+hound_hMovement,r+hound_vMovement);
}
} else if (g_mob_hound_p2[r][c]==1) {
lcd.setPixel(c+hound_hMovement,r+hound_vMovement);
}
}
}
}
//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++) {
if (g_mob_hound_dead[r][c]==0) {
if (lcd.getPixel(c+hound_hMovement,r+hound_vMovement)!=0) {
lcd.setPixel(c+hound_hMovement,r+hound_vMovement);
} else {
lcd.clearPixel(c+hound_hMovement,r+hound_vMovement);
}
} else if (g_mob_hound_dead[r][c]==1) {
lcd.setPixel(c+hound_hMovement,r+hound_vMovement);
}
}
}
}
//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++) {
if (g_mob_bear_p1[r][c]==0) {
if (lcd.getPixel(c+bear_movement,r+37)!=0) {
lcd.setPixel(c+bear_movement,r+37);
} else {
lcd.clearPixel(c+bear_movement,r+37);
}
} else if (g_mob_bear_p1[r][c]==1) {
lcd.setPixel(c+bear_movement,r+37);
}
}
}
}
//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++) {
if (g_mob_bear_p2[r][c]==0) {
if (lcd.getPixel(c+bear_movement,r+37)!=0) {
lcd.setPixel(c+bear_movement,r+37);
} else {
lcd.clearPixel(c+bear_movement,r+37);
}
} else if (g_mob_bear_p2[r][c]==1) {
lcd.setPixel(c+bear_movement,r+37);
}
}
}
}
//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++) {
if (g_mob_bear_dead[r][c]==0) {
if (lcd.getPixel(c+bear_movement,r+37)!=0) {
lcd.setPixel(c+bear_movement,r+37);
} else {
lcd.clearPixel(c+bear_movement,r+37);
}
} else if (g_mob_bear_dead[r][c]==1) {
lcd.setPixel(c+bear_movement,r+37);
}
}
}
}
//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++) {
if (g_mob_bird_p1[r][c]==0) {
if (lcd.getPixel(c+bird_hMovement,r+bird_vMovement)!=0) {
lcd.setPixel(c+bird_hMovement,r+bird_vMovement);
} else {
lcd.clearPixel(c+bird_hMovement,r+bird_vMovement);
}
} else if (g_mob_bird_p1[r][c]==1) {
lcd.setPixel(c+bird_hMovement,r+bird_vMovement);
}
}
}
}
//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++) {
if (g_mob_bird_p2[r][c]==0) {
if (lcd.getPixel(c+bird_hMovement,r+bird_vMovement)!=0) {
lcd.setPixel(c+bird_hMovement,r+bird_vMovement);
} else {
lcd.clearPixel(c+bird_hMovement,r+bird_vMovement);
}
} else if (g_mob_bird_p2[r][c]==1) {
lcd.setPixel(c+bird_hMovement,r+bird_vMovement);
}
}
}
}
//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++) {
if (g_mob_bird_dead[r][c]==0) {
lcd.clearPixel(c+bird_hMovement,r+bird_vMovement);
} else if (g_mob_bird_dead[r][c]==1) {
lcd.setPixel(c+bird_hMovement,r+bird_vMovement);
}
}
}
}
//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 (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 (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
for(int r=0; r<=27; r++) {
if (g_t_rex[r][c]==0) {
if (lcd.getPixel(c+t_rex_movement,r+19)!=0) {
lcd.setPixel(c+t_rex_movement,r+19);
} else {
lcd.clearPixel(c+t_rex_movement,r+19);
}
} else if (g_t_rex[r][c]==1) {
lcd.setPixel(c+t_rex_movement,r+19);
}
}
}
}
//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
for(int r=0; r<=27; r++) {
if (g_t_rex_moving[r][c]==0) {
if (lcd.getPixel(c+t_rex_movement,r+19)!=0) {
lcd.setPixel(c+t_rex_movement,r+19);
} else {
lcd.clearPixel(c+t_rex_movement,r+19);
}
} else if (g_t_rex_moving[r][c]==1) {
lcd.setPixel(c+t_rex_movement,r+19);
}
}
}
}
//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
for(int r=0; r<=27; r++) {
if (g_t_rex_attack[r][c]==0) {
if (lcd.getPixel(c+t_rex_movement,r+19)!=0) {
lcd.setPixel(c+t_rex_movement,r+19);
} else {
lcd.clearPixel(c+t_rex_movement,r+19);
}
} else if (g_t_rex_attack[r][c]==1) {
lcd.setPixel(c+t_rex_movement,r+19);
}
}
}
}
//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
for(int r=0; r<=8; r++) {
if (g_fire_ball_p1[r][c]==0) {
if (lcd.getPixel(c+fire_ball_hMovement,r+fire_ball_vMovement)!=0) {
lcd.setPixel(c+fire_ball_hMovement,r+fire_ball_vMovement);
} else {
lcd.clearPixel(c+fire_ball_hMovement,r+fire_ball_vMovement);
}
} else if (g_fire_ball_p1[r][c]==1) {
lcd.setPixel(c+fire_ball_hMovement,r+fire_ball_vMovement);
}
}
}
}
//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
for(int r=0; r<=8; r++) {
if (g_fire_ball_p2[r][c]==0) {
if (lcd.getPixel(c+fire_ball_hMovement,r+fire_ball_vMovement)!=0) {
lcd.setPixel(c+fire_ball_hMovement,r+fire_ball_vMovement);
} else {
lcd.clearPixel(c+fire_ball_hMovement,r+fire_ball_vMovement);
}
} else if (g_fire_ball_p2[r][c]==1) {
lcd.setPixel(c+fire_ball_hMovement,r+fire_ball_vMovement);
}
}
}
}
//Funtion to print the clouds
void print_clouds()
{
//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) {
lcd.clearPixel(c-clouds_movement,r+6);
} else if (g_clouds[r][c]==1) {
lcd.setPixel(c-clouds_movement,r+6);
}
}
}
}
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++) {
for (int n=1; n<=33; n+=8) {
if (g_padlock_p1[r][c]==0) {
lcd.clearPixel(c+8,r+n);
} else if (g_padlock_p1[r][c]==1) {
lcd.setPixel(c+8,r+n);
}
}
}
}
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++) {
for (int n=1; n<=sp; n+=8) {
if (g_padlock_p2[r][c]==0) {
lcd.clearPixel(c+8,r+n);
} else if (g_padlock_p2[r][c]==1) {
lcd.setPixel(c+8,r+n);
}
}
}
}
}
//Funtion that is called when the player walks or jumps on quick sand, Recks falls and
//looses all lives
void falling_animation()
{
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
}
}
//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;
}
// read default positions of the joystick to calibrate later readings
void calibrateJoystick()
{
swJoy.mode(PullDown);
// must not move during calibration
joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
joystick.y0 = yPot;
}
void updateJoystick()
{
// read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
joystick.x = xPot - joystick.x0;
joystick.y = yPot - joystick.y0;
// read button state
joystick.swJoy = swJoy;
// calculate direction depending on x,y values
// tolerance allows a little lee-way in case joystick not exactly in the stated direction
if ( fabs(joystick.y) < joystickTolerance && fabs(joystick.x) < joystickTolerance) {
joystick.direction = CENTRE;
} else if ( joystick.y > joystickTolerance && fabs(joystick.x) < joystickTolerance) {
joystick.direction = UP;
} else if ( joystick.y < joystickTolerance && fabs(joystick.x) < joystickTolerance) {
joystick.direction = DOWN;
} else if ( joystick.x > joystickTolerance && fabs(joystick.y) < joystickTolerance) {
joystick.direction = LEFT;
} else if ( joystick.x < joystickTolerance && fabs(joystick.y) < joystickTolerance) {
joystick.direction = RIGHT;
}
}
//Funtion that prints the main menu and all other funtions are called from it
void main_menu()
{
menuState=0;
while(1) {
g_press_b_A_flag=0;
g_press_b_A_flag=0;
if (g_Ticker_Menu_flag) {
g_Ticker_Menu_flag=0;
updateJoystick();
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(); //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
lcd.setPixel(i,j);
} else {
lcd.clearPixel(i,j); //if the pixel is off turn it on
}
}
}
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(); //puts mbed to sleep
}
}
//Function that runs the game, when this funtion runs the game has no end
void Minigame()
{
ticker_wait(5); //wait 0.5s
while (1) {
if (g_Ticker_Game_flag) {
g_Ticker_Game_flag=0;
lcd.clear(); //Clear all the pixels on the LCD screen
updateJoystick();
Game(); //run the came
}
lcd.refresh();
sleep(); //puts mbed to sleep
}
}
//Function that runs story mode menu
void Story_Mode()
{
menuState=0;
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) {
if (g_Ticker_Menu_flag) {
g_Ticker_Menu_flag=0;
updateJoystick();
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(); //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);
lcd.printString("Chapter 3",20,3);
lcd.printString("Chapter 4",20,4);
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
lcd.setPixel(i,j);
} else {
lcd.clearPixel(i,j); //if the pixel is off turn it on
}
}
}
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) {
Chapter1();
} else if (b_A & menu_select==16&story_progress>=3) {
Chapter2();
} else if (b_A & menu_select==24&story_progress>=4) {
Chapter3();
} 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(); //puts mbed to sleep
}
}
//Funtion that introduces the game and the controls to the user
void Tutorial()
{
//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);
lcd.printString("Press A >>",24,5);
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(); //puts mbed to sleep
}
//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);
lcd.printString("Press A >>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("left to...",0,3);
lcd.printString("Press A >>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("Understand?",0,3);
lcd.printString("Yes Sir!>>",22,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
lcd.clear(); //Clear all the pixels on the LCD screen
lcd.printString("Now you try...",0,0);
lcd.printString("Okay!>>",30,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
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(); //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);
lcd.printString("jump press B",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
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(); //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);
lcd.printString("joystick down",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("will activate",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("for 1 sec but",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
lcd.clear(); //Clear all the pixels on the LCD screen
lcd.printString("Try it...",0,0);
lcd.printString("Okay>>",30,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
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=30;
Game();
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);
lcd.printString("out you...",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("Okay>>",30,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
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(); //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);
lcd.printString("and crouching",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("and score) ...",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);;
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("lives you ...",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("when they...",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("sure that...",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("Yes!!!>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
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(); //puts mbed to sleep
}
}
void Chapter1()
{
//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(); //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);
lcd.printString("of high tech",0,3);
lcd.printString("military grade",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("island in the",0,3);
lcd.printString("South...",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
ticker_wait(10);
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);
lcd.printString("infiltrate the",0,3);
lcd.printString("island and...",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
ticker_wait(10);
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);
lcd.printString("you can. Are",0,3);
lcd.printString("you ready?",0,4);
lcd.printString("Yes!!>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
ticker_wait(10);
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);
lcd.printString("the island and",0,3);
lcd.printString("work your...",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
ticker_wait(10);
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);
lcd.printString("the more",0,3);
lcd.printString("defences...",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
ticker_wait(20);
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);
lcd.printString("out for the",0,3);
lcd.printString("cacti they...",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
ticker_wait(20);
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);
lcd.printString("jump over...",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
ticker_wait(20);
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);
lcd.printString("rats running",0,3);
lcd.printString("around, you'll...",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
ticker_wait(20);
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);
lcd.printString("destroy them.",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
ticker_wait(20);
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);
lcd.printString("to work and",0,3);
lcd.printString("Good Luck!!!",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
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();
//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);
lcd.printString("things are",0,3);
lcd.printString("steping up",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
}
void Chapter2()
{
//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);
lcd.printString("and robotic",0,3);
lcd.printString("hounds aswell.",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("and the hounds",0,3);
lcd.printString("will pounce",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
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(); //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);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
}
void Chapter3()
{
//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);
lcd.printString("bionic bear!!",0,3);
lcd.printString("You better...",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("able to",0,3);
lcd.printString("withstand...",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("4 hits should",0,3);
lcd.printString("do it. GO!",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
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();
//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);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
}
void Chapter4()
{
////Continuing the story, indroducing final boss
g_press_b_A_flag=0;
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);
lcd.printString("it can't be",0,3);
lcd.printString("it's not...",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("a robotic",0,3);
lcd.printString("T Rex!!!!",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("fire!!!",0,3);
lcd.printString("It looks...",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("when it's",0,3);
lcd.printString("attacking...",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("at least 8",0,3);
lcd.printString("times to...",0,4);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("for you.",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
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);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(10);
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
sleep(); //puts mbed to sleep
}
difficulty=3;
Game();
initialize_values();
if (g_story_mode_win) {
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);
lcd.printString("get you home",0,3);
lcd.printString("Press A>>",24,5);
lcd.refresh();
ticker_wait(30);
}
g_press_b_A_flag=0;
while (1) {
if (g_press_b_A_flag) {
g_press_b_A_flag=0;
break;
}
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(); //invert pixels
lcd.refresh();
ticker_wait(5);
lcd.normalMode();
}
//Print the settings menu
void Settings()
{
menuState=0;
while (1) {
if (g_Ticker_Menu_flag) {
g_Ticker_Menu_flag=0;
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(); //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);
lcd.printString("Guns",13,3);
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
lcd.setPixel(i,j);
} else {
lcd.clearPixel(i,j); //if the pixel is off turn it on
}
}
}
//Depending of the selected option, call the respective funtion
lcd.refresh();
if (b_A & menu_select==0) {
Brightness();
return;
} else if (b_A & menu_select==8) {
Difficulty();
return;
} else if (b_A & menu_select==16) {
Delete_Highscores();
return;
} else if (b_A & menu_select==24) {
guns();
return;
}
if (b_B) {
menuState=0;
return;
}
}
}
}
//Funtion to choose the difficulty of the game
void Difficulty()
{
menuState=0;
while(1) {
if (g_Ticker_Menu_flag) {
g_Ticker_Menu_flag=0;
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(); //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);
lcd.printString("Hard",30,3);
lcd.printString("Legendary",15,4);
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
lcd.setPixel(i,j);
} else {
lcd.clearPixel(i,j); //if the pixel is off turn it on
}
}
}
//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;
return;
} else if (b_A & menu_select==8) {
difficulty=1;
return;
} else if (b_A & menu_select==16) {
difficulty=2;
return;
} else if (b_A & menu_select==24) {
difficulty=3;
return;
} else if (b_A & menu_select==32) {
difficulty=4;
return;
}
if (b_B) {
menuState=0;
return;
}
}
sleep(); //puts mbed to sleep
}
}
//Menu to chose brightness
void Brightness()
{
menuState=0;
while(1) {
if (g_Ticker_Menu_flag) {
g_Ticker_Menu_flag=0;
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(); //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);
lcd.printString("Bright",26,3);
lcd.printString("Blinding",20,4);
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
lcd.setPixel(i,j);
} else {
lcd.clearPixel(i,j); //if the pixel is off turn it on
}
}
}
//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;
return;
} else if (b_A & menu_select==8) {
brightness=0.3;
return;
} else if (b_A & menu_select==16) {
brightness=0.5;
return;
} else if (b_A & menu_select==24) {
brightness=0.7;
return;
} else if (b_A & menu_select==32) {
brightness=1;
return;
}
if (b_B) {
menuState=0;
return;
}
}
sleep(); //puts mbed to sleep
}
}
//Prints the leaderboard
void Leaderboard()
{
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(); //puts mbed to sleep
}
}
//Print the guns options
void guns()
{
menuState=0;
while(1) {
if (g_Ticker_Menu_flag) {
g_Ticker_Menu_flag=0;
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(); //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);
lcd.printString("Random",10,3);
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
lcd.setPixel(i,j);
} else {
lcd.clearPixel(i,j); //if the pixel is off turn it on
}
}
}
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;
return;
} else if (b_A & menu_select==8) {
g_g1=1;
g_g2=0;
return;
} else if (b_A & menu_select==16) {
g_g1=1;
g_g2=1;
return;
} else if (b_A & menu_select==24) {
if (rand()%3==0) {
g_g1=0;
g_g2=0;
} else if (rand()%3==1) {
g_g1=1;
g_g2=0;
} else if (rand()%3==2) {
g_g1=1;
g_g2=1;
}
return;
}
if (b_B) {
menuState=0;
return;
}
}
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;
}
}
//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) {
ground();
set_difficulty();
if (g_Ticker_Game_flag) {
play_music();
g_Ticker_Game_flag=0;
lcd.clear(); //Clear all the pixels on the LCD screen
updateJoystick();
led_bar();
print_score();
generate_random_number();
if (lose_lives_delay_flag==1) {
lives_delay_loop++;
if (lives_delay_loop>=10) { //means that the delay between one life beeing lost and another one beeing lost is at least 1s
lives_delay_loop=0;
lose_lives_delay_flag=0;
}
}
if (ammo<=5) {
if (i%8>=4) {
print_ammo();
}
} else {
print_ammo();
}
if (b_B) {
jump_flag=1;
}
if (shoot_flag==0) {
bullet=9;
if (joystick.direction==DOWN&jump_flag!=1) {
bullet_height=42;
} else {
bullet_height=g_jump+4;
}
} else if (shoot_flag==1&g_shoot_loop==0) {
g_shoot_loop++;
ammo--;
if (joystick.direction==DOWN&jump_flag!=1) {
bullet_height=42;
} else {
bullet_height=g_jump+4;
}
}
if (b_A) {
if (ammo<=0) {
shoot_flag=0;
} else {
shoot_flag=1;
}
}
if (joystick.direction==UP&score>=10&jump_flag!=1) {
shield_flag=1;
} else if (joystick.direction==UP&score<10&jump_flag!=1) {
print_recks_still_gun();
}
Recks();
if (shield_flag==1) {
shield();
}
if (print_rat_flag==1) {
rat();
}
if (print_hound_flag==1) {
hound();
}
if (print_bear_flag==1) {
bear();
}
if (print_bird_flag==1) {
bird();
}
if (print_cactus_flag==1) {
cactus();
}
if (print_t_rex_flag==1) {
t_rex();
}
if (print_fire_ball_flag==1) {
fire_ball();
}
if (print_quick_sand_flag==1) {
quick_sand();
}
if (print_heart_flag==1) {
heart();
}
if (print_ammo_flag==1) {
pickUp_ammo();
}
if (print_speed_boost_flag==1) {
speed_boost();
}
if (recks_movement>=3&i%150==0) {
recks_movement=2;
}
if (lives<=0) {
run_game=Game_over(); //calls game over returns 1 if continue was selected returns 0 if back to menu
}
if (swJoy==1) {
Pause();
}
if (difficulty==-1&story_mode_flag==1) {
if (i>70) {
initialize_values();
return;
}
} else if (difficulty==0&story_mode_flag==1) {
if (score>60) {
return;
}
} else if (difficulty==1&story_mode_flag==1) {
if (score>200) {
return;
}
} else if (difficulty==2&story_mode_flag==1) {
if (score>500) {
return;
}
} else if (difficulty==3&story_mode_flag==1) {
print_t_rex_flag=1;
g_story_mode_win=0;
if (t_rex_lives>=24) {
print_t_rex_flag=0;
g_story_mode_win=1;
return;
}
}
i++;
print_clouds();
}
lcd.refresh();
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 (q>=20) {
lcd.setBrightness(0);
led=0;
}
}
sleep(); //puts mbed to sleep
}
lcd.setBrightness(brightness);
led_bar();
}
//Funtion that increases game difficuly as difficulty increases
void set_difficulty()
{
switch(difficulty) {
case -1:
break;
case 0:
if (random_num<3000) {
print_cactus_flag=1;
} else if (random_num>=3000&random_num<6000) {
print_rat_flag=1;
} else if (random_num>=6000&random_num<6100) {
print_heart_flag=1;
}
break;
case 1:
if (random_num<3000) {
print_cactus_flag=1;
} else if (random_num>=3000&random_num<5000) {
print_rat_flag=1;
} else if (random_num>=5000&random_num<6000) {
print_bird_flag=1;
} else if (random_num>=6000&random_num<6050) {
print_heart_flag=1;
} else if (random_num>=6050&random_num<7000) {
print_hound_flag=1;
} else if (random_num>=7000&random_num<7200) {
print_ammo_flag=1;
}
break;
case 2:
if (random_num<3000) {
print_cactus_flag=1;
} else if (random_num>=3000&random_num<5000) {
print_rat_flag=1;
} else if (random_num>=5000&random_num<6000) {
print_bird_flag=1;
} else if (random_num>=6000&random_num<6040) {
print_heart_flag=1;
} else if (random_num>=6040&random_num<7000) {
print_hound_flag=1;
} else if (random_num>=7000&random_num<7200) {
print_ammo_flag=1;
} else if (random_num>=7200&random_num<8000) {
print_bear_flag=1;
} else if (random_num>=8000&random_num<8200) {
print_speed_boost_flag=1;
}
break;
case 3:
if (random_num<1000) {
print_bear_flag=1;
} else if (random_num>=1000&random_num<3000) {
print_bird_flag=1;
} else if (random_num>=3000&random_num<3010) {
print_heart_flag=1;
} else if (random_num>=3010&random_num<3050) {
print_ammo_flag=1;
} else if (random_num>=3050&random_num<6000) {
print_cactus_flag=1;
} else if (random_num>=6000&random_num<6100) {
print_ammo_flag=1;
print_t_rex_flag=1;
} else if (random_num>=6100&random_num<7000) {
print_rat_flag=1;
} else if (random_num>=7000&random_num<8000) {
print_hound_flag=1;
} else if (random_num>=8000&random_num<8200) {
print_speed_boost_flag=1;
}
break;
case 4:
if (random_num<1000) {
print_bear_flag=1;
} else if (random_num>=1000&random_num<3000) {
print_bird_flag=1;
} else if (random_num>=3000&random_num<3010) {
print_heart_flag=1;
} else if (random_num>=3010&random_num<3050) {
print_ammo_flag=1;
} else if (random_num>=3050&random_num<6000) {
print_cactus_flag=1;
} else if (random_num>=6000&random_num<6300) {
print_ammo_flag=1;
print_t_rex_flag=1;
} else if (random_num>=6300&random_num<7000) {
print_rat_flag=1;
} else if (random_num>=7000&random_num<8000) {
print_hound_flag=1;
} else if (random_num>=8000&random_num<8200) {
print_speed_boost_flag=1;
} else if (random_num>=8200&random_num<9000) {
print_quick_sand_flag=1;
}
break;
}
}
//Game over funtion
int Game_over()
{
led_bar();
lcd.clear(); //Clear all the pixels on the LCD screen
sort_top_scores();
writeSD();
lcd.printString("GAME",25,1);
lcd.printString("OVER",25,2);
lcd.refresh();
ticker_wait(10);
lcd.printString("A Retry",40,4);
lcd.printString("B Back to Menu",0,5);
lcd.refresh();
g_press_b_A_flag=0;
g_press_b_B_flag=0;
while (1) {
if (g_press_b_A_flag|g_press_b_B_flag) {
if (g_press_b_A_flag) {
initialize_values();
g_press_b_A_flag=0;
return 1;
} else {
initialize_values();
g_press_b_B_flag=0;
return 0;
}
}
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
for(int r=0; r<=4; r++) {
for (int n=70; n<=74; n+=4) {
if (n==74&ammo%10==0) {
if (zero[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==74&ammo%10==1) {
if (one[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==74&ammo%10==2) {
if (two[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==74&ammo%10==3) {
if (three[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==74&ammo%10==4) {
if (four[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==74&ammo%10==5) {
if (five[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==74&ammo%10==6) {
if (six[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==74&ammo%10==7) {
if (seven[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==74&ammo%10==8) {
if (eight[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==74&ammo%10==9) {
if (nine[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
}
if (n==70&(ammo%100>=0&ammo%100<10)) {
if (zero[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==70&(ammo%100>=10&ammo%100<20)) {
if (one[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==70&(ammo%100>=20&ammo%100<30)) {
if (two[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==70&(ammo%100>=30&ammo%100<40)) {
if (three[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==70&(ammo%100>=40&ammo%100<50)) {
if (four[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==70&(ammo%100>=50&ammo%100<60)) {
if (five[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==70&(ammo%100>=60&ammo%100<70)) {
if (six[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==70&(ammo%100>=70&ammo%100<80)) {
if (seven[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==70&(ammo%100>=80&ammo%100<90)) {
if (eight[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==70&(ammo%100>=90&ammo%100<100)) {
if (nine[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
}
}
}
}
for(int c=0; c<=14; c++) { //14 beacause the the loop stats from 0 but the array size from 1
for(int r=0; r<=4; r++) {
if (g_ammo[r][c]==0) {
lcd.clearPixel(c+50,r);
} else if (g_ammo[r][c]==1) {
lcd.setPixel(c+50,r);
}
}
}
if (ammo>=99) {
ammo=99;
}
lcd.refresh();
}
//Print score
void print_score()
{
score=h_movement/10+kill_score-shield_score;
if (score<=0) {
score=0;
}
for(int c=0; c<=2; c++) { //2 beacause the the loop stats from 0 but the array size from 1
for(int r=0; r<=4; r++) {
for (int n=24; n<=36; n+=4) {
if (n==36&score%10==0) {
if (zero[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==36&score%10==1) {
if (one[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==36&score%10==2) {
if (two[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==36&score%10==3) {
if (three[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==36&score%10==4) {
if (four[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==36&score%10==5) {
if (five[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==36&score%10==6) {
if (six[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==36&score%10==7) {
if (seven[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==36&score%10==8) {
if (eight[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==36&score%10==9) {
if (nine[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
}
if (n==32&(score%100>=0&score%100<10)) {
if (zero[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==32&(score%100>=10&score%100<20)) {
if (one[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==32&(score%100>=20&score%100<30)) {
if (two[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==32&(score%100>=30&score%100<40)) {
if (three[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==32&(score%100>=40&score%100<50)) {
if (four[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==32&(score%100>=50&score%100<60)) {
if (five[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==32&(score%100>=60&score%100<70)) {
if (six[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==32&(score%100>=70&score%100<80)) {
if (seven[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==32&(score%100>=80&score%100<90)) {
if (eight[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==32&(score%100>=90&score%100<100)) {
if (nine[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
}
if (n==28&(score%1000>=0&score%1000<100)) {
if (zero[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==28&(score%1000>=100&score%1000<200)) {
if (one[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==28&(score%1000>=200&score%1000<300)) {
if (two[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==28&(score%1000>=300&score%1000<400)) {
if (three[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==28&(score%1000>=400&score%1000<500)) {
if (four[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==28&(score%1000>=500&score%1000<600)) {
if (five[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==28&(score%1000>=600&score%1000<700)) {
if (six[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==28&(score%1000>=700&score%1000<800)) {
if (seven[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==28&(score%1000>=800&score%1000<900)) {
if (eight[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==28&(score%1000>=900&score%1000<1000)) {
if (nine[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
}
if (n==24&(score%10000>=0&score%10000<1000)) {
if (zero[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==24&(score%10000>=1000&score%10000<2000)) {
if (one[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==24&(score%10000>=2000&score%10000<3000)) {
if (two[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==24&(score%10000>=3000&score%10000<4000)) {
if (three[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==24&(score%10000>=4000&score%10000<5000)) {
if (four[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==24&(score%10000>=5000&score%10000<6000)) {
if (five[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==24&(score%10000>=6000&score%10000<7000)) {
if (six[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==24&(score%10000>=7000&score%10000<8000)) {
if (seven[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==24&(score%10000>=8000&score%10000<9000)) {
if (eight[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
} else if (n==24&(score%10000>=9000&score%10000<10000)) {
if (nine[r][c]==1) {
lcd.setPixel(c+n,r);
} else {
lcd.clearPixel(c+n,r);
}
}
}
}
}
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<=4; r++) {
if (g_score[r][c]==0) {
lcd.clearPixel(c,r);
} else if (g_score[r][c]==1) {
lcd.setPixel(c,r);
}
}
}
lcd.refresh();
}