Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of el17dg by
game/game.cpp@37:6a2bf4488022, 2019-05-06 (annotated)
- Committer:
 - Noximilien
 - Date:
 - Mon May 06 22:35:51 2019 +0000
 - Revision:
 - 37:6a2bf4488022
 - Parent:
 - 36:207ec7db8648
 - Child:
 - 38:ef3968546d36
 
Have made finishing changes for comments and game. Have added a debug in main.h. Have separate the simplified sprite drawing into sprite.h.
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| Noximilien | 3:10918b0f7a7d | 1 | #include "mbed.h" | 
| Noximilien | 3:10918b0f7a7d | 2 | #include "N5110.h" | 
| Noximilien | 3:10918b0f7a7d | 3 | #include "Gamepad.h" | 
| Noximilien | 33:c623c6d5ed16 | 4 | #include "collision_lib.h" | 
| Noximilien | 3:10918b0f7a7d | 5 | |
| Noximilien | 3:10918b0f7a7d | 6 | #include "models.h" | 
| Noximilien | 4:02c63aaa2df9 | 7 | #include "main.h" | 
| Noximilien | 4:02c63aaa2df9 | 8 | #include "game.h" | 
| Noximilien | 21:0eb394495b8a | 9 | #include "gameobject.h" | 
| Noximilien | 21:0eb394495b8a | 10 | |
| Noximilien | 33:c623c6d5ed16 | 11 | #include "boss.h" | 
| Noximilien | 21:0eb394495b8a | 12 | #include "enemies.h" | 
| Noximilien | 22:4dc3c95f2146 | 13 | #include "constants.h" | 
| Noximilien | 23:240bc00ef25b | 14 | #include "stars.h" | 
| Noximilien | 23:240bc00ef25b | 15 | #include "player.h" | 
| Noximilien | 26:676874c42883 | 16 | #include "hud.h" | 
| Noximilien | 33:c623c6d5ed16 | 17 | #include "gameovermanager.h" | 
| Noximilien | 33:c623c6d5ed16 | 18 | |
| Noximilien | 20:557e84189a57 | 19 | |
| Noximilien | 34:754915ce9de5 | 20 | const int increase_difficulty = 70; | 
| Noximilien | 31:becb8f6bf7b7 | 21 | int GameGlobals::game_score = 0; | 
| Noximilien | 31:becb8f6bf7b7 | 22 | int GameGlobals::score_count_for_difficulty = 0; | 
| Noximilien | 31:becb8f6bf7b7 | 23 | int GameGlobals::player_lifes = 3; | 
| Noximilien | 31:becb8f6bf7b7 | 24 | int GameGlobals::high_score = 0; | 
| Noximilien | 31:becb8f6bf7b7 | 25 | bool GameGlobals::is_shield_on = false; | 
| Noximilien | 34:754915ce9de5 | 26 | int GameGlobals::score_count_for_boss_mode = 0; | 
| Noximilien | 11:cf2ba52e8b7e | 27 | |
| Noximilien | 33:c623c6d5ed16 | 28 | Boss boss; | 
| Noximilien | 21:0eb394495b8a | 29 | Enemies enemies; | 
| Noximilien | 34:754915ce9de5 | 30 | Enemy enemy; | 
| Noximilien | 23:240bc00ef25b | 31 | Stars stars; | 
| Noximilien | 33:c623c6d5ed16 | 32 | Player player; | 
| Noximilien | 33:c623c6d5ed16 | 33 | GameOverManager gameOverManager; | 
| Noximilien | 33:c623c6d5ed16 | 34 | |
| Noximilien | 26:676874c42883 | 35 | Hud hud; | 
| Noximilien | 12:bfe3a3deaac3 | 36 | |
| Noximilien | 33:c623c6d5ed16 | 37 | |
| Noximilien | 33:c623c6d5ed16 | 38 | void Game::updateAndDrawGameplay() { | 
| Noximilien | 33:c623c6d5ed16 | 39 | checkButtonToShoot(); | 
| Noximilien | 33:c623c6d5ed16 | 40 | player.updateAndDraw(); | 
| Noximilien | 33:c623c6d5ed16 | 41 | player.updateAndDrawBlasts(); | 
| Noximilien | 33:c623c6d5ed16 | 42 | stars.updateAndDrawSmallStars(); | 
| Noximilien | 34:754915ce9de5 | 43 | //stars.updateAndDrawMediumStars(); | 
| Noximilien | 33:c623c6d5ed16 | 44 | stars.starsSpawnDelay(); | 
| Noximilien | 33:c623c6d5ed16 | 45 | increaseGameDifficultyAndEnemySpawnDelay(); | 
| Noximilien | 33:c623c6d5ed16 | 46 | hud.displayLifes(); | 
| Noximilien | 33:c623c6d5ed16 | 47 | hud.drawScore(); | 
| Noximilien | 33:c623c6d5ed16 | 48 | collideEnemiesAndBlasts(); | 
| Noximilien | 33:c623c6d5ed16 | 49 | collideEnemiesBlastsAndPlayer(); | 
| Noximilien | 33:c623c6d5ed16 | 50 | collideEnemiesAndPlayer(); | 
| Noximilien | 33:c623c6d5ed16 | 51 | enemies.updateAndDrawEnemies(); | 
| Noximilien | 33:c623c6d5ed16 | 52 | enemies.updateAndDrawEnemyBlasts(); | 
| Noximilien | 34:754915ce9de5 | 53 | boss.updateAndDrawBossBlasts(); | 
| Noximilien | 33:c623c6d5ed16 | 54 | |
| Noximilien | 34:754915ce9de5 | 55 | if (checkForGameOver()) { game_state = GameState_gameover;} | 
| Noximilien | 34:754915ce9de5 | 56 | if (is_boss_active) { game_state = GameState_boss_cutscene;} | 
| Noximilien | 33:c623c6d5ed16 | 57 | } | 
| Noximilien | 33:c623c6d5ed16 | 58 | |
| Noximilien | 33:c623c6d5ed16 | 59 | void Game::updateAndDrawGameover() { | 
| Noximilien | 33:c623c6d5ed16 | 60 | gameOverManager.updateAndDraw(); | 
| Noximilien | 37:6a2bf4488022 | 61 | lcd.normalMode(); | 
| Noximilien | 33:c623c6d5ed16 | 62 | if (gamepad.check_event(gamepad.Y_PRESSED) && !gameOverManager.isPlayingAnimation()) { | 
| Noximilien | 33:c623c6d5ed16 | 63 | gameOverManager.reset(); | 
| Noximilien | 33:c623c6d5ed16 | 64 | game_state = GameState_newgame; | 
| Noximilien | 33:c623c6d5ed16 | 65 | } | 
| Noximilien | 33:c623c6d5ed16 | 66 | } | 
| Noximilien | 33:c623c6d5ed16 | 67 | |
| Noximilien | 33:c623c6d5ed16 | 68 | void Game::updateAndDrawBossCutscene() { | 
| Noximilien | 34:754915ce9de5 | 69 | boss.updateCutscene(); | 
| Noximilien | 34:754915ce9de5 | 70 | enemies.updateAndDrawEnemyBlasts(); | 
| Noximilien | 34:754915ce9de5 | 71 | boss.draw(); | 
| Noximilien | 34:754915ce9de5 | 72 | player.draw(); | 
| Noximilien | 34:754915ce9de5 | 73 | stars.updateAndDrawSmallStars(); | 
| Noximilien | 34:754915ce9de5 | 74 | stars.updateAndDrawMediumStars(); | 
| Noximilien | 34:754915ce9de5 | 75 | if (boss.isFinishedCutscene()) { | 
| Noximilien | 33:c623c6d5ed16 | 76 | game_state = GameState_boss_gameplay; | 
| Noximilien | 34:754915ce9de5 | 77 | boss.resetCutscene(); | 
| Noximilien | 33:c623c6d5ed16 | 78 | } | 
| Noximilien | 33:c623c6d5ed16 | 79 | } | 
| Noximilien | 33:c623c6d5ed16 | 80 | |
| Noximilien | 33:c623c6d5ed16 | 81 | void Game::updateAndDrawBossGameplay() { | 
| Noximilien | 33:c623c6d5ed16 | 82 | checkButtonToShoot(); | 
| Noximilien | 34:754915ce9de5 | 83 | enemies.updateAndDrawEnemyBlasts(); | 
| Noximilien | 33:c623c6d5ed16 | 84 | player.updateAndDraw(); | 
| Noximilien | 33:c623c6d5ed16 | 85 | player.updateAndDrawBlasts(); | 
| Noximilien | 33:c623c6d5ed16 | 86 | stars.updateAndDrawSmallStars(); | 
| Noximilien | 33:c623c6d5ed16 | 87 | stars.starsSpawnDelay(); | 
| Noximilien | 33:c623c6d5ed16 | 88 | hud.displayLifes(); | 
| Noximilien | 33:c623c6d5ed16 | 89 | hud.drawScore(); | 
| Noximilien | 33:c623c6d5ed16 | 90 | boss.updateAndDrawBossBlasts(); | 
| Noximilien | 33:c623c6d5ed16 | 91 | collideBossAndPlayerBlasts(); | 
| Noximilien | 34:754915ce9de5 | 92 | collideBossBlastsAndPlayer(); | 
| Noximilien | 34:754915ce9de5 | 93 | is_boss_active = boss.updateAndDrawBoss(); | 
| Noximilien | 34:754915ce9de5 | 94 | if (checkForGameOver()) { game_state = GameState_gameover;} | 
| Noximilien | 34:754915ce9de5 | 95 | if (!is_boss_active) { game_state = GameState_gameplay;} | 
| Noximilien | 33:c623c6d5ed16 | 96 | } | 
| Noximilien | 33:c623c6d5ed16 | 97 | |
| Noximilien | 30:d454d0cb72bc | 98 | /** | 
| Noximilien | 33:c623c6d5ed16 | 99 | * This is the main function of game.cpp, where the actual gameplay happens. | 
| Noximilien | 33:c623c6d5ed16 | 100 | * Here all other functions are activeated, and when the player dies, it | 
| Noximilien | 33:c623c6d5ed16 | 101 | * returns back to main menu "main.cpp". | 
| Noximilien | 33:c623c6d5ed16 | 102 | */ | 
| Noximilien | 29:579e00b7f118 | 103 | bool Game::updateAndDraw() { | 
| Noximilien | 33:c623c6d5ed16 | 104 | if (game_state == GameState_newgame) { | 
| Noximilien | 37:6a2bf4488022 | 105 | DG_PRINTF("start game \n"); | 
| Noximilien | 29:579e00b7f118 | 106 | startNewGame(); | 
| Noximilien | 29:579e00b7f118 | 107 | } | 
| Noximilien | 33:c623c6d5ed16 | 108 | if (game_state == GameState_gameplay) { updateAndDrawGameplay(); } | 
| Noximilien | 33:c623c6d5ed16 | 109 | else if (game_state == GameState_boss_cutscene) { updateAndDrawBossCutscene(); } | 
| Noximilien | 33:c623c6d5ed16 | 110 | else if (game_state == GameState_boss_gameplay) { updateAndDrawBossGameplay(); } | 
| Noximilien | 33:c623c6d5ed16 | 111 | else if (game_state == GameState_gameover) { updateAndDrawGameover(); } | 
| Noximilien | 33:c623c6d5ed16 | 112 | |
| Noximilien | 33:c623c6d5ed16 | 113 | return checkIfNeedsToReturnToMenu(); | 
| Noximilien | 33:c623c6d5ed16 | 114 | } | 
| Noximilien | 33:c623c6d5ed16 | 115 | |
| Noximilien | 33:c623c6d5ed16 | 116 | void Game::checkButtonToShoot(){ | 
| Noximilien | 31:becb8f6bf7b7 | 117 | if (gamepad.check_event(gamepad.X_PRESSED) && !GameGlobals::is_shield_on){ | 
| Noximilien | 29:579e00b7f118 | 118 | // Checking the button second time to prevent double blast. | 
| Noximilien | 29:579e00b7f118 | 119 | gamepad.check_event(gamepad.X_PRESSED); | 
| Noximilien | 33:c623c6d5ed16 | 120 | player.fireNewBlast(); | 
| Noximilien | 29:579e00b7f118 | 121 | gamepad.tone(200,0.1); | 
| Noximilien | 29:579e00b7f118 | 122 | } | 
| Noximilien | 29:579e00b7f118 | 123 | } | 
| Noximilien | 29:579e00b7f118 | 124 | |
| Noximilien | 30:d454d0cb72bc | 125 | /** | 
| Noximilien | 22:4dc3c95f2146 | 126 | * This function checks whether the requirments for the collision of the two objects, | 
| Noximilien | 22:4dc3c95f2146 | 127 | * are met. When those requirments are met the collision of two objects function will | 
| Noximilien | 22:4dc3c95f2146 | 128 | * be checking wheter the boundaries of the objects colide. If they do, the blast | 
| Noximilien | 22:4dc3c95f2146 | 129 | * becomes inactive, in game score increases and enemy dies. | 
| Noximilien | 22:4dc3c95f2146 | 130 | */ | 
| Noximilien | 21:0eb394495b8a | 131 | void Game::collideEnemiesAndBlasts() { | 
| Noximilien | 34:754915ce9de5 | 132 | for (int i = 0; i < enemies.max_enemies; ++i) { | 
| Noximilien | 33:c623c6d5ed16 | 133 | for (int j = 0; j < player.max_player_blasts; ++j) { | 
| Noximilien | 21:0eb394495b8a | 134 | Enemy& enemy = enemies.enemies[i]; | 
| Noximilien | 33:c623c6d5ed16 | 135 | GameObject& blast = player.blasts[j]; | 
| Noximilien | 21:0eb394495b8a | 136 | if (enemy.active && !enemy.dead && blast.active) { | 
| Noximilien | 37:6a2bf4488022 | 137 | bool collision = circleCollideTwoObjects( | 
| Noximilien | 21:0eb394495b8a | 138 | enemy.pos, enemies.enemy_bounds, | 
| Noximilien | 33:c623c6d5ed16 | 139 | blast.pos, player.blast_bounds | 
| Noximilien | 12:bfe3a3deaac3 | 140 | ); | 
| Noximilien | 12:bfe3a3deaac3 | 141 | if (collision) { | 
| Noximilien | 21:0eb394495b8a | 142 | enemy.die(); | 
| Noximilien | 37:6a2bf4488022 | 143 | DG_PRINTF("enemy got hit and dies \n"); | 
| Noximilien | 31:becb8f6bf7b7 | 144 | GameGlobals::game_score += 30; | 
| Noximilien | 31:becb8f6bf7b7 | 145 | GameGlobals::score_count_for_difficulty +=30; | 
| Noximilien | 34:754915ce9de5 | 146 | GameGlobals::score_count_for_boss_mode += 30; | 
| Noximilien | 21:0eb394495b8a | 147 | blast.active = false; | 
| Noximilien | 12:bfe3a3deaac3 | 148 | } | 
| Noximilien | 12:bfe3a3deaac3 | 149 | } | 
| Noximilien | 12:bfe3a3deaac3 | 150 | } | 
| Noximilien | 12:bfe3a3deaac3 | 151 | } | 
| Noximilien | 12:bfe3a3deaac3 | 152 | } | 
| Noximilien | 5:2b9181bc5c89 | 153 | |
| Noximilien | 30:d454d0cb72bc | 154 | /** | 
| Noximilien | 23:240bc00ef25b | 155 | * This code does the same work as the one before but with two other objects. | 
| Noximilien | 22:4dc3c95f2146 | 156 | * It checks whether the requirments for the collision of the two objects, | 
| Noximilien | 22:4dc3c95f2146 | 157 | * are met. When those requirments are met the collision of two objects function will | 
| Noximilien | 22:4dc3c95f2146 | 158 | * be checking wheter the boundaries of the objects colide. If they do, the blast | 
| Noximilien | 22:4dc3c95f2146 | 159 | * becomes inactive, in game score increases and enemy dies. | 
| Noximilien | 22:4dc3c95f2146 | 160 | */ | 
| Noximilien | 21:0eb394495b8a | 161 | void Game::collideEnemiesBlastsAndPlayer() { | 
| Noximilien | 34:754915ce9de5 | 162 | for (int i = 0; i < enemies.max_enemies; ++i) { | 
| Noximilien | 21:0eb394495b8a | 163 | GameObject& blast = enemies.enemy_blasts[i]; | 
| Noximilien | 21:0eb394495b8a | 164 | if (blast.active) { | 
| Noximilien | 37:6a2bf4488022 | 165 | bool collision = circleCollideTwoObjects( | 
| Noximilien | 33:c623c6d5ed16 | 166 | player.pos, player.player_bounds, | 
| Noximilien | 21:0eb394495b8a | 167 | blast.pos, enemies.enemy_blast_bounds | 
| Noximilien | 21:0eb394495b8a | 168 | ); | 
| Noximilien | 21:0eb394495b8a | 169 | if (collision) { | 
| Noximilien | 31:becb8f6bf7b7 | 170 | if (!GameGlobals::is_shield_on){ | 
| Noximilien | 30:d454d0cb72bc | 171 | gamepad.tone(423,0.4); | 
| Noximilien | 31:becb8f6bf7b7 | 172 | GameGlobals::player_lifes -= 1; | 
| Noximilien | 37:6a2bf4488022 | 173 | DG_PRINTF("lost a life from blast. left: %i \n", GameGlobals::player_lifes); | 
| Noximilien | 30:d454d0cb72bc | 174 | blast.active = false; | 
| Noximilien | 30:d454d0cb72bc | 175 | }else{ | 
| Noximilien | 30:d454d0cb72bc | 176 | blast.active = false; | 
| Noximilien | 30:d454d0cb72bc | 177 | gamepad.tone(700,0.6); | 
| Noximilien | 30:d454d0cb72bc | 178 | } | 
| Noximilien | 18:6becc9f9de5e | 179 | } | 
| Noximilien | 18:6becc9f9de5e | 180 | } | 
| Noximilien | 18:6becc9f9de5e | 181 | } | 
| Noximilien | 18:6becc9f9de5e | 182 | } | 
| Noximilien | 26:676874c42883 | 183 | |
| Noximilien | 30:d454d0cb72bc | 184 | /** | 
| Noximilien | 23:240bc00ef25b | 185 | * This code does the same work as the one before but with two other object. | 
| Noximilien | 23:240bc00ef25b | 186 | * of enemy ship and the player's ship | 
| Noximilien | 22:4dc3c95f2146 | 187 | */ | 
| Noximilien | 23:240bc00ef25b | 188 | void Game::collideEnemiesAndPlayer() { | 
| Noximilien | 34:754915ce9de5 | 189 | for (int i = 0; i < enemies.max_enemies; ++i) { | 
| Noximilien | 23:240bc00ef25b | 190 | Enemy& enemy = enemies.enemies[i]; | 
| Noximilien | 23:240bc00ef25b | 191 | if (enemy.active && !enemy.dead) { | 
| Noximilien | 37:6a2bf4488022 | 192 | bool collision = circleCollideTwoObjects( | 
| Noximilien | 33:c623c6d5ed16 | 193 | player.pos, player.player_bounds, | 
| Noximilien | 23:240bc00ef25b | 194 | enemy.pos, enemies.enemy_bounds | 
| Noximilien | 23:240bc00ef25b | 195 | ); | 
| Noximilien | 23:240bc00ef25b | 196 | if (collision) { | 
| Noximilien | 31:becb8f6bf7b7 | 197 | GameGlobals::player_lifes -= 1; | 
| Noximilien | 36:207ec7db8648 | 198 | |
| Noximilien | 23:240bc00ef25b | 199 | enemy.die(); | 
| Noximilien | 37:6a2bf4488022 | 200 | DG_PRINTF("enemy got hit from collsion and dies"); | 
| Noximilien | 37:6a2bf4488022 | 201 | DG_PRINTF("lost a life from enemy col. left: %i \n", GameGlobals::player_lifes); | 
| Noximilien | 33:c623c6d5ed16 | 202 | } | 
| Noximilien | 33:c623c6d5ed16 | 203 | } | 
| Noximilien | 33:c623c6d5ed16 | 204 | } | 
| Noximilien | 33:c623c6d5ed16 | 205 | } | 
| Noximilien | 33:c623c6d5ed16 | 206 | |
| Noximilien | 33:c623c6d5ed16 | 207 | void Game::collideBossAndPlayerBlasts() { | 
| Noximilien | 33:c623c6d5ed16 | 208 | for (int i = 0; i < player.max_player_blasts; ++i) { | 
| Noximilien | 33:c623c6d5ed16 | 209 | GameObject& blast = player.blasts[i]; | 
| Noximilien | 33:c623c6d5ed16 | 210 | if (blast.active) { | 
| Noximilien | 37:6a2bf4488022 | 211 | bool collision = circleCollideTwoObjects( | 
| Noximilien | 33:c623c6d5ed16 | 212 | boss.pos, boss.boss_bounds, | 
| Noximilien | 33:c623c6d5ed16 | 213 | blast.pos, player.blast_bounds | 
| Noximilien | 33:c623c6d5ed16 | 214 | ); | 
| Noximilien | 33:c623c6d5ed16 | 215 | if (collision) { | 
| Noximilien | 34:754915ce9de5 | 216 | boss.boss_lives -= 1; | 
| Noximilien | 33:c623c6d5ed16 | 217 | gamepad.tone(123,0.4); | 
| Noximilien | 33:c623c6d5ed16 | 218 | blast.active = false; | 
| Noximilien | 37:6a2bf4488022 | 219 | DG_PRINTF("boss has. left: %i \n", boss.boss_lives); | 
| Noximilien | 34:754915ce9de5 | 220 | } | 
| Noximilien | 34:754915ce9de5 | 221 | } | 
| Noximilien | 34:754915ce9de5 | 222 | } | 
| Noximilien | 34:754915ce9de5 | 223 | } | 
| Noximilien | 34:754915ce9de5 | 224 | |
| Noximilien | 34:754915ce9de5 | 225 | void Game::collideBossBlastsAndPlayer() { | 
| Noximilien | 34:754915ce9de5 | 226 | for (int i = 0; i < boss.max_boss_blasts; ++i) { | 
| Noximilien | 34:754915ce9de5 | 227 | GameObject& blast = boss.boss_blasts[i]; | 
| Noximilien | 34:754915ce9de5 | 228 | if (blast.active) { | 
| Noximilien | 37:6a2bf4488022 | 229 | bool collision = circleCollideTwoObjects( | 
| Noximilien | 34:754915ce9de5 | 230 | player.pos, player.player_bounds, | 
| Noximilien | 34:754915ce9de5 | 231 | blast.pos, boss.boss_blast_bounds | 
| Noximilien | 34:754915ce9de5 | 232 | ); | 
| Noximilien | 37:6a2bf4488022 | 233 | DG_PRINTF("player pos:%i,%i; offset:%i,%i; radius:%f.3; \n", player.pos.x, player.pos.y, player.player_bounds.center.x, player.player_bounds.center.y, player.player_bounds.radius); | 
| Noximilien | 37:6a2bf4488022 | 234 | DG_PRINTF("blas pos:%i,%i; offset:%i,%i; radius:%f.3; \n", blast.pos.x, blast.pos.y, boss.boss_blast_bounds.center.x, boss.boss_blast_bounds.center.y, boss.boss_blast_bounds.radius); | 
| Noximilien | 34:754915ce9de5 | 235 | if (collision) { | 
| Noximilien | 34:754915ce9de5 | 236 | if (!GameGlobals::is_shield_on){ | 
| Noximilien | 34:754915ce9de5 | 237 | |
| Noximilien | 34:754915ce9de5 | 238 | gamepad.tone(423,0.4); | 
| Noximilien | 34:754915ce9de5 | 239 | GameGlobals::player_lifes -= 1; | 
| Noximilien | 34:754915ce9de5 | 240 | blast.active = false; | 
| Noximilien | 37:6a2bf4488022 | 241 | DG_PRINTF("collision happened;\n"); | 
| Noximilien | 37:6a2bf4488022 | 242 | DG_PRINTF("lost a life from blast. left: %i \n", GameGlobals::player_lifes); | 
| Noximilien | 34:754915ce9de5 | 243 | }else{ | 
| Noximilien | 34:754915ce9de5 | 244 | blast.active = false; | 
| Noximilien | 34:754915ce9de5 | 245 | gamepad.tone(700,0.6); | 
| Noximilien | 34:754915ce9de5 | 246 | } | 
| Noximilien | 23:240bc00ef25b | 247 | } | 
| Noximilien | 23:240bc00ef25b | 248 | } | 
| Noximilien | 23:240bc00ef25b | 249 | } | 
| Noximilien | 13:5c3dc6e827c2 | 250 | } | 
| Noximilien | 13:5c3dc6e827c2 | 251 | |
| Noximilien | 30:d454d0cb72bc | 252 | /** | 
| Noximilien | 26:676874c42883 | 253 | * This function resets all the values to their intial states when the game is | 
| Noximilien | 26:676874c42883 | 254 | * first began when the player dies and wants to restart the game. | 
| Noximilien | 23:240bc00ef25b | 255 | * It does not reset the values when the game is paused. | 
| Noximilien | 23:240bc00ef25b | 256 | */ | 
| Noximilien | 21:0eb394495b8a | 257 | void Game::startNewGame() { | 
| Noximilien | 34:754915ce9de5 | 258 | is_boss_active = false; | 
| Noximilien | 37:6a2bf4488022 | 259 | //game_state = GameState_gameplay; | 
| Noximilien | 37:6a2bf4488022 | 260 | game_state = GameState_boss_cutscene; | 
| Noximilien | 33:c623c6d5ed16 | 261 | player.pos.x = 0; //player was defined in player.h | 
| Noximilien | 33:c623c6d5ed16 | 262 | player.pos.y = 24; | 
| Noximilien | 31:becb8f6bf7b7 | 263 | stars.stars_delay = 0; | 
| Noximilien | 26:676874c42883 | 264 | enemy_ship_delay_max = 40; | 
| Noximilien | 26:676874c42883 | 265 | enemy_ship_delay_counter = enemy_ship_delay_max; | 
| Noximilien | 31:becb8f6bf7b7 | 266 | GameGlobals::is_shield_on = false; | 
| Noximilien | 31:becb8f6bf7b7 | 267 | GameGlobals::game_score = 0; | 
| Noximilien | 31:becb8f6bf7b7 | 268 | GameGlobals::score_count_for_difficulty = 0; | 
| Noximilien | 31:becb8f6bf7b7 | 269 | GameGlobals::player_lifes = 3; | 
| Noximilien | 34:754915ce9de5 | 270 | GameGlobals::score_count_for_boss_mode = 0; | 
| Noximilien | 31:becb8f6bf7b7 | 271 | hud.resetRedLed(); | 
| Noximilien | 34:754915ce9de5 | 272 | enemies.enemy_blast_speed = 3; | 
| Noximilien | 34:754915ce9de5 | 273 | enemy.enemy_speed = 1; | 
| Noximilien | 37:6a2bf4488022 | 274 | |
| Noximilien | 34:754915ce9de5 | 275 | for (int i = 0; i < enemies.max_enemies; ++i) { | 
| Noximilien | 21:0eb394495b8a | 276 | enemies.enemies[i].active = false; | 
| Noximilien | 13:5c3dc6e827c2 | 277 | } | 
| Noximilien | 33:c623c6d5ed16 | 278 | for (int i = 0; i < player.max_player_blasts; ++i) { | 
| Noximilien | 33:c623c6d5ed16 | 279 | player.blasts[i].active = false; | 
| Noximilien | 13:5c3dc6e827c2 | 280 | } | 
| Noximilien | 34:754915ce9de5 | 281 | for (int i = 0; i < enemies.max_enemy_blasts; ++i) { | 
| Noximilien | 21:0eb394495b8a | 282 | enemies.enemy_blasts[i].active = false; | 
| Noximilien | 13:5c3dc6e827c2 | 283 | } | 
| Noximilien | 34:754915ce9de5 | 284 | for (int i = 0; i < boss.max_boss_blasts; ++i) { | 
| Noximilien | 34:754915ce9de5 | 285 | boss.boss_blasts[i].active = false; | 
| Noximilien | 34:754915ce9de5 | 286 | } | 
| Noximilien | 36:207ec7db8648 | 287 | gamepad.check_event(gamepad.START_PRESSED); | 
| Noximilien | 13:5c3dc6e827c2 | 288 | } | 
| Noximilien | 13:5c3dc6e827c2 | 289 | |
| Noximilien | 30:d454d0cb72bc | 290 | /** | 
| Noximilien | 26:676874c42883 | 291 | * A function tbat delays enemy spawn on low game score. | 
| Noximilien | 26:676874c42883 | 292 | * It decreases the enemy spawn delay as in game score increases. | 
| Noximilien | 29:579e00b7f118 | 293 | * The enemy spawn delay is located in game.cpp because the game difficulty | 
| Noximilien | 29:579e00b7f118 | 294 | * depends on the on how fast enemy appears. | 
| Noximilien | 26:676874c42883 | 295 | */ | 
| Noximilien | 26:676874c42883 | 296 | void Game::increaseGameDifficultyAndEnemySpawnDelay(){ | 
| Noximilien | 26:676874c42883 | 297 | if (enemy_ship_delay_counter <= 0){ | 
| Noximilien | 26:676874c42883 | 298 | enemies.spawnNewEnemy(); | 
| Noximilien | 26:676874c42883 | 299 | enemy_ship_delay_counter = enemy_ship_delay_max; | 
| Noximilien | 26:676874c42883 | 300 | } | 
| Noximilien | 26:676874c42883 | 301 | else { enemy_ship_delay_counter -= 1;} | 
| Noximilien | 26:676874c42883 | 302 | |
| Noximilien | 31:becb8f6bf7b7 | 303 | if (enemy_ship_delay_max >= 4 && GameGlobals::score_count_for_difficulty >= increase_difficulty){ | 
| Noximilien | 29:579e00b7f118 | 304 | //decrease enemy delay spawn. | 
| Noximilien | 26:676874c42883 | 305 | enemy_ship_delay_max -= 3; | 
| Noximilien | 26:676874c42883 | 306 | if (enemy_ship_delay_max <= 20 && enemy_ship_delay_max >= 15){ | 
| Noximilien | 34:754915ce9de5 | 307 | enemies.enemy_blast_speed += 1; | 
| Noximilien | 34:754915ce9de5 | 308 | enemy.enemy_speed += 1; | 
| Noximilien | 26:676874c42883 | 309 | } | 
| Noximilien | 31:becb8f6bf7b7 | 310 | GameGlobals::score_count_for_difficulty = 0; | 
| Noximilien | 26:676874c42883 | 311 | } | 
| Noximilien | 34:754915ce9de5 | 312 | if (GameGlobals::score_count_for_boss_mode >= 400){ | 
| Noximilien | 34:754915ce9de5 | 313 | is_boss_active = true; | 
| Noximilien | 31:becb8f6bf7b7 | 314 | lcd.inverseMode(); | 
| Noximilien | 31:becb8f6bf7b7 | 315 | } | 
| Noximilien | 26:676874c42883 | 316 | } | 
| Noximilien | 26:676874c42883 | 317 | |
| Noximilien | 30:d454d0cb72bc | 318 | bool Game::forceShildActivate(){ | 
| Noximilien | 30:d454d0cb72bc | 319 | if (gamepad.check_event(gamepad.R_PRESSED)){ | 
| Noximilien | 31:becb8f6bf7b7 | 320 | GameGlobals::is_shield_on = !GameGlobals::is_shield_on; | 
| Noximilien | 30:d454d0cb72bc | 321 | } | 
| Noximilien | 31:becb8f6bf7b7 | 322 | return GameGlobals::is_shield_on; | 
| Noximilien | 30:d454d0cb72bc | 323 | } | 
| Noximilien | 30:d454d0cb72bc | 324 | |
| Noximilien | 30:d454d0cb72bc | 325 | /** | 
| Noximilien | 27:f05f4e738ba9 | 326 | * This is a single line function to set the player lifes to 0 when the. | 
| Noximilien | 27:f05f4e738ba9 | 327 | * game is over. | 
| Noximilien | 27:f05f4e738ba9 | 328 | */ | 
| Noximilien | 27:f05f4e738ba9 | 329 | bool Game::checkForGameOver() { | 
| Noximilien | 34:754915ce9de5 | 330 | return GameGlobals::player_lifes <= 0; | 
| Noximilien | 28:35af3843de8f | 331 | } | 
| Noximilien | 29:579e00b7f118 | 332 | |
| Noximilien | 30:d454d0cb72bc | 333 | /** This small statment checks whether the pause button was pressed or not. | 
| Noximilien | 30:d454d0cb72bc | 334 | * If it was pressed, then the game will go back to main menu and will save | 
| Noximilien | 30:d454d0cb72bc | 335 | * the current status of the object until the game is continued. | 
| Noximilien | 30:d454d0cb72bc | 336 | */ | 
| Noximilien | 33:c623c6d5ed16 | 337 | bool Game::checkIfNeedsToReturnToMenu(){ | 
| Noximilien | 30:d454d0cb72bc | 338 | bool want_to_pause = false; | 
| Noximilien | 33:c623c6d5ed16 | 339 | |
| Noximilien | 30:d454d0cb72bc | 340 | if (gamepad.check_event(gamepad.START_PRESSED)){ | 
| Noximilien | 37:6a2bf4488022 | 341 | DG_PRINTF("game paused\n"); | 
| Noximilien | 30:d454d0cb72bc | 342 | gamepad.check_event(gamepad.START_PRESSED); | 
| Noximilien | 30:d454d0cb72bc | 343 | want_to_pause = true; | 
| Noximilien | 30:d454d0cb72bc | 344 | } | 
| Noximilien | 30:d454d0cb72bc | 345 | return want_to_pause; | 
| Noximilien | 26:676874c42883 | 346 | } | 
