Musallam Bseiso / Engine
Revision:
12:d68c757d829a
Parent:
11:10c01766f774
Child:
13:f3560c403397
--- a/Engine.cpp	Mon May 01 13:01:57 2017 +0000
+++ b/Engine.cpp	Tue May 02 22:13:10 2017 +0000
@@ -10,7 +10,9 @@
 {
     collisions = 0;
     wave_counter = 0;
+    star = true;
     ammo = 3;
+    pauses = 3;
 }
 
 Engine::~Engine()
@@ -25,12 +27,12 @@
     _speed = speed;
 
     _friendly.init();       // friendly ship initialization
-    _ship1.init(_speed);    // enemy ships initialization
-    _ship2.init(_speed);
-    _ship3.init(_speed);
-    _ship4.init(_speed);
-    _ship5.init(_speed);
-    _ship6.init(_speed);
+    _enemy1.init(_speed);    // enemy ships initialization
+    _enemy2.init(_speed);
+    _enemy3.init(_speed);
+    _enemy4.init(_speed);
+    _enemy5.init(_speed);
+    _enemy6.init(_speed);
 }
 
 void Engine::read_input(Gamepad &pad)
@@ -42,129 +44,146 @@
 
 // ::: DRAWING FUNCTIONS :::
 
-void Engine::draw(N5110 &lcd)
+void Engine::draw_all(N5110 &lcd)
 {
-    _stats.grid_draw(lcd);                  // initial grid and border generation
+    _stats.draw_grid(lcd);                  // initial grid and border generation
     _stats.draw_health(lcd);                // health counter generation (initial state)
     _stats.check_health(lcd, collisions);   // health counter generation (later states)
-    _stats.check_rocket(lcd, ammo);         // rocket and ammo generation
-    _stats.wave_draw(lcd, wave_counter);    // wave counter generation 
+    _stats.check_star(lcd, star);           // star generation
+    _stats.check_rocket(lcd, ammo);         // rocket generation
+    _stats.draw_wave_counter(lcd, wave_counter);    // wave counter generation 
     _friendly.draw(lcd);                    // friendly ship generation
-    ships_draw(lcd);                        // enemy ships generation
+    _enemy1.draw(lcd);
+    _enemy2.draw(lcd);
+    _enemy3.draw(lcd);
+    _enemy4.draw(lcd);
+    _enemy5.draw(lcd);
+    _enemy6.draw(lcd);                        // enemy ships generation
 }
 
-
-// Enemy ships generation:
-
-void Engine::ships_draw(N5110 &lcd)
-{
-    _ship1.draw(lcd);
-    _ship2.draw(lcd);
-    _ship3.draw(lcd);
-    _ship4.draw(lcd);
-    _ship5.draw(lcd);
-    _ship6.draw(lcd);
-}
-
-
 // State change checker:
 
-void Engine::checker(N5110 &lcd, Gamepad &pad)
+void Engine::check_all(N5110 &lcd, Gamepad &pad)
 {
-    check_pass(pad);            // checks if enemy passed screen border and generates another
-    check_death_all(lcd, pad);  // checks for collisions and eventual friendly death
-    level_two(lcd, pad);        // checks if level two has been reached, same for below
-    level_three(lcd, pad);
-    level_four(lcd, pad);
-    level_five(lcd, pad);
+    check_enemy_pass(pad);            // checks if enemy passed screen border and generates another
+    check_death_all(lcd, pad);          // checks for collisions and eventual friendly death
+    check_rocket();             // checks if rockets should be replenished
+    check_star();               // checks if star should be replenished
+    check_level_two(lcd, pad);        // checks if level two has been reached, same for below
+    check_level_three(lcd, pad);
+    check_level_four(lcd, pad);
+    check_level_five(lcd, pad);
+    check_pause(lcd, pad);
+    check_mode_toggle(lcd, pad); 
 }
 
 
 // Dynamic object position/velocity updater:
 
-void Engine::update(N5110 &lcd, Gamepad &pad)
+void Engine::update_all(N5110 &lcd, Gamepad &pad)
 {
     _friendly.update(_d,_mag);
-    _ship1.update();
-    _ship2.update();
-    _ship3.update();
-    _ship4.update();
-    _ship5.update();
-    _ship6.update();
+    _friendly.check_pos();  
+    _enemy1.update();
+    _enemy2.update();
+    _enemy3.update();
+    _enemy4.update();
+    _enemy5.update();
+    _enemy6.update();
 }
 
 
 // Function to enable shooting and eliminating enemy ships:
 
