Welcome to Hackster!
Hackster is a community dedicated to learning hardware, from beginner to pro. Join us, it's free!
MrNonesuch
Published © GPL3+

UFO Attack!

UFO blasting game using an Arduino UNO, some random bits and an Atari-compatible joystick.

BeginnerFull instructions provided4,816
UFO Attack!

Things used in this project

Hardware components

Arduino UNO
Arduino UNO
×1
MAX7219 Dot Matrix Module 4 in One Display
×1
Male Plug Screw Nut Connector DB9-G1-01 9 Pin Terminal Breakout Board
×1
General Purpose Transistor NPN
General Purpose Transistor NPN
×1
Breadboard (generic)
Breadboard (generic)
×1
Adafruit Passive piezo buzzer
×1
Male/Female Jumper Wires
Male/Female Jumper Wires
×5
Jumper wires (generic)
Jumper wires (generic)
×10
Resistor 1k ohm
Resistor 1k ohm
×1
Atari Compatible Joystick 9Pin
×1

Story

Read more

Schematics

UFO Attack Wiring

Wiring Schematic for UFO Attack game.

Code

UFO Attack code

C/C++
/*UFO ATTACK! - Written by Anthony Clarke. */
/*Some specific lines of code were lifted from open source example programs. These are labled in comments.*/

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>

const int pinCS = 10; // Attach CS to this pin, DIN to MOSI and CLK to SCK (cf http://arduino.cc/en/Reference/SPI )
const int numberOfHorizontalDisplays = 4;
const int numberOfVerticalDisplays = 1;

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

// 'ship', 8x8px
const unsigned char ship [] PROGMEM = {
  0x80, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'UFO', 8x8px
const unsigned char ufo [] PROGMEM = {
  0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'explosion', 8x8px
const unsigned char explosion [] PROGMEM = {
  0xe0, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'Bouncer', 8x8px
const unsigned char bouncer [] PROGMEM = {
  0x60, 0xc0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'Boss1', 8x8px
const unsigned char boss [] PROGMEM = {
  0x18, 0x24, 0x42, 0xff, 0x24, 0xff, 0x7e, 0x3c
};
// 'Faller', 8x8px
const unsigned char faller [] PROGMEM = {
  0x80, 0xc0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'Riser', 8x8px
const unsigned char riser [] PROGMEM = {
  0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'LT', 8x8px
const unsigned char LT [] PROGMEM = {
  0x78, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'UFO laser', 8x8px
const unsigned char ufoLaser [] PROGMEM = {
  0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'BossBoom', 8x8px
const unsigned char bossBoom1 [] PROGMEM = {
  0xaa, 0x55, 0xa2, 0x51, 0x8a, 0x45, 0xaa, 0x55
};
// 'BossBoom2', 8x8px
const unsigned char bossBoom2 [] PROGMEM = {
  0x55, 0xaa, 0x45, 0x8a, 0x51, 0xa2, 0x55, 0xaa
};



//Game started variable
bool gameStart = false;

// Defining joystick control pins
int up = 2;
int down = 3;
int left = 4;
int right = 5;
int trigger = 6;

//Title ticker variables..Shamlessly stolen from the ticker example :P
String tape = "UFO ATTACK!   - Press fire to start ";
int wait = 40; // In milliseconds
int spacer = 1;
int width = 5 + spacer; // The font width is 5 pixels

//Ship and laser position variables
int shipx = 0;
int shipy = 0;
int lasx;
int lasy;
//Lives counter
int lives = 5;
//laser existense variable
bool lasExist;
//UFO laser position variables
int ufoLas1x;
int ufoLas1y;
int ufoLas2x;
int ufoLas2y;
int ufoLas3x;
int ufoLas3y;
int ufoLas4x;
int ufoLas4y;
//UFO laser existence variable
bool ufoLasExist1 = false;
bool ufoLasExist2 = false;
bool ufoLasExist3 = false;
bool ufoLasExist4 = false;
//UFO laser selection variable
int selection;
int lastSelection;
//Boss Minion selection variable
int minionSelection;
//UFO position variables
int ufo1x;
int ufo1y;
int ufo2x;
int ufo2y;
int ufo3x;
int ufo3y;
//Bouncer position variables
int bouncer1x;
int bouncer1y;
int bouncer2x;
int bouncer2y;
int bouncer3x;
int bouncer3y;
int bouncer4x;
int bouncer4y;
//Faller position variables
int faller1x;
int faller1y;
int faller2x;
int faller2y;
int faller3x;
int faller3y;
int faller4x;
int faller4y;
//Faller speed variables
int faller1Speedx;
int faller1Speedy;
int faller2Speedx;
int faller2Speedy;
int faller3Speedx;
int faller3Speedy;
int faller4Speedx;
int faller4Speedy;
int fallerxSpeedTarget = 2;
int fallerySpeedTarget = 2;
//Riser position variables
int riser1x;
int riser1y;
int riser2x;
int riser2y;
int riser3x;
int riser3y;
int riser4x;
int riser4y;
//Riser speed variables
int riser1Speedx;
int riser1Speedy;
int riser2Speedx;
int riser2Speedy;
int riser3Speedx;
int riser3Speedy;
int riser4Speedx;
int riser4Speedy;
//LT position variable
int ltx;
int lty;
//LT health variable
int ltHealth = 3;
//LT speed variable
int ltxSpeed = 0;
int ltxSpeedTarget = 2;
//Boss position variable
int bossx = 34;
int bossy = 0;
//Boss movement speed variables
int bossxSpeed = 0;
int bossySpeed = 0;
int bossxSpeedTarget = 3;
int bossySpeedTarget = 1; 
//UFO existence variables
bool ufo1Exist = false;
bool ufo2Exist = false;
bool ufo3Exist = false;
//Bouncer existence variables
bool bouncer1Exist = false;
bool bouncer2Exist = false;
bool bouncer3Exist = false;
bool bouncer4Exist = false;
//Faller existence variables
bool faller1Exist = false;
bool faller2Exist = false;
bool faller3Exist = false;
bool faller4Exist = false;
//Riser existence variables
bool riser1Exist = false;
bool riser2Exist = false;
bool riser3Exist = false;
bool riser4Exist = false;
//LT existence variable
bool ltExist = false;
//Boss1 Existence variable
bool boss1Exist = false;
//Boss health variable
int bossHealth;


//Bouncer top or bottom variable
int bouncerOrigin;
//Bouncer gap space variable
int bouncerGap = 6;
//Bouncer direction variables
bool bouncer1Direction;
bool bouncer2Direction;
bool bouncer3Direction;
bool bouncer4Direction;
int bouncer1xSpeed;
int bouncer2xSpeed;
int bouncer3xSpeed;
int bouncer4xSpeed;
int bouncer1ySpeed;
int bouncer2ySpeed;
int bouncer3ySpeed;
int bouncer4ySpeed;
int ySpeed = 1;
int xSpeed = 2;


//spawn timer and spawn time variables for UFO enemies
unsigned long startTime;//setting up timer variables
unsigned long currentTime;
unsigned long spawnTime = 3000;   //Spawn timer for UFO's
//spawn timer and spawn time for bouncer enemies
unsigned long startTime2;
unsigned long currentTime2;
unsigned long spawnTime2 = 10000; //Spawn timer for bouncers
//Spawn timer for LT mini boss
unsigned long startTime3;
unsigned long currentTime3;
unsigned long spawnTime3;     //Spawn timer for LT
//spawn timer for UFO lasers
unsigned long bossStartTime;
unsigned long bossCurrentTime;
unsigned long bossStartTime2;
unsigned long bossCurrentTime2;
unsigned long bossLaserTimer = 1000;
unsigned long bossMinionTimer = 6000;
//Spawn enabler variable, needed  to temporarily stop spawning for boss battle
bool spawnEnabled;

//Level variable
int levelNumber = 1;
//Score variable
int score = 0;
//Level progression variables
int kills;
int killsTarget;
//Boss battle engaged variable
bool bossBattleStarted = false;

//Player ship collision detection variable
bool collisionDetection = true;
//Coin flip for UFOLaser 4 selection
int coinFlip;

//Sound variables
int buzzerPin = 9;
//Boss siren variables
float sinVal;             // Define a variable to save sine value 
int toneVal;              // Define a variable to save sound frequency 



void setup() 
{
  //Serial.begin(9600);
  //Setting up sound pin
  pinMode(buzzerPin, OUTPUT);   // Set the buzzer pin to output mode
  //setting up spawntimers
 
  
  //setting pin modes for joystick operation
  pinMode(up, INPUT_PULLUP);    //UP pin
  pinMode(down, INPUT_PULLUP);    //DOWN pin
  pinMode(left, INPUT_PULLUP);    //LEFT pin
  pinMode(right, INPUT_PULLUP);    //RIGHT pin
  pinMode(trigger, INPUT_PULLUP);    //FIRE pin

  

  //setting led intensity
  matrix.setIntensity(0);

// Adjust to your own needs
  matrix.setPosition(0, 3, 0); // The first display is at <0, 0>
  matrix.setPosition(1, 2, 0); // The second display is at <1, 0>
  matrix.setPosition(2, 1, 0); // The third display is at <2, 0>
  matrix.setPosition(3, 0, 0); // And the last display is at <3, 0>
//  ...
  matrix.setRotation(0, 3);    // The first display is position upside down
  matrix.setRotation(1, 3);
  matrix.setRotation(2, 3);
  matrix.setRotation(3, 3);    // The same hold for the last display
  matrix.fillScreen(LOW);


}
void loop() 
{
  if (gameStart == false)
  {
    Ticker(true);
  }
  
  SpawnTimer(); 
  JoystickControl();
  UfoControl();
  BouncerControl();
  LaserControl();
  ScreenLimit();
  BossBattle();
  BossControl();
  UFOLaserControl();
  LTControl();
  FallerControl();
  RiserControl();
  ShipCollision();
  //Serial.println(ufoLas1x);
  
  

  
  matrix.write();//draw the screen
  delay(50);//speed delay
  matrix.fillScreen(LOW);//clear screen, must be done every frame.
  

}

void Level(int level)
{
  if (level == 1)
  {
    spawnEnabled = true; //Enable spawning
    spawnTime = 3000;   //Spawn timer for UFO'a
    spawnTime2 = 10000000; //Spawn timer for bouncers set so high they'll never appear
    spawnTime3 = 10000000; //Spawn timer for LT set so high so they'll never appear
    killsTarget = 10;   //Sets kill target. When target reached boss should be spawned
    bossHealth = 10;
    bossLaserTimer = 1000;
  }
  if (level == 2)
  {
    spawnEnabled = true;
    spawnTime = 3000;
    spawnTime2 = 8000;
    spawnTime3 = 10000000;
    killsTarget = 20;
    bossHealth = 15;
    bossLaserTimer = 900;
  }
  if (level == 3)
  {
    spawnEnabled = true;
    spawnTime = 2000;
    spawnTime2 = 6000;
    spawnTime3 = 8000;
    killsTarget = 30;
    bossHealth = 20;
    bossLaserTimer = 800;
  }
  if (level == 4)
  {
    spawnEnabled = true;
    spawnTime = 2000;
    spawnTime2 = 5000;
    spawnTime3 = 7000;
    killsTarget = 40;
    bossHealth = 25;
    bossLaserTimer = 700;
    bossMinionTimer = 6000;
  }
  if (level == 5)
  {
    spawnEnabled = true;
    spawnTime = 1800;
    spawnTime2 = 4500;
    spawnTime3 = 6000;
    killsTarget = 50;
    bossHealth = 30;
    bossLaserTimer = 600;
    bossMinionTimer = 5500;
  }
  if (level == 6)
  {
    spawnEnabled = true;
    spawnTime = 2000;
    spawnTime2 = 5000;
    spawnTime3 = 7000;
    killsTarget = 60;
    bossHealth = 35;
    bossLaserTimer = 500;
    bossMinionTimer = 5000;
  }
  if (level == 7)
  {
    spawnEnabled = true;
    spawnTime = 2000;
    spawnTime2 = 5000;
    spawnTime3 = 7000;
    killsTarget = 70;
    bossHealth = 40;
    bossLaserTimer = 400;
    bossMinionTimer = 4000;
  }
  if (level == 8)
  {
    spawnEnabled = true;
    spawnTime = 2000;
    spawnTime2 = 5000;
    spawnTime3 = 7000;
    killsTarget = 80;
    bossHealth = 45;
    bossLaserTimer = 300;
    bossMinionTimer = 3000;
  }
  if (level == 9)
  {
    spawnEnabled = true;
    spawnTime = 2000;
    spawnTime2 = 5000;
    spawnTime3 = 7000;
    killsTarget = 90;
    bossHealth = 50;
    bossLaserTimer = 200;
    bossMinionTimer = 2000;
  }
  if (level == 10)
  {
    spawnEnabled = true;
    spawnTime = 2000;
    spawnTime2 = 5000;
    spawnTime3 = 7000;
    killsTarget = 100;
    bossHealth = 55;
    bossLaserTimer = 100;
    bossMinionTimer = 1000;
  }
  
  
  //Need to add congratulation message for getting past level 10
}



void Ticker(bool resetKills)        //Ticker code shamlessly stolen from the Ticker example. Used for Title and score and gameover
{
  while (gameStart == false)
  {
    

    for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) 
    {
      
      matrix.fillScreen(LOW);
  
      int letter = i / width;
      int x = (matrix.width() - 1) - i % width;
      int y = (matrix.height() - 8) / 2; // center the text vertically
  
      while ( x + width - spacer >= 0 && letter >= 0 ) 
      {
        
        if ( letter < tape.length() ) {
          matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
          if (digitalRead(trigger)== 0)
          {
            gameStart = true;
          }
        }
        
        letter--;
        x -= width;
      }
      if (digitalRead(trigger)== 0)       //If trigger pressed then start the game
          {
             bossBattleStarted = false;
             gameStart = true;
             startTime = millis();  //Setting up spawn timer for UFO
             startTime2 = millis(); //setting up spawn timer for Bouncer
             startTime3 = millis(); //Setting up spawn timer for LT
             currentTime = startTime;//Setting up start timers for SpawnTimer function
             currentTime2 = startTime2;
             currentTime3 = startTime3;
             spawnEnabled = true;//Enabling spawnTimer
             Level(levelNumber);//Calls level function to set level variables
             shipx = 0;
             shipy = 3;
             if (resetKills == true)
             {
              kills = 0;
             }
             else if (resetKills == false)
             {
              kills = kills;
             }
             delay(500);
            return;
          }
      matrix.write(); // Send bitmap to display
  
      delay(wait);
    }

      
  }
}


void JoystickControl()
{
   //draw ship at ship coords
   matrix.drawBitmap(shipx,shipy,ship,3,2,1);
  
   if (digitalRead(up)== 0)//if joystick up then move ship coords up
  {
    shipy--;
  }
  if (digitalRead(down)== 0)//if joystick down then move ship coords down
  {
    shipy++;
  }
  if (digitalRead(left)== 0)//if joystick left then move ship coords left
  {
    shipx--;
  }
  if (digitalRead(right)== 0)//if joystick right then move ship coords right
  {
    shipx++;
  }
  if (digitalRead(trigger)== 0 && lasExist == false)//if trigger pressed then draw laser and mark it as existing
  {
    ShootLaser();
  }
  
}

void ShootLaser()
{
  if (lasExist == false)
  {
    lasx=shipx+3;
    lasy=shipy+1;
    lasExist=true;
    tone(buzzerPin, 400,75);//play laser sound
    
  }  
}

void LaserControl()       //Contains control code for the player laser and collision detection routines
{
  //If the laser exists then move the laser dot across the screen
  if (lasExist == true)
  {
    matrix.drawPixel(lasx,lasy,1);
    lasx++;
    //collision detection for UFO's
    //Each IF statement covers every pixel with an extra one shadowing the top pixel because the laser can sometimes go through.
    if (ufo1Exist == true)
    {
      
      for (int a = 0; a < 2; a++)
      {
          if (lasx == ufo1x+a && lasy == ufo1y+1)
        {
          ufo1Exist = false;
          lasExist = false;
          Boom(ufo1x,ufo1y,true,1);
          ufo1x = 34;
        }
      }     
      for (int a = 1; a < 3; a++)
      {
        if (lasx == ufo1x+a && lasy == ufo1y)
        {
          ufo1Exist = false;
          lasExist = false;
          Boom(ufo1x,ufo1y,true,1);
          ufo1x = 34;
        }
      }     
    }    
    //collision detection for UFO2
    if (ufo2Exist == true)
    {
      
      for (int a = 0; a < 3; a++)
      {
          if (lasx == ufo2x+a && lasy == ufo2y+1)
        {
          ufo2Exist = false;
          lasExist = false;
          Boom(ufo2x,ufo2y,true,1);
          ufo2x = 34;
        }
      }     
      for (int a = 1; a < 3; a++)
      {
        if (lasx == ufo2x+a && lasy == ufo2y)
        {
          ufo2Exist = false;
          lasExist = false;
          Boom(ufo2x,ufo2y,true,1);
          ufo2x = 34;
        }
      }     
    }
    
    //Collision detection for UFO3
    if (ufo3Exist == true)
    {
      
      for (int a = 0; a < 3; a++)
      {
          if (lasx == ufo3x+a && lasy == ufo3y+1)
        {
          ufo3Exist = false;
          lasExist = false;
          Boom(ufo3x,ufo3y,true,1);
          ufo3x = 34;
        }
      }     
      for (int a = 1; a < 3; a++)
      {
        if (lasx == ufo3x+a && lasy == ufo3y)
        {
          ufo3Exist = false;
          lasExist = false;
          Boom(ufo3x,ufo3y,true,1);
          ufo3x = 34;
        }
      }     
    }
   

    //Collision detection for Bouncer1
    if (bouncer1Exist == true)
    {
      for (int a = 1; a < 2; a++)
      {
        if (lasx == bouncer1x+a && lasy == bouncer1y)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          bouncer1Exist = false;
          lasExist=false;
          Boom(bouncer1x,bouncer1y,true,2);
          bouncer1x = 34;
        }
      }
      for (int a = 0; a < 2; a++)
      {
        if (lasx == bouncer1x+a && lasy == bouncer1y+1)
        {
          bouncer1Exist = false;
          lasExist=false;
          Boom(bouncer1x,bouncer1y,true,2);
          bouncer1x = 34;
        }
      }
      for (int a = 1; a < 2; a++)
      {
        if (lasx == bouncer1x+a && lasy == bouncer1y+2)
        {
          bouncer1Exist = false;
          lasExist=false;
          Boom(bouncer1x,bouncer1y,true,2);
          bouncer1x = 34;
        }
      }
    }    
    //Collision detection for Bouncer 2
     if (bouncer2Exist == true)
    {
      for (int a = 1; a < 2; a++)
      {
        if (lasx == bouncer2x+a && lasy == bouncer2y)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          bouncer2Exist = false;
          lasExist=false;
          Boom(bouncer2x,bouncer2y,true,2);
          bouncer2x = 34;
        }
      }
      for (int a = 0; a < 2; a++)
      {
        if (lasx == bouncer2x+a && lasy == bouncer2y+1)
        {
          bouncer2Exist = false;
          lasExist=false;
          Boom(bouncer2x,bouncer2y,true,2);
          bouncer2x = 34;
        }
      }
      for (int a = 1; a < 2; a++)
      {
        if (lasx == bouncer2x+a && lasy == bouncer2y+2)
        {
          bouncer2Exist = false;
          lasExist=false;
          Boom(bouncer2x,bouncer2y,true,2);
          bouncer2x = 34;
        }
      }
    }


    
    //Collision detection for Bouncer 3
     if (bouncer3Exist == true)
    {
      for (int a = 1; a < 2; a++)
      {
        if (lasx == bouncer3x+a && lasy == bouncer3y)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          bouncer3Exist = false;
          lasExist=false;
          Boom(bouncer3x,bouncer3y,true,2);
          bouncer3x = 34;
        }
      }
      for (int a = 0; a < 2; a++)
      {
        if (lasx == bouncer3x+a && lasy == bouncer3y+1)
        {
          bouncer3Exist = false;
          lasExist=false;
          Boom(bouncer3x,bouncer3y,true,2);
          bouncer3x = 34;
        }
      }
      for (int a = 1; a < 2; a++)
      {
        if (lasx == bouncer3x+a && lasy == bouncer3y+2)
        {
          bouncer3Exist = false;
          lasExist=false;
          Boom(bouncer3x,bouncer3y,true,2);
          bouncer3x = 34;
        }
      }
    }
    
    //Collision detection for Bouncer 4
     if (bouncer4Exist == true)
    {
      for (int a = 1; a < 2; a++)
      {
        if (lasx == bouncer4x+a && lasy == bouncer4y)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          bouncer4Exist = false;
          lasExist=false;
          Boom(bouncer4x,bouncer4y,true,2);
          bouncer4x = 34;
        }
      }
      for (int a = 0; a < 2; a++)
      {
        if (lasx == bouncer4x+a && lasy == bouncer4y+1)
        {
          bouncer4Exist = false;
          lasExist=false;
          Boom(bouncer4x,bouncer4y,true,2);
          bouncer4x = 34;
        }
      }
      for (int a = 1; a < 2; a++)
      {
        if (lasx == bouncer4x+a && lasy == bouncer4y+2)
        {
          bouncer4Exist = false;
          lasExist=false;
          Boom(bouncer4x,bouncer4y,true,2);
          bouncer4x = 34;
        }
      }
    }
    
    //Collision detection for Boss
    if (boss1Exist == true)
    {
      for (int a = 3; a < 5; a++ )       //Top line 0
      {
        if (lasx == bossx+a && lasy == bossy)
        {
          bossHealth--;
          lasExist=false;
          Boom(lasx,lasy,false,0);
        }
      }
      for (int a = 2; a < 5; a++)         //Line 1
      {
        if (lasx == bossx+a && lasy == bossy+1)
        {
          bossHealth--;
          lasExist=false;
          Boom(lasx,lasy,false,0);
        }
      }
      for (int a = 1; a < 6; a++)          //Line 2
      {
        if (lasx == bossx+a && lasy == bossy+2)
        {
          bossHealth--;
          lasExist=false;
          Boom(lasx,lasy,false,0);
        }
      }
      for (int a = 0; a < 7; a++)          //Line 3
      {
        if (lasx == bossx+a && lasy == bossy+3)
        {
          bossHealth--;
          lasExist=false;
          Boom(lasx,lasy,false,0);
        }
      }
      for (int a = 2; a < 6; a++)    //Line 4
      {
        if (lasx == bossx+a && lasy == bossy+4)
        {
          bossHealth--;
          lasExist=false;
          Boom(lasx,lasy,false,0);
        }
      }
      for (int a = 0; a < 7; a++)      //Line 5
      {
        if (lasx == bossx+a && lasy == bossy+5)
        {
          bossHealth--;
          lasExist=false;
          Boom(lasx,lasy,false,0);
        }
      }
      for (int a = 1; a < 6; a++)      //Line 6
      {
        if (lasx == bossx+a && lasy == bossy+6)
        {
          bossHealth--;
          lasExist=false;
          Boom(lasx,lasy,false,0);
        }
      }        
      for (int a = 2; a < 5; a++)      //Line 7
      {
        if (lasx == bossx+a && lasy == bossy+7)
        {
          bossHealth--;
          lasExist=false;
          Boom(lasx,lasy,false,0);
        }
      }
     
    }

    //Collision detection routines for LT
    if (ltExist == true)
    {
      for (int a = 1; a < 4; a++)    //Top line 0
      {
        if (lasx == ltx+a && lasy == lty)
        {
          ltHealth--;
          lasExist=false;
          Boom(lasx,lasy,false,0);
        }
      }
      for (int a = 0; a < 5; a++)    //Line 1
      {
        if (lasx == ltx+a && lasy == lty+1)
        {
          ltHealth--;
          lasExist=false;
          Boom(lasx,lasy,false,0);
        }
      }
      for (int a = 2; a < 4; a++)           //Line 2
      {
        if (lasx == ltx+a && lasy == lty+2)
        {
          ltHealth--;
          lasExist=false;
          Boom(lasx,lasy,false,0);
        }
      }     
    }
//Collision detection for Faller 1
    if (faller1Exist == true)
    {
      for (int a = 0; a < 2; a++)         //Top Line 0
      {
        if (lasx == faller1x+a && lasy == faller1y)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          faller1Exist = false;
          lasExist=false;
          Boom(faller1x,faller1y,false,0);
          faller1x = 34;
        }
      }
      for (int a = 0; a < 3; a++)          //Line 1
      {
        if (lasx == faller1x+a && lasy == faller1y+1)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          faller1Exist = false;
          lasExist=false;
          Boom(faller1x,faller1y,false,0);
          faller1x = 34;
        }
      }
      for (int a = 0; a < 3; a++)          //Line 2
      {
        if (lasx == faller1x+a && lasy == faller1y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          faller1Exist = false;
          lasExist=false;
          Boom(faller1x,faller1y,false,0);
          faller1x = 34;
        }
      }     
    }
    //Collision detection for Faller 2
   if (faller2Exist == true)
    {
      for (int a = 0; a < 2; a++)         //Top Line 0
      {
        if (lasx == faller2x+a && lasy == faller2y)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          faller2Exist = false;
          lasExist=false;
          Boom(faller2x,faller2y,false,0);
          faller2x = 34;
        }
      }
      for (int a = 0; a < 3; a++)          //Line 1
      {
        if (lasx == faller2x+a && lasy == faller2y+1)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          faller2Exist = false;
          lasExist=false;
          Boom(faller2x,faller2y,false,0);
          faller2x = 34;
        }
      }
      for (int a = 0; a < 3; a++)          //Line 2
      {
        if (lasx == faller2x+a && lasy == faller2y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          faller2Exist = false;
          lasExist=false;
          Boom(faller2x,faller2y,false,0);
          faller2x = 34;
        }
      }
    }
    //Collision detection for Faller 3
    if (faller3Exist == true)
    {
      for (int a = 0; a < 2; a++)         //Top Line 0
      {
        if (lasx == faller3x+a && lasy == faller3y)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          faller3Exist = false;
          lasExist=false;
          Boom(faller3x,faller3y,false,0);
          faller3x = 34;
        }
      }
      for (int a = 0; a < 3; a++)          //Line 1
      {
        if (lasx == faller3x+a && lasy == faller3y+1)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          faller3Exist = false;
          lasExist=false;
          Boom(faller3x,faller3y,false,0);
          faller3x = 34;
        }
      }
      for (int a = 0; a < 3; a++)          //Line 2
      {
        if (lasx == faller3x+a && lasy == faller3y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          faller3Exist = false;
          lasExist=false;
          Boom(faller3x,faller3y,false,0);
          faller3x = 34;
        }
      }
    }
    //Collision detection for Faller 4
   if (faller4Exist == true)
    {
      for (int a = 0; a < 2; a++)         //Top Line 0
      {
        if (lasx == faller4x+a && lasy == faller4y)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          faller4Exist = false;
          lasExist=false;
          Boom(faller4x,faller4y,false,0);
          faller4x = 34;
        }
      }
      for (int a = 0; a < 3; a++)          //Line 1
      {
        if (lasx == faller4x+a && lasy == faller4y+1)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          faller4Exist = false;
          lasExist=false;
          Boom(faller4x,faller4y,false,0);
          faller4x = 34;
        }
      }
      for (int a = 0; a < 3; a++)          //Line 2
      {
        if (lasx == faller4x+a && lasy == faller4y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          faller4Exist = false;
          lasExist=false;
          Boom(faller4x,faller4y,false,0);
          faller4x = 34;
        }
      }
    }
    
    //Collision detection for Riser 1
    if (riser1Exist == true)
    {
      for (int a = 0; a < 3; a++)          //Top Line 0
      {
        if (lasx == riser1x+a && lasy == riser1y)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          riser1Exist = false;
          lasExist=false;
          Boom(riser1x,riser1y,false,0);
          riser1x = 34;
        }
      }      
      for (int a = 0; a < 2; a++)          //Line 1
      {
        if (lasx == riser1x+0 && lasy == riser1y+1)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
          {
            riser1Exist = false;
            lasExist=false;
            Boom(riser1x,riser1y,false,0);
            riser1x = 34;
          }
      }
      for (int a = 0; a < 1; a++)         //Line 2
      {      
        if (lasx == riser1x+a && lasy == riser1y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          riser1Exist = false;
          lasExist=false;
          Boom(riser1x,riser1y,false,0);
          riser1x = 34;
        }
      }
    }      
    

      //Collision detection for Riser 2
   if (riser2Exist == true)
    {
      for (int a = 0; a < 3; a++)          //Top Line 0
      {
        if (lasx == riser2x+a && lasy == riser2y)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          riser2Exist = false;
          lasExist=false;
          Boom(riser2x,riser2y,false,0);
          riser2x = 34;
        }
      }      
      for (int a = 0; a < 2; a++)          //Line 1
      {
        if (lasx == riser2x+0 && lasy == riser2y+1)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
          {
            riser2Exist = false;
            lasExist=false;
            Boom(riser2x,riser2y,false,0);
            riser2x = 34;
          }
      }
      for (int a = 0; a < 1; a++)         //Line 2
      {      
        if (lasx == riser2x+a && lasy == riser2y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          riser2Exist = false;
          lasExist=false;
          Boom(riser2x,riser2y,false,0);
          riser1x = 34;
        }
      }
    }      

      //Collision detection for Riser 3
    if (riser3Exist == true)
    {
      for (int a = 0; a < 3; a++)          //Top Line 0
      {
        if (lasx == riser3x+a && lasy == riser3y)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          riser3Exist = false;
          lasExist=false;
          Boom(riser3x,riser3y,false,0);
          riser3x = 34;
        }
      }      
      for (int a = 0; a < 2; a++)          //Line 1
      {
        if (lasx == riser3x+0 && lasy == riser3y+1)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
          {
            riser3Exist = false;
            lasExist=false;
            Boom(riser3x,riser3y,false,0);
            riser3x = 34;
          }
      }
      for (int a = 0; a < 1; a++)         //Line 2
      {      
        if (lasx == riser3x+a && lasy == riser3y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          riser3Exist = false;
          lasExist=false;
          Boom(riser3x,riser3y,false,0);
          riser3x = 34;
        }
      }
    }      
      //Collision detection for Riser 4
    if (riser4Exist == true)
    {
      for (int a = 0; a < 3; a++)          //Top Line 0
      {
        if (lasx == riser4x+a && lasy == riser4y)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          riser4Exist = false;
          lasExist=false;
          Boom(riser4x,riser4y,false,0);
          riser4x = 34;
        }
      }      
      for (int a = 0; a < 2; a++)          //Line 1
      {
        if (lasx == riser4x+0 && lasy == riser4y+1)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
          {
            riser4Exist = false;
            lasExist=false;
            Boom(riser4x,riser4y,false,0);
            riser4x = 34;
          }
      }
      for (int a = 0; a < 1; a++)         //Line 2
      {      
        if (lasx == riser4x+a && lasy == riser4y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          riser4Exist = false;
          lasExist=false;
          Boom(riser4x,riser4y,false,0);
          riser4x = 34;
        }
      }
    }   
  }
}