-void Engine::shoot(N5110 &lcd, Gamepad &pad)
+void Engine::shoot_rocket(N5110 &lcd, Gamepad &pad)
 {
     Vector2D friendly_pos = _friendly.get_pos();
-    _x = friendly_pos.x+6;
-    _y = friendly_pos.y+3;
-    _bullet.init(_x, _y);
+    int _x = friendly_pos.x+6;
+    int _y = friendly_pos.y+3;
+    _rocket.init(_x, _y);
     
     if ((pad.check_event(Gamepad::B_PRESSED) == true) &&
         (ammo > 0))
     {    
-        trigger = true;
+        rocket_shot_trigger = true;
     }
     
-    if (trigger == true) 
+    if (rocket_shot_trigger == true) 
     {   
-        _bullet.draw(lcd);
+        _rocket.draw(lcd);
         check_enemy_death(pad);
         pad.tone(1500.0,0.1);
         ammo = ammo - 1;
-        trigger = false;
+        rocket_shot_trigger = false;
+    }
+}
+
+
+void Engine::shoot_star(N5110 &lcd, Gamepad &pad)
+{   
+    if ((pad.check_event(Gamepad::A_PRESSED) == true) &&
+        (star == true))
+    {    
+        _enemy1.init(_speed);
+        _enemy2.init(_speed);
+        _enemy3.init(_speed);
+        _enemy4.init(_speed);
+        _enemy5.init(_speed);
+        _enemy6.init(_speed);
+        wave_counter = wave_counter + 1;
+        pad.tone(2000.0,0.5);
+        star = false;
     }
 }
 
 
-// Checks if (each) enemy ship passed off screen and re-initializes ones that have: (Wave counter associated with ship1)
+// Checks if (each) enemy ship passed off screen and re-initializes ones that have: (Wave counter associated with enemy1)
 
-void Engine::check_pass(Gamepad &pad)
+void Engine::check_enemy_pass(Gamepad &pad)
 {
-    Vector2D ship1_pos = _ship1.get_pos();
+    Vector2D enemy1_pos = _enemy1.get_pos();
     
-    if (ship1_pos.x < 0) 
+    if (enemy1_pos.x < 0) 
     {
-        _ship1.init(_speed);
+        _enemy1.init(_speed);
         wave_counter = wave_counter + 1;
+        rocket_regen_trigger = false;
+        star_regen_trigger = false;
     }
     
-    Vector2D ship2_pos = _ship2.get_pos();
+    Vector2D enemy2_pos = _enemy2.get_pos();
     
-    if (ship2_pos.x < 0) 
+    if (enemy2_pos.x < 0) 
     {
-        _ship2.init(_speed);
+        _enemy2.init(_speed);
     }
     
-    Vector2D ship3_pos = _ship3.get_pos();
+    Vector2D enemy3_pos = _enemy3.get_pos();
     
-    if (ship3_pos.x < 0) 
+    if (enemy3_pos.x < 0) 
     {
-        _ship3.init(_speed);
+        _enemy3.init(_speed);
     }
     
-    Vector2D ship4_pos = _ship4.get_pos();
+    Vector2D enemy4_pos = _enemy4.get_pos();
     
-    if (ship4_pos.x < 0) 
+    if (enemy4_pos.x < 0) 
     {
-        _ship4.init(_speed);
+        _enemy4.init(_speed);
     }
     
-    Vector2D ship5_pos = _ship5.get_pos();
+    Vector2D enemy5_pos = _enemy5.get_pos();
     
-    if (ship5_pos.x < 0) 
+    if (enemy5_pos.x < 0) 
     {
-        _ship5.init(_speed);
+        _enemy5.init(_speed);
     }
     
-    Vector2D ship6_pos = _ship6.get_pos();
+    Vector2D enemy6_pos = _enemy6.get_pos();
     
-    if (ship6_pos.x < 0) 
+    if (enemy6_pos.x < 0) 
     {
-        _ship6.init(_speed);
+        _enemy6.init(_speed);
     }
 }
 