void Boom(int x, int y, bool addKill, int scoreType)               //Spawns explosion bitmap at called coords. Then increments kill count
{
  matrix.drawBitmap(x,y,explosion,3,3,1); //Draw explosion
  tone(buzzerPin, 75,75);
  if (addKill == true)
  {
    kills++;
  }
  if (scoreType == 1) //Score type for UFOs
  {
    score = score+10;
  }
  if (scoreType == 2) //Score type for bouncers
  {
    score = score+20;
  }
  if (scoreType == 3) //Scoretype for LT
  {
    score = score+70;
  }
  //if (scoreType == 4) //Score type for Risers and Fallers.. Currently not using it
 // {
 //   score = score+30;
//  }
  if (scoreType == 5) //Score type for Boss
  {
    score = score+(100*levelNumber);
  }
}


void ScreenLimit()
{
  //setting boundries of the screen for ship
  if (shipx < 0)
  {
    shipx = 0;
  }
  if (shipx > 29)
  {
    shipx = 29;
  }
  
  if (shipy < 0)
  {
    shipy = 0;
  }
  if (shipy > 6)
  {
    shipy = 6;
  }
  
  if (lasExist == true) //When it goes off the screen then stop drawing it and mark it as not existing
  {
    
    if (lasx > 31)
    {
      lasExist=false;
    }
    if (lasy < 0)
    {
      lasy = 0;
    }
    if (lasy > 7)
    {
      lasy = 7;
    }
  }

    //UFO laser screen limit controls
    
      if (ufoLas1x < -2)
      {
          ufoLasExist1 = false;
      }      
    

  
      if (ufoLas2x < -2)
      {
          ufoLasExist2 = false;
      }      
    

    
      if (ufoLas3x < -2)
      {
          ufoLasExist3 = false;
      }      
    

    
      if (ufoLas4x < -2)
      {
          ufoLasExist4 = false;
      }      
    
  
    //UFO screen limit controls. Automatically respawning UFO's at a random Y coordinate on the right side if they go off the left side
    if (ufo1Exist == true && ufo1x < -3)
    {
      ufo1x = 33; //if UFO goes off the left side it gets moved to the right side again
      ufo1y = random(0,7);
      // going to need some sort of sorting code to stop ufo's overlapping  
    }
     if (ufo2Exist == true && ufo2x < -3)
    {
      ufo2x = 33; //if UFO goes off the left side it gets moved to the right side again
      ufo2y = random(0,7);
      // going to need some sort of sorting code to stop ufo's overlapping  
    }
     if (ufo3Exist == true && ufo3x < -3)
    {
      ufo3x = 33; //if UFO goes off the left side it gets moved to the right side again
      ufo3y = random(0,7);
      // going to need some sort of sorting code to stop ufo's overlapping  
    }
  
    //Bouncer screen limit controls. When bouncers hit top or bottom the direction variable changes. When off the left they are wiped from existence and respawned at a later time.
  
    if (bouncer1Exist == true && bouncer1y > 5)
    {
      bouncer1Direction = false;
    }
    else if (bouncer1Exist == true && bouncer1y < 0)
    {
      bouncer1Direction = true;
    }
  
     if (bouncer2Exist == true && bouncer2y > 5)
    {
      bouncer2Direction = false;
    }
    else if (bouncer2Exist == true && bouncer2y < 0)
    {
      bouncer2Direction = true;
    }
  
     if (bouncer3Exist == true && bouncer3y > 5)
    {
      bouncer3Direction = false;
    }
    else if (bouncer3Exist == true && bouncer3y < 0)
    {
      bouncer3Direction = true;
    }
  
     if (bouncer4Exist == true && bouncer4y > 5)
    {
      bouncer4Direction = false;
    }
    else if (bouncer4Exist == true && bouncer4y < 0)
    {
      bouncer4Direction = true;
    }
    // If bouncers go off the left side they disappear as despawned
    if (bouncer1x < 0)
    {
      bouncer1Exist = false;
    }
  
    if (bouncer2x < 0)
    {
      bouncer2Exist = false;
    }
  
    if (bouncer3x < 0)
    {
      bouncer3Exist = false;
    }
  
    if (bouncer4x < 0)
    {
      bouncer4Exist = false;
    }
    //LT screen limit control
    if (ltExist == true && ltx < -6)
    {
      ltx = 33; //if LT goes off the left side it gets moved to the right side again
      lty = random(0,6);  
    }
    //Screen limit controls for Risers
    if (faller1Exist == true && faller1y > 7)
    {
      faller1Exist = false;
    }
    if (faller2Exist == true && faller2y > 7)
    {
      faller2Exist = false;
    }
    if (faller3Exist == true && faller3y > 7)
    {
      faller3Exist = false;
    }
    if (faller4Exist == true && faller4y > 7)
    {
      faller4Exist = false;
    }
    //Screen limit controls for Risers
    if (riser1Exist == true && riser1y < -2)
    {
      riser1Exist = false;
    }
    if (riser2Exist == true && riser2y < -2)
    {
      riser2Exist = false;
    }
    if (riser3Exist == true && riser3y < -2)
    {
      riser3Exist = false;
    }
    if (riser4Exist == true && riser4y < -2)
    {
      riser4Exist = false;
    }
    
}

void SpawnTimer()
{
  if (spawnEnabled == true)
  {
    //Counting spawn timer
    currentTime = millis(); //get the current time in milliseconds
    currentTime2 = millis();//same again for second timer  
    currentTime3 = millis();//and again
    if (currentTime - startTime >= spawnTime)   //Uses the currentTime, startTime and spawnTime variables to spawn enemies on set times
    {
        //spawn UFO
        
        SpawnUFO();
        //reset timer
        startTime = currentTime;  //Saves the start time of the spawn so the if statement works
    }
  
    if (currentTime2 - startTime2 >= spawnTime2)
    {
        //spawn bouncer squad
        
        SpawnBouncer();
        //reset timer
        startTime2 = currentTime2;  //Saves the start time of the spawn so the if statement works
    }

    if (currentTime3 - startTime3 >= spawnTime3)
    {
        //spawn LT
        
        SpawnLT();
        //reset timer
        startTime3 = currentTime3;  //Saves the start time of the spawn so the if statement works
    }
  }
  
}

void SpawnUFO()
{
  if (ufo1Exist == false)
  {
    
    ufo1x = 32;           //Spawn off the right side of the screen
    ufo1y = random(0,7);   //Spawn at a random Y coord
    
    ufo1Exist = true;
    
  }
  else if (ufo2Exist == false)
  {
    ufo2x = 32;           //Spawn off the right side of the screen
    ufo2y = random(0,7);   //Spawn at a random Y coord
    
    ufo2Exist = true;
  }
  else if (ufo3Exist == false)
  {
    ufo3x = 32;           //Spawn off the right side of the screen
    ufo3y = random(0,7);   //Spawn at a random Y coord
    
    ufo3Exist = true;
  }
   
}

void UfoControl()
{
  //If the UFO exists then draw its bitmap
  if (ufo1Exist == true)
  {
    ufo1x--;
    matrix.drawBitmap(ufo1x,ufo1y,ufo,3,2,1);
  }
  if (ufo2Exist == true)
  {
    ufo2x--;
    matrix.drawBitmap(ufo2x,ufo2y,ufo,3,2,1);
  }
  if (ufo3Exist == true)
  {
    ufo3x--;
    matrix.drawBitmap(ufo3x,ufo3y,ufo,3,2,1);
  }
}