@@ -177,45 +196,45 @@
     
     if (friendly_pos.y < 5) 
     {
-        _ship1.init(_speed);
+        _enemy1.init(_speed);
     } 
     else if ((friendly_pos.y < 11) &&
             (friendly_pos.y > 4))
     {
-        _ship2.init(_speed);
+        _enemy2.init(_speed);
     }
     else if ((friendly_pos.y < 17) &&
             (friendly_pos.y > 10))
     {
-        _ship3.init(_speed);
+        _enemy3.init(_speed);
     }
     else if ((friendly_pos.y < 25) &&
             (friendly_pos.y > 16))
     {
-        _ship4.init(_speed);
+        _enemy4.init(_speed);
     }
     else if ((friendly_pos.y < 31) &&
             (friendly_pos.y > 24))
     {
-        _ship5.init(_speed);
+        _enemy5.init(_speed);
     }
     else
     {
-        _ship6.init(_speed);
+        _enemy6.init(_speed);
     }    
 }
 
 
 // Checks for collisions between friendly and enemy ship: (Associates collisions counter)
 
-void Engine::check_death(Gamepad &pad, Vector2D ship_pos)
+void Engine::check_friendly_death(Gamepad &pad, Vector2D enemy_pos)
 {
     Vector2D friendly_pos = _friendly.get_pos();
     
-    if ((friendly_pos.y >= ship_pos.y-5) && // change 5 to friendly size and 6 to ship size
-        (friendly_pos.y <= ship_pos.y+5) && 
-        (friendly_pos.x+6 >= ship_pos.x) && 
-        (friendly_pos.x+6 <= ship_pos.x+5)) 
+    if ((friendly_pos.y >= enemy_pos.y-5) && // change 5 to friendly size and 6 to ship size
+        (friendly_pos.y <= enemy_pos.y+5) && 
+        (friendly_pos.x+6 >= enemy_pos.x) && 
+        (friendly_pos.x+6 <= enemy_pos.x+5)) 
     {
         pad.tone(800.0,0.1);
         collisions = collisions + 1;
@@ -227,31 +246,76 @@
 
 void Engine::check_death_all(N5110 &lcd, Gamepad &pad)
 {
-    Vector2D ship1_pos = _ship1.get_pos();
-    Vector2D ship2_pos = _ship2.get_pos();
-    Vector2D ship3_pos = _ship3.get_pos();
-    Vector2D ship4_pos = _ship4.get_pos();
-    Vector2D ship5_pos = _ship5.get_pos();
-    Vector2D ship6_pos = _ship6.get_pos();
+    Vector2D enemy1_pos = _enemy1.get_pos();
+    Vector2D enemy2_pos = _enemy2.get_pos();
+    Vector2D enemy3_pos = _enemy3.get_pos();
+    Vector2D enemy4_pos = _enemy4.get_pos();
+    Vector2D enemy5_pos = _enemy5.get_pos();
+    Vector2D enemy6_pos = _enemy6.get_pos();
     
-    check_death(pad, ship1_pos);
-    check_death(pad, ship2_pos);
-    check_death(pad, ship3_pos);
-    check_death(pad, ship4_pos);
-    check_death(pad, ship5_pos);
-    check_death(pad, ship6_pos);
-    game_over(lcd, pad);    // game over sequence, if health subzero
+    check_friendly_death(pad, enemy1_pos);
+    check_friendly_death(pad, enemy2_pos);
+    check_friendly_death(pad, enemy3_pos);
+    check_friendly_death(pad, enemy4_pos);
+    check_friendly_death(pad, enemy5_pos);
+    check_friendly_death(pad, enemy6_pos);
+    check_gameover(lcd, pad);    // game over sequence, if health subzero
 }
 
+// 
+
+void Engine::check_rocket()
+{
+    if ((ammo < 3) &&
+        (rocket_regen_trigger == false)) 
+    {    
+            if ((wave_counter == 5) ||
+                (wave_counter == 10) ||
+                (wave_counter == 15) ||
+                (wave_counter == 20) ||
+                (wave_counter == 25) ||
+                (wave_counter == 30) ||
+                (wave_counter == 40) ||
+                (wave_counter == 50) ||
+                (wave_counter == 75) ||
+                (wave_counter == 100) ||
+                (wave_counter == 150) ||
+                (wave_counter == 200)) 
+            {        
+            ammo = ammo + 1;
+            rocket_regen_trigger = true;    
+            }     
+    }
+}
+
+void Engine::check_star()
+{
+    if ((star == false) &&
+        (star_regen_trigger == false)) 
+    {    
+            if ((wave_counter == 5) ||
+                (wave_counter == 25) ||
+                (wave_counter == 50) ||
+                (wave_counter == 100) ||
+                (wave_counter == 150) ||
+                (wave_counter == 200)) 
+            {        
+            star = true;
+            star_regen_trigger = true;    
+            }     
+    }
+}
+
+
 
 // Level two sequence, occurs if wave 5 is reached:
 
-void Engine::level_two(N5110 &lcd, Gamepad &pad)
+void Engine::check_level_two(N5110 &lcd, Gamepad &pad)
 {
     if (wave_counter == 5) 
     {
         lcd.drawRect(0,0,84,48,FILL_WHITE);
-        lcd.printString("Nice! Level 2",0,1);
+        lcd.printString(" Nice! Level 2",0,1);
         lcd.printString("  Press Back!  ",0,4);
         lcd.refresh();
         wait(1);
@@ -268,12 +332,12 @@
 
 // Level three sequence, occurs if wave 25 is reached:
 
-void Engine::level_three(N5110 &lcd, Gamepad &pad)
+void Engine::check_level_three(N5110 &lcd, Gamepad &pad)
 {
     if (wave_counter == 25) 
     {
         lcd.drawRect(0,0,84,48,FILL_WHITE);
-        lcd.printString("Nice! Level 3",0,1);
+        lcd.printString(" Nice! Level 3",0,1);
         lcd.printString("  Press Back!  ",0,4);
         lcd.refresh();
         wait(1);
@@ -290,12 +354,12 @@
 
 // Level three sequence, occurs if wave 50 is reached:
 
-void Engine::level_four(N5110 &lcd, Gamepad &pad)
+void Engine::check_level_four(N5110 &lcd, Gamepad &pad)
 {
     if (wave_counter == 50) 
     {
         lcd.drawRect(0,0,84,48,FILL_WHITE);
-        lcd.printString("Nice! Level 4",0,1);
+        lcd.printString(" Nice! Level 4",0,1);
         lcd.printString("  Press Back!  ",0,4);
         lcd.refresh();
         wait(1);
@@ -312,12 +376,12 @@
 
 // Level five sequence, occurs if wave 100 is reached:
 
-void Engine::level_five(N5110 &lcd, Gamepad &pad)
+void Engine::check_level_five(N5110 &lcd, Gamepad &pad)
 {
     if (wave_counter == 100) 
     {
         lcd.drawRect(0,0,84,48,FILL_WHITE);
-        lcd.printString("5. Good Luck!",0,1);
+        lcd.printString(" 5. Good Luck!",0,1);
         lcd.printString("  Press Back!  ",0,4);
         lcd.refresh();
         wait(1);
@@ -332,25 +396,62 @@
 }
 
 
+// Pause sequence, checks if the game has been paused/unpaused
+
+void Engine::check_pause(N5110 &lcd, Gamepad &pad)
+{   
+    if ((pad.check_event(Gamepad::START_PRESSED) == true) &&
+        (pauses > 0)) 
+    {       
+        while (pad.check_event(Gamepad::START_PRESSED) == false) {
+            pad.leds_on();
+            lcd.inverseMode();
+            wait(0.5);
+            pad.leds_off();
+            lcd.normalMode();
+            wait(0.5);
+        }
+    pauses = pauses - 1;
+    }
+}
+
+
+void Engine::check_mode_toggle(N5110 &lcd, Gamepad &pad)
+{
+    if (pad.check_event(Gamepad::R_PRESSED) == true) {
+            lcd.normalMode();
+            pad.tone(1000.0,0.2);
+    }
+    
+    if (pad.check_event(Gamepad::L_PRESSED) == true) {
+            lcd.inverseMode();
+            pad.tone(1000.0,0.2);
+    }
+}
+
+
 // Game over sequence, ends game if health is below zero:
 
-void Engine::game_over(N5110 &lcd, Gamepad &pad)
+void Engine::check_gameover(N5110 &lcd, Gamepad &pad)
 {
     if (collisions >= 6) 
     {
         lcd.drawRect(0,0,84,48,FILL_WHITE);
+        char buffer[14];
+        int length = sprintf(buffer,"  Score: %2d",wave_counter);
+        lcd.printString(buffer,0,2);
         lcd.printString("  You Lose! ",0,1);
         lcd.printString("  Press Back! ",0,4);
         lcd.refresh();
         wait(1);
-        
         while (pad.check_event(Gamepad::BACK_PRESSED) == false) {
             wait(0.1);
         }
-        
         init(LEVEL_ONE, lcd, pad);
         collisions = 0;
         wave_counter = 0;
         ammo = 3;
+        pauses = 3;
+        star = true;
     }
 }
\ No newline at end of file