void SpawnBouncer()
{
  if (bouncer1Exist == false && bouncer2Exist == false && bouncer3Exist == false && bouncer4Exist == false)
  {
    
    bouncer1x = 32;           //Spawn off the right side of the screen
    bouncer2x = bouncer1x+bouncerGap;//spawn other bouncers spaced out on the x axis
    bouncer3x = bouncer2x+bouncerGap;
    bouncer4x = bouncer3x+bouncerGap;
    bouncerOrigin = random(0,2);
    if (bouncerOrigin = 0)
    {
      bouncer1y = 0;   //Spawn at top of screen
      bouncer2y = 1;
      bouncer3y = 2;
      bouncer4y = 3;
    }
    if (bouncerOrigin = 1)
    {
      bouncer1y = 7; //Spawn at bottom
      bouncer2y = 6;
      bouncer3y = 5;
      bouncer4y = 4;
    }
    
    
    bouncer1Exist = true;
    bouncer2Exist = true;
    bouncer3Exist = true;
    bouncer4Exist = true;
    
  }
}

void BouncerControl()
{
  //Bouncer move across to the left and up or down depending opn direction variable. That variable is changed in ScreenLimit()
  
  if (bouncer1Exist == true)    //If bouncer exists then increment bouncer x and y counters. These are used to slow the movement.
  {
    bouncer1xSpeed++;
    bouncer1ySpeed++;
    if (bouncer1xSpeed > xSpeed)    //When the counter goes above the speed value then IF statement executes
    {
      bouncer1x--;
      bouncer1xSpeed = 0;
    }
    if (bouncer1Direction == true)
    {
      if (bouncer1ySpeed > ySpeed)
      {
        bouncer1y++;
        bouncer1ySpeed = 0;
      }
    }
    else if (bouncer1Direction == false)
    {
      if (bouncer1ySpeed > ySpeed)
      {
        bouncer1y--;
        bouncer1ySpeed = 0;
      }
    }
    matrix.drawBitmap(bouncer1x,bouncer1y,bouncer,2,3,1);
  }
  if (bouncer2Exist == true)
  {
     bouncer2xSpeed++;
     bouncer2ySpeed++;
    if (bouncer2xSpeed > xSpeed)
    {
      bouncer2x--;
      bouncer2xSpeed = 0;
    }
    if (bouncer2Direction == true)
    {
      if (bouncer2ySpeed > ySpeed)
      {
        bouncer2y++;
        bouncer2ySpeed = 0;
      }
    }
    else if (bouncer2Direction == false)
    {
      if (bouncer2ySpeed > 2)
      {
        bouncer2y--;
        bouncer2ySpeed = 0;
      }
    }
    matrix.drawBitmap(bouncer2x,bouncer2y,bouncer,2,3,1);
  }
  if (bouncer3Exist == true)
  {
    bouncer3xSpeed++;
    bouncer3ySpeed++;
    if (bouncer3xSpeed > xSpeed)
    {
      bouncer3x--;
      bouncer3xSpeed = 0;
    }
    if (bouncer3Direction == true)
    {
      if (bouncer3ySpeed > ySpeed)
      {
        bouncer3y++;
        bouncer3ySpeed = 0;
      }
    }
    else if (bouncer3Direction == false)
    {
      if (bouncer3ySpeed > 2)
      {
        bouncer3y--;
        bouncer3ySpeed = 0;
      }
    }
    matrix.drawBitmap(bouncer3x,bouncer3y,bouncer,2,3,1);
  }
  if (bouncer4Exist == true)
  {
    bouncer4xSpeed++;
    bouncer4ySpeed++;
    if (bouncer4xSpeed > xSpeed)
    {
      bouncer4x--;
      bouncer4xSpeed = 0;
    }
    if (bouncer4Direction == true)
    {
      if (bouncer4ySpeed > 2)
      {
        bouncer4y++;
        bouncer4ySpeed = 0;
      }
    }
    else if (bouncer4Direction == false)
    {
      if (bouncer4ySpeed > ySpeed)
      {
        bouncer4y--;
        bouncer4ySpeed = 0;
      }
    }
    matrix.drawBitmap(bouncer4x,bouncer4y,bouncer,2,3,1);
  }
}

void SpawnFaller()
{
  if (faller1Exist == false && faller2Exist == false && faller3Exist == false && faller4Exist == false)
  {
    
    faller1x = 15;           //Spawn above the boss off the top of the screen
    faller2x = faller1x+bouncerGap;//spawn other bouncers spaced out on the x axis
    faller3x = faller2x+bouncerGap;
    faller4x = faller3x+bouncerGap;
    faller1y = -1;   //Spawn at top of screen
    faller2y = -2;
    faller3y = -3;
    faller4y = -4;
        
    faller1Exist = true;
    faller2Exist = true;
    faller3Exist = true;
    faller4Exist = true;
    
  }
}

void FallerControl()
{
  //Fallers are spawned by the Boss during battle after level 4. Timer for spawning is in the BossControl function.
  //Control routines for faller 1
  if (faller1Exist == true)    //If faller exists then increment fallerSpeed x and y counters. These are used to slow the movement.
  {
    faller1Speedx++;
    faller1Speedy++;
    if (faller1Speedx > fallerxSpeedTarget)    //When the counter goes above the speed value then IF statement executes
    {
      faller1x--;
      faller1Speedx = 0;
    }
    
    
    if (faller1Speedy > fallerySpeedTarget)
    {
      faller1y++;
      faller1Speedy = 0;
    }
    
    matrix.drawBitmap(faller1x,faller1y,faller,3,3,1);
  }
// Control routines for faller 2
    if (faller2Exist == true)    //If faller exists then increment fallerSpeed x and y counters. These are used to slow the movement.
  {
    faller2Speedx++;
    faller2Speedy++;
    if (faller2Speedx > fallerxSpeedTarget)    //When the counter goes above the speed value then IF statement executes
    {
      faller2x--;
      faller2Speedx = 0;
    }
    
    
    if (faller2Speedy > fallerySpeedTarget)
    {
      faller2y++;
      faller2Speedy = 0;
    }
    
    matrix.drawBitmap(faller2x,faller2y,faller,3,3,1);
   }

  // Control routines for faller 3
    if (faller3Exist == true)    //If faller exists then increment fallerSpeed x and y counters. These are used to slow the movement.
  {
    faller3Speedx++;
    faller3Speedy++;
    if (faller3Speedx > fallerxSpeedTarget)    //When the counter goes above the speed value then IF statement executes
    {
      faller3x--;
      faller3Speedx = 0;
    }
    
    
    if (faller3Speedy > fallerySpeedTarget)
    {
      faller3y++;
      faller3Speedy = 0;
    }
    
    matrix.drawBitmap(faller3x,faller3y,faller,3,3,1);
   }

   // Control routines for faller 4
    if (faller4Exist == true)    //If faller exists then increment fallerSpeed x and y counters. These are used to slow the movement.
  {
    faller4Speedx++;
    faller4Speedy++;
    if (faller4Speedx > fallerxSpeedTarget)    //When the counter goes above the speed value then IF statement executes
    {
      faller4x--;
      faller4Speedx = 0;
    }
    
    
    if (faller4Speedy > fallerySpeedTarget)
    {
      faller4y++;
      faller4Speedy = 0;
    }
    
    matrix.drawBitmap(faller4x,faller4y,faller,3,3,1);
   }  
}


void SpawnRiser()
{
  if (riser1Exist == false && riser2Exist == false && riser3Exist == false && riser4Exist == false)
  {
    
    riser1x = 15;           //Spawn above the boss off the top of the screen
    riser2x = riser1x+bouncerGap;//spawn other bouncers spaced out on the x axis
    riser3x = riser2x+bouncerGap;
    riser4x = riser3x+bouncerGap;
    riser1y = 7;   //Spawn at Bottom of screen
    riser2y = 8;
    riser3y = 9;
    riser4y = 10;
        
    riser1Exist = true;
    riser2Exist = true;
    riser3Exist = true;
    riser4Exist = true;
    
  }
}

void RiserControl()
{
  //Risers are spawned by the Boss during battle after level 5. Timer for spawning is in the BossControl function.
  //Control routines for riser 1
  if (riser1Exist == true)    //If riser exists then increment riserSpeed x and y counters. These are used to slow the movement.
  {
    riser1Speedx++;
    riser1Speedy++;
    if (riser1Speedx > fallerxSpeedTarget)    //When the counter goes above the speed value then IF statement executes
    {
      riser1x--;
      riser1Speedx = 0;
    }
    
    
    if (riser1Speedy > fallerySpeedTarget)
    {
      riser1y--;
      riser1Speedy = 0;
    }
    
    matrix.drawBitmap(riser1x,riser1y,riser,3,3,1);
  }
  //Control routines for riser 2
  if (riser2Exist == true)    //If riser exists then increment riserSpeed x and y counters. These are used to slow the movement.
  {
    riser2Speedx++;
    riser2Speedy++;
    if (riser2Speedx > fallerxSpeedTarget)    //When the counter goes above the speed value then IF statement executes
    {
      riser2x--;
      riser2Speedx = 0;
    }
    
    
    if (riser2Speedy > fallerySpeedTarget)
    {
      riser2y--;
      riser2Speedy = 0;
    }
    
    matrix.drawBitmap(riser2x,riser2y,riser,3,3,1);
  }
  //Control routines for riser 3
  if (riser3Exist == true)    //If riser exists then increment riserSpeed x and y counters. These are used to slow the movement.
  {
    riser3Speedx++;
    riser3Speedy++;
    if (riser3Speedx > fallerxSpeedTarget)    //When the counter goes above the speed value then IF statement executes
    {
      riser3x--;
      riser3Speedx = 0;
    }
    
    
    if (riser3Speedy > fallerySpeedTarget)
    {
      riser3y--;
      riser3Speedy = 0;
    }
    
    matrix.drawBitmap(riser3x,riser3y,riser,3,3,1);
  }
  //Control routines for riser 4
  if (riser4Exist == true)    //If riser exists then increment riserSpeed x and y counters. These are used to slow the movement.
  {
    riser4Speedx++;
    riser4Speedy++;
    if (riser4Speedx > fallerxSpeedTarget)    //When the counter goes above the speed value then IF statement executes
    {
      riser4x--;
      riser4Speedx = 0;
    }
    
    
    if (riser4Speedy > fallerySpeedTarget)
    {
      riser4y--;
      riser4Speedy = 0;
    }
    
    matrix.drawBitmap(riser4x,riser4y,riser,3,3,1);
  }

}

void SpawnLT()
{
  if (ltExist == false)
  {
    
    ltx = 32;           //Spawn off the right side of the screen
    lty = random(0,6);   //Spawn at a random Y coord
    
    ltExist = true;
   }
}

void LTControl()
{
  //If the UFO exists then draw its bitmap
  if (ltExist == true)
  {
    ltxSpeed++;
    if (ltxSpeed == ltxSpeedTarget)
    {
      ltxSpeed = 0;
      ltx--;
    }
    matrix.drawBitmap(ltx, lty, LT, 6, 3, 1);
  }
  if (ltHealth <= 0)
  {
    ltExist = false;
    Boom(ltx,lty,false,3);  //Calls Boom() function to add score. Kills are added manually below.
    kills=kills+3;
    ltHealth = 3;
  }
}



void BossBattle()//Sounds the warning siren then spawns boss. Still need to finish movement
{
    if (kills > killsTarget && bossBattleStarted == false)
    {
      bossBattleStarted = true;
      spawnEnabled = false;             //Turns off spawning for other UFO types
      for(int i = 5; i > 0; i--)          //Play alarm sound
    {
      for (int x = 0; x < 360; x++)       // X from 0 degree->360 degree 
      {       
        sinVal = sin(x * (PI / 180));            // Calculate the sine of x 
        toneVal = 2000 + sinVal * 500;       // Calculate sound frequency according to the sine of x  
        tone(buzzerPin, toneVal);             // Output sound frequency to buzzerPin 
        delay(1);
      }
    }
    tone(buzzerPin, 0, 5);  //This is to stop the tone sound. It sticks around otherwise.
    if (boss1Exist == false)
    {    
      matrix.drawBitmap(bossx, bossy, boss, 8 ,8 ,1);
      boss1Exist = true;
      bossStartTime = millis();   //Set start timer for boss weapons
      bossStartTime = millis();   //Set start timer for boss minions
    }
    
  }
}

void BossControl()
{
  if (boss1Exist == true)
  {      
      bossxSpeed++;
      if (bossxSpeed > bossxSpeedTarget && bossx > 24)    //When the counter goes above the speed value then IF statement executes
      {
        bossx--;                //Move the boss x cords to the left
        bossxSpeed = 0;
      }
    
    matrix.drawBitmap(bossx, bossy, boss, 8, 8, 1); //Draw the boss bitmap at the new coords
    if (bossx == 24)
    {
       
      //Counting shoot timer
      bossCurrentTime = millis(); //get the current time in milliseconds
      bossCurrentTime2 = millis();
     
      if (bossCurrentTime - bossStartTime >= bossLaserTimer)    //startTimer is set in BossBattle function
      {
          //shoot laser
          selection = random(1,5);//Select laser cannon at random
          while (selection == lastSelection)//While loop to ensure that the same laser isnt fired twice in a row too quick. Prevents timing gaps
          {
            selection = random(1,5);
          }
          UFOLaserShoot(selection);//Call UFOLaserShoot function with cannon selection
          //reset timer
          bossStartTime = bossCurrentTime;  //Saves the start time of the spawn so the if statement works
      }
      if (levelNumber >= 4)
      {
        if (bossCurrentTime2 - bossStartTime2 >= bossMinionTimer)  //startTimer is set in BossBattle function
        {
            //Select minions and spawn them
            minionSelection = random(1,3);
            if (minionSelection == 1)
            {
              SpawnFaller();
            }
            if (minionSelection == 2)
            {
              SpawnRiser();
            }
            
            
            //reset timer
            bossStartTime2 = bossCurrentTime2;  //Saves the start time of the spawn so the if statement works
        }
      }
    }
    //Boss health counter hits zero, trigger boss death and new level
    if (bossHealth <= 0)
    {
      boss1Exist = false;   //Boss no longer exists
      Boom(bossx,bossy,false,5);//Calls Boom() function to add score
      matrix.fillScreen(LOW); //Clear screen
      for (int i = 5; i > 0; i--)
      {      
        matrix.drawBitmap(bossx, bossy, bossBoom1 ,8 ,8, 1);    //Boss explosion first frame
        tone(buzzerPin, 100,100);             //Play sound
        delay(200);   //Wait
        //matrix.fillScreen(LOW); //Clear screen
        matrix.drawBitmap(bossx, bossy, bossBoom2 ,8 ,8, 1);    //Boss explosion second frame
        tone(buzzerPin, 200,100);         //Play second sound
        delay(200); //Wait
      }
      tone(buzzerPin, 1, 1);//Stop beep
      
      bossx=39;             //Move bossx back to 32
      matrix.fillScreen(LOW); //clear the screen
      gameStart = false;    //Mark game as stopped
      levelNumber++ ;       //increment level
      if (levelNumber > 10)
      {
        GameOver(1);
        return;
      }
      tape = "Level ";      //Prepare new tape for ticker function
      tape += levelNumber;  //Adding level number to ticker string
      tape += "  Score: ";
      tape += score;
      ufoLasExist1 = false;
      ufoLasExist2 = false;
      ufoLasExist3 = false;
      ufoLasExist4 = false;
      faller1Exist = false;
      faller2Exist = false;
      faller3Exist = false;
      faller4Exist = false;
      riser1Exist = false;
      riser2Exist = false;
      riser3Exist = false;
      riser4Exist = false;
      ufoLas1x=bossx;
      ufoLas2x=bossx;
      ufoLas3x=bossx;
      ufoLas4x=bossx;
      Ticker(true);             //Call ticker function to show score and new level
      
    }
  }
}
void UFOLaserShoot(int selection)
{
  if (selection == 1)
  {
    if (ufoLasExist1 == false)//Check to see if the UFO laser already exists
    {
      ufoLas1x=bossx+1;      //spawn laser in the middle
      ufoLas1y=bossy+4;
      ufoLasExist1=true;
      tone(buzzerPin, 200,100);//play laser sound    
    }
  }
  if (selection == 2)
  { 
    if (ufoLasExist2 == false)
    {
      ufoLas2x=bossx+2;      //spawn laser at the top side
      ufoLas2y=bossy+1;
      ufoLasExist2=true;
      tone(buzzerPin, 300,100);//play laser sound    
    }
  }
  if (selection == 3)
  {
    if (ufoLasExist3 == false)
    {
      ufoLas3x=bossx+2;    //spawn laser at the bottom side
      ufoLas3y=bossy+7;
      ufoLasExist3=true;
      tone(buzzerPin, 400,100);//play laser sound    
    }
  }
  if (selection == 4)
  {
    if (ufoLasExist4 == false)//Planning to make this one random
    {
      coinFlip = random(0,2);
      if (coinFlip == 0)
      {
        ufoLas4x=bossx+2;   
        ufoLas4y=bossy+2;
        ufoLasExist4=true;
        tone(buzzerPin, 500,100);//play laser sound
      }
      if (coinFlip == 1)
      {
        ufoLas4x=bossx+2;   
        ufoLas4y=bossy+6;
        ufoLasExist4=true;
        tone(buzzerPin, 500,100);//play laser sound
      }
    }
  }    
}

void UFOLaserControl()
{
  if (ufoLasExist1 == true)
  {
    ufoLas1x--;
    matrix.drawBitmap(ufoLas1x, ufoLas1y, ufoLaser, 2, 1, 1);
  }
  if (ufoLasExist2 == true)
  {
    ufoLas2x--;
    matrix.drawBitmap(ufoLas2x, ufoLas2y, ufoLaser, 2, 1, 1);
  }
  if (ufoLasExist3 == true)
  {
    ufoLas3x--;
    matrix.drawBitmap(ufoLas3x, ufoLas3y, ufoLaser, 2, 1, 1);
  }
  if (ufoLasExist4 == true)
  {
      ufoLas4x--;
      matrix.drawBitmap(ufoLas4x, ufoLas4y, ufoLaser, 2, 1, 1);  
  }

  
}

void ShipCollision()
{  
  if (gameStart == true && collisionDetection == true)
  {
    //Collision detection for line 0 of ship
    //Collision detection for UFO1. Dont need line 0 of UFO because line 0 of ship cannot touch it anyway.
    if (ufo1Exist == true)
    {
      
      for (int a = 0; a < 2; a++)
      {
          if (shipx == ufo1x+a && shipy == ufo1y+1) ///Line 1
        {
          ShipHit();
        }
      } 
    //Collision detection for line 1 of ship..................
    //Contains extra for loop to loop through all the ship line 1 pixels
    //Collision detection for UFO1
      for (int b = 0; b < 1; b++)   //Had b < 2 and the collision detection worked but looked wonky when moving towards ufos
      {
        for (int a = 0; a < 2; a++)
        {
            if (shipx+b == ufo1x+a && shipy+1 == ufo1y+1)     //Line 1
          {
            ShipHit();
          }
        }
           
        for (int a = 1; a < 3; a++)
        {
          if (shipx+b == ufo1x+a && shipy+1 == ufo1y)         //Line 0
          {
            ShipHit();
          }
        }
      }     
    }
    //Collision detection for line 0 of ship    
    //collision detection for UFO2
    if (ufo2Exist == true)
    {
      
      for (int a = 0; a < 2; a++)
      {
          if (shipx == ufo2x+a && shipy == ufo2y+1) ///Line 1
        {
          ShipHit();
        }
      }
    //Collision detection for line 1 of ship
    //Collision detection for UFO2 
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 2; a++)
        {
            if (shipx+b == ufo2x+a && shipy+1 == ufo2y+1)     //Line 1
          {
            ShipHit();
          }
        }
           
        for (int a = 1; a < 3; a++)
        {
          if (shipx+b == ufo2x+a && shipy+1 == ufo2y)         //Line 0
          {
            ShipHit();
          }
        }
      }     
    }    
    //Collision detection for line 0 of ship
    //Collision detection for UFO3
    if (ufo3Exist == true)
    {
      
      for (int a = 0; a < 2; a++)
      {
          if (shipx == ufo3x+a && shipy == ufo3y+1) ///Line 1
        {
          ShipHit();
        }
      } 

      //Contains extra for loop to loop through all the ship line 1 pixels
      //Collision detection for UFO3
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 2; a++)
        {
            if (shipx+b == ufo3x+a && shipy+1 == ufo3y+1)     //Line 1
          {
            ShipHit();
          }
        }
           
        for (int a = 1; a < 3; a++)
        {
          if (shipx+b == ufo3x+a && shipy+1 == ufo3y)         //Line 0
          {
            ShipHit();
          }
        }
      }     
    }
    //Collision detection for line 0 of ship    
    //Collision detection for Bouncer1. Don't need line 0 and 1 becuase line 0 and 1 of bouncers and line 0 of ship never meet
    if (bouncer1Exist == true)
    {
      for (int a = 1; a < 2; a++)
      {
        if (shipx == bouncer1x+a && shipy == bouncer1y+2) //Line 2
        {
          ShipHit();
        }
      }

      //Collision detection for Bouncer1 and Line 1 of ship
      for (int b = 0; b < 1; b++)
      {
        for (int a = 1; a < 2; a++)
        {
          if (shipx+b == bouncer1x+a && shipy+1 == bouncer1y)   //Line 0
          {
              ShipHit();
          }
        }
        for (int a = 0; a < 2; a++)
        {
          if (shipx+b == bouncer1x+a && shipy+1 == bouncer1y+1)       //Line 1
          {
              ShipHit();
          }
        }
        for (int a = 1; a < 2; a++)
        {
          if (shipx+b == bouncer1x+a && shipy+1 == bouncer1y+2)       //Line 2
          {
              ShipHit();
          }
        }
      }
    }    
    //Collision detection for line 0 of ship    
    //Collision detection for Bouncer2. Don't need line 0 and 1 because line 0 and 1 of bouncers and line 0 of ship never meet
    if (bouncer2Exist == true)
    {
     
      for (int a = 1; a < 2; a++)
      {
        if (shipx == bouncer2x+a && shipy == bouncer2y+2) //Line 2
        {
          ShipHit();
        }
      }

       //Collision detection for Bouncer2 and Line 1 of ship
          
      for (int b = 0; b < 1; b++)
      {
        for (int a = 1; a < 2; a++)
        {
          if (shipx+b == bouncer2x+a && shipy+1 == bouncer2y)   //Line 0
          {
              ShipHit();
          }
        }
        for (int a = 0; a < 2; a++)
        {
          if (shipx+b == bouncer2x+a && shipy+1 == bouncer2y+1)       //Line 1
          {
              ShipHit();
          }
        }
        for (int a = 1; a < 2; a++)
        {
          if (shipx+b == bouncer2x+a && shipy+1 == bouncer2y+2)       //Line 2
          {
              ShipHit();
          }
        }
      }
    }    


    
    //Collision detection for line 0 of ship    
    //Collision detection for Bouncer3. Don't need line 0 and 1 becuase line 0 and 1 of bouncers and line 0 of ship never meet
    if (bouncer3Exist == true)
    {
     
      for (int a = 1; a < 2; a++)
      {
        if (shipx == bouncer3x+a && shipy == bouncer3y+2) //Line 2
        {
          ShipHit();
        }
      }

    //Collision detection for Bouncer3 and Line 1 of ship    
      for (int b = 0; b < 1; b++)
      {
        for (int a = 1; a < 2; a++)
        {
          if (shipx+b == bouncer3x+a && shipy+1 == bouncer3y)   //Line 0
          {
              ShipHit();
          }
        }
        for (int a = 0; a < 2; a++)
        {
          if (shipx+b == bouncer3x+a && shipy+1 == bouncer3y+1)       //Line 1
          {
              ShipHit();
          }
        }
        for (int a = 1; a < 2; a++)
        {
          if (shipx+b == bouncer3x+a && shipy+1 == bouncer3y+2)       //Line 2
          {
              ShipHit();
          }
        }
      }      
    }    
    
    //Collision detection for line 0 of ship    
    //Collision detection for Bouncer4. Don't need line 0 and 1 becuase line 0 and 1 of bouncers and line 0 of ship never meet
    if (bouncer4Exist == true)
    {
 
      for (int a = 1; a < 2; a++)
      {
        if (shipx == bouncer4x+a && shipy == bouncer4y+2) //Line 2
        {
          ShipHit();
        }
      }

     //Collision detection for Bouncer4 and Line 1 of ship
      for (int b = 0; b < 1; b++)
      {
        for (int a = 1; a < 2; a++)
        {
          if (shipx+b == bouncer4x+a && shipy+1 == bouncer4y)   //Line 0
          {
              ShipHit();
          }
        }
        for (int a = 0; a < 2; a++)
        {
          if (shipx+b == bouncer4x+a && shipy+1 == bouncer4y+1)       //Line 1
          {
              ShipHit();
          }
        }
        for (int a = 1; a < 2; a++)
        {
          if (shipx+b == bouncer4x+a && shipy+1 == bouncer4y+2)       //Line 2
          {
              ShipHit();
          }
        }
      }      
    }    



//Dont need collision detection for lines 0 and 1 of LT and line 0 of ship because they cant touch anyway
//Collision detection routines for LT
    if (ltExist == true)
    {
      
      for (int a = 2; a < 4; a++)           //Line 2
      {
        if (shipx == ltx+a && shipy == lty+2)
        {
          ShipHit();
        }
      }

    //Collision detection routines for LT and Ship line 1
      for (int b = 0; b < 2; b++)
      {
        for (int a = 1; a < 4; a++)           //Top line 0
        {
          if (shipx+b == ltx+a && shipy+1 == lty)
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 5; a++)           //Line 1
        {
          if (shipx+b == ltx+a && shipy+1 == lty+1)
          {
            ShipHit();
          }
        }
        for (int a = 2; a < 4; a++)           //Line 2
        {
          if (shipx+b == ltx+a && shipy+1 == lty+2)
          {
            ShipHit();
          }
        }
      }           
    }
    
//Dont need collision detection between line 0 of ship and line 0 and 1 of fallers because they will never touch
//Collision detection for Faller 1
    if (faller1Exist == true)
    {
      
      for (int a = 0; a < 3; a++)          //Line 2
      {
        if (shipx == faller1x+a && shipy == faller1y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          ShipHit();
        }
      }

      //Collision detection for Faller 1 and ship line 1
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 2; a++)         //Top Line 0
        {
          if (shipx+b == faller1x+a && shipy+1 == faller1y)  
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 3; a++)          //Line 1
        {
          if (shipx+b == faller1x+a && shipy+1 == faller1y+1)    
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 3; a++)          //Line 2
        {
          if (shipx+b == faller1x+a && shipy+1 == faller1y+2)  
          {
            ShipHit();
          }
        }
      }           
    }
    //Dont need collision detection between line 0 of ship and line 0 and 1 of fallers because they will never touch
    //Collision detection for Faller 2
   if (faller2Exist == true)
    {
      
      for (int a = 0; a < 3; a++)          //Line 2
      {
        if (shipx == faller2x+a && shipy == faller2y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          ShipHit();
        }
      }

      //Collision detection for Faller 2 and ship line 1
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 2; a++)         //Top Line 0
        {
          if (shipx+b == faller2x+a && shipy+1 == faller2y)  
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 3; a++)          //Line 1
        {
          if (shipx+b == faller2x+a && shipy+1 == faller2y+1)    
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 3; a++)          //Line 2
        {
          if (shipx+b == faller2x+a && shipy+1 == faller2y+2)  
          {
            ShipHit();
          }
        }
      }           
    }
    //Dont need collision detection between line 0 of ship and line 0 and 1 of fallers because they will never touch
    //Collision detection for Faller 3
    if (faller3Exist == true)
    {
      
      for (int a = 0; a < 3; a++)          //Line 2
      {
        if (shipx == faller3x+a && shipy == faller3y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          ShipHit();
        }
      }

      //Collision detection for Faller 3 and ship line 1
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 2; a++)         //Top Line 0
        {
          if (shipx+b == faller3x+a && shipy+1 == faller3y)  
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 3; a++)          //Line 1
        {
          if (shipx+b == faller3x+a && shipy+1 == faller3y+1)    
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 3; a++)          //Line 2
        {
          if (shipx+b == faller3x+a && shipy+1 == faller3y+2)  
          {
            ShipHit();
          }
        }
      }      
    }
    //Dont need collision detection between line 0 of ship and line 0 and 1 of fallers because they will never touch
    //Collision detection for Faller 4
   if (faller4Exist == true)
    {
      
      for (int a = 0; a < 3; a++)          //Line 2
      {
        if (shipx == faller4x+a && shipy == faller4y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          ShipHit();
        }
      }

      //Collision detection for Faller 4 and ship line 1
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 2; a++)         //Top Line 0
        {
          if (shipx+b == faller4x+a && shipy+1 == faller4y)  
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 3; a++)          //Line 1
        {
          if (shipx+b == faller4x+a && shipy+1 == faller4y+1)    
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 3; a++)          //Line 2
        {
          if (shipx+b == faller4x+a && shipy+1 == faller4y+2)  
          {
            ShipHit();
          }
        }
      }      
    }
    //Dont need collision detection between line 0 of ship and lines 0 and 1 of  risers because they'll never touch
    //Collision detection for Riser 1
    if (riser1Exist == true)
    {
     
      for (int a = 0; a < 1; a++)         //Line 2
      {      
        if (shipx == riser1x+a && shipy == riser1y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
           ShipHit();
        }
      }

      //Collision detection for Riser 1 and Ship line 1
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 3; a++)          //Top Line 0
        {
          if (shipx+b == riser1x+a && shipy+1 == riser1y)   
          {
            ShipHit();
          }
        }      
        for (int a = 0; a < 2; a++)          //Line 1
        {
          if (shipx+b == riser1x+0 && shipy+1 == riser1y+1)   
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 1; a++)         //Line 2
        {      
          if (shipx+b == riser1x+a && shipy+1 == riser1y+2)   
          {
            ShipHit();
          }
        }
      }      
    }      
    
   //Dont need collision detection between line 0 of ship and lines 0 and 1 of  risers because they'll never touch
   //Collision detection for Riser 2
   if (riser2Exist == true)
    {
      
      for (int a = 0; a < 1; a++)         //Line 2
      {      
        if (shipx == riser2x+a && shipy == riser2y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          ShipHit();
        }
      }

      //Collision detection for Riser 2 and Ship line 1
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 3; a++)          //Top Line 0
        {
          if (shipx+b == riser2x+a && shipy+1 == riser2y)   
          {
            ShipHit();
          }
        }      
        for (int a = 0; a < 2; a++)          //Line 1
        {
          if (shipx+b == riser2x+0 && shipy+1 == riser2y+1)   
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 1; a++)         //Line 2
        {      
          if (shipx+b == riser2x+a && shipy+1 == riser2y+2)   
          {
            ShipHit();
          }
        }
      }      
    }      
//Dont need collision detection between line 0 of ship and lines 0 and 1 of  risers because they'll never touch
      //Collision detection for Riser 3
    if (riser3Exist == true)
    {
      
      for (int a = 0; a < 1; a++)         //Line 2
      {      
        if (shipx == riser3x+a && shipy == riser3y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          ShipHit();
        }
      }

      //Collision detection for Riser 3 and Ship line 1
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 3; a++)          //Top Line 0
        {
          if (shipx+b == riser3x+a && shipy+1 == riser3y)   
          {
            ShipHit();
          }
        }      
        for (int a = 0; a < 2; a++)          //Line 1
        {
          if (shipx+b == riser3x+0 && shipy+1 == riser3y+1)   
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 1; a++)         //Line 2
        {      
          if (shipx+b == riser3x+a && shipy+1 == riser3y+2)   
          {
            ShipHit();
          }
        }
      }      
    }  
    //Dont need collision detection between line 0 of ship and lines 0 and 1 of  risers because they'll never touch    
      //Collision detection for Riser 4
    if (riser4Exist == true)
    {
      
      for (int a = 0; a < 1; a++)         //Line 2
      {      
        if (shipx == riser4x+a && shipy == riser4y+2)   //Checks to see if laser coords match bouncer bitmap coords, including the pixels just behind them.
        {
          ShipHit();
        }
      }

       //Collision detection for Riser 4 and Ship line 1
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 3; a++)          //Top Line 0
        {
          if (shipx+b == riser4x+a && shipy+1 == riser4y)   
          {
            ShipHit();
          }
        }      
        for (int a = 0; a < 2; a++)          //Line 1
        {
          if (shipx+b == riser4x+0 && shipy+1 == riser4y+1)   
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 1; a++)         //Line 2
        {      
          if (shipx+b == riser4x+a && shipy+1 == riser4y+2)   
          {
            ShipHit();
          }
        }
      }      
    }

    //No collision detection for line 0 of ship and boss because they'll never touch anyway.
    //Collision detection for Boss abd Ship line 1
    if (boss1Exist == true)
    {
      for (int b = 0; b < 1; b++)
      {
        for (int a = 3; a < 5; a++ )       //Top line 0
        {
          if (shipx+b == bossx+a && shipy+1 == bossy)
          {
            ShipHit();
          }
        }
        for (int a = 2; a < 5; a++)         //Line 1
        {
          if (shipx+b == bossx+a && shipy+1 == bossy+1)
          {
            ShipHit();
          }
        }
        for (int a = 1; a < 6; a++)          //Line 2
        {
          if (shipx+b == bossx+a && shipy+1 == bossy+2)
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 7; a++)          //Line 3
        {
          if (shipx+b == bossx+a && shipy+1 == bossy+3)
          {
            ShipHit();
          }
        }
        for (int a = 2; a < 6; a++)           //Line 4
        {
          if (shipx+b == bossx+a && shipy+1 == bossy+4)
          {
            ShipHit();
          }
        }
        for (int a = 0; a < 7; a++)           //Line 5
        {
          if (shipx+b == bossx+a && shipy+1 == bossy+5)
          {
            ShipHit();
          }
        }
        for (int a = 1; a < 6; a++)            //Line 6
        {
          if (shipx+b == bossx+a && shipy+1 == bossy+6)
          {
            ShipHit();
          }
        }        
        for (int a = 2; a < 5; a++)            //Line 7
        {
          if (shipx+b == bossx+a && shipy+1 == bossy+7)
          {
            ShipHit();
          }
        }
      }     
    }
    
    //Collision detection for UFO Lasers. They only have line 0
    if (ufoLasExist1 == true)
    {
      
      for (int a = 0; a < 1; a++)
      {
          if (shipx == ufoLas1x+a && shipy == ufoLas1y) ///Line 0
        {
          ShipHit();
        }
      }
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 1; a++)
        {
            if (shipx+b == ufoLas1x+a && shipy+1 == ufoLas1y) ///Line 1
          {
            ShipHit();
          }
        }
      }            
    }
    //Collision detection for UFO Lasers. They only have line 0
    if (ufoLasExist2 == true)
    {
      
      for (int a = 0; a < 1; a++)
      {
          if (shipx == ufoLas2x+a && shipy == ufoLas2y) ///Line 0
        {
          ShipHit();
        }
      }
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 1; a++)
        {
            if (shipx+b == ufoLas2x+a && shipy+1 == ufoLas2y) ///Line 1
          {
            ShipHit();
          }
        }
      }            
    } 
    //Collision detection for UFO Lasers. They only have line 0
    if (ufoLasExist3 == true)
    {
      
      for (int a = 0; a < 1; a++)
      {
          if (shipx == ufoLas3x+a && shipy == ufoLas3y) ///Line 0
        {
          ShipHit();
        }
      }
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 1; a++)
        {
            if (shipx+b == ufoLas3x+a && shipy+1 == ufoLas3y) ///Line 1
          {
            ShipHit();
          }
        }
      }            
    }
    //Collision detection for UFO Lasers. They only have line 0
    if (ufoLasExist4 == true)
    {
      
      for (int a = 0; a < 1; a++)
      {
          if (shipx == ufoLas4x+a && shipy == ufoLas4y) ///Line 0
        {
          ShipHit();
        }
      }
      for (int b = 0; b < 1; b++)
      {
        for (int a = 0; a < 1; a++)
        {
            if (shipx+b == ufoLas4x+a && shipy+1 == ufoLas4y) ///Line 1
          {
            ShipHit();
          }
        }
      }            
    }
  }
}
void GameOver(int gameStatus)
{
  spawnEnabled = false;   
  if (gameStatus == 0)   //Game over due to death
  {
    tape = "Game Over :( Your score was ";
    tape += score;
   // Ticker(true);
    tape = "UFO ATTACK!   - Press fire to start ";
    lives = 5;
    score = 0;
    levelNumber = 1;
  }
  else if (gameStatus == 1)//Game over due to winning level 10
  {
    tape = "Congratulations! You defeated the alien invasion :) Your total score was ";
    tape += score;
    //Ticker(true);
    lives = 5;
    score = 0;
    levelNumber = 1;
  }
  else if (gameStatus == 2)//Life lost
  {
    tape = "Ship destroyed!  ";
    tape += "Lives left: ";
    tape += lives;   
  }
  

  ufo1Exist = false;
  ufo2Exist = false;
  ufo3Exist = false;
  bouncer1Exist = false;
  bouncer2Exist = false;
  bouncer3Exist = false;
  bouncer4Exist = false;
  faller1Exist = false;
  faller2Exist = false;
  faller3Exist = false;
  faller4Exist = false;
  riser1Exist = false;
  riser2Exist = false;
  riser3Exist = false;
  riser4Exist = false;
  ltExist = false;
  boss1Exist = false;
  gameStart = false;
  ufoLasExist1 = false;
  ufoLasExist2 = false;
  ufoLasExist3 = false;
  ufoLasExist4 = false;
  ufoLas1x = 34;
  ufoLas1y = 34;
  ufoLas2x = 34;
  ufoLas2y = 34;
  ufoLas3x = 34;
  ufoLas3y = 34;
  ufoLas4x = 34;
  ufoLas4y = 34;
  ufo1x = 34;
  ufo2x = 34;
  ufo3x = 34;
  bouncer1x = 34;
  bouncer2x = 34;
  bouncer3x = 34;
  bouncer4x = 34;
  faller1x = 34;
  faller2x = 34;
  faller3x = 34;
  faller4x = 34;
  riser1x = 34;
  riser2x = 34;
  riser3x = 34;
  riser4x = 34;
  ltx = 34;
  bossx = 34;
  shipx = 0;
  shipy = 3;
  lasExist = false;
  
if (gameStatus == 2)
{
  Ticker(false);
}
else if (gameStatus == 0 || gameStatus == 1)
{
  Ticker(true);
}
}


void ShipHit()
{  
  lives--;
  for (int i = 5000; i > 1; i = i-5)
  {
    tone(buzzerPin, i, 1);
    delay(1);
  }
  if (lives > 0)
  {
    GameOver(2);
  }
  else if (lives <= 0)
  {
    GameOver(0);
  }
}

Credits

MrNonesuch
0 projects • 1 follower
Contact

Comments

Please log in or sign up to comment.