Steven Mahasin / Mbed 2 deprecated DreamDungeon

Dependencies:   mbed MotionSensor

Committer:
el17sm
Date:
Thu May 09 01:57:49 2019 +0000
Revision:
47:6e31b195ce3c
Parent:
46:f09711580d4a
Child:
48:f7d9ae3e554d
Full Game Complete;; Added scoring system;; ; To do: ; Commenting and Doxygen;; Shortening of a few functions;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17sm 0:8e92b66a0755 1 /*
el17sm 0:8e92b66a0755 2 ELEC2645 Embedded Systems Project
el17sm 0:8e92b66a0755 3 School of Electronic & Electrical Engineering
el17sm 0:8e92b66a0755 4 University of Leeds
el17sm 0:8e92b66a0755 5 Name: Steven Mahasin
el17sm 0:8e92b66a0755 6 Username: el17sm
el17sm 0:8e92b66a0755 7 Student ID Number: 201192939
el17sm 0:8e92b66a0755 8 Date: 11/04/2019
el17sm 1:1fa7ecca8dfb 9 */
el17sm 46:f09711580d4a 10 #include "main.h"
el17sm 10:1a3499f6b583 11
el17sm 1:1fa7ecca8dfb 12 int main()
el17sm 1:1fa7ecca8dfb 13 {
el17sm 29:6b8411bb040a 14 // Initialize
el17sm 46:f09711580d4a 15 init();
el17sm 28:98848e6a77a2 16
el17sm 29:6b8411bb040a 17 while(1) { // Gameloop
el17sm 46:f09711580d4a 18 boss_room_exist = false;
el17sm 47:6e31b195ce3c 19 number_of_enemies_killed = 0;
el17sm 47:6e31b195ce3c 20 total_time = 0;
el17sm 47:6e31b195ce3c 21
el17sm 32:fe6359ef9916 22 title.main(lcd, gamepad, global_contrast);
el17sm 32:fe6359ef9916 23 srand(title.get_seed());
el17sm 31:ab24d028ddfd 24 player = new Player(39, 27);
el17sm 41:0697508a28ba 25 room_engine = new RoomEngine(global_contrast);
el17sm 31:ab24d028ddfd 26
el17sm 31:ab24d028ddfd 27 game_loop();
el17sm 31:ab24d028ddfd 28 game_over();
el17sm 46:f09711580d4a 29 for (int i = 0; i < MAX_ROOMS_MAP_X; i++) {
el17sm 46:f09711580d4a 30 for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) {
el17sm 46:f09711580d4a 31 if (valid_rooms[j][j]){
el17sm 40:cbcbf6fc1421 32 delete rooms[j][i];
el17sm 46:f09711580d4a 33 valid_rooms[i][j] = false;
el17sm 40:cbcbf6fc1421 34 }
el17sm 40:cbcbf6fc1421 35 }
el17sm 46:f09711580d4a 36 }
el17sm 31:ab24d028ddfd 37 delete room_engine;
el17sm 31:ab24d028ddfd 38 delete player;
el17sm 31:ab24d028ddfd 39 }
el17sm 31:ab24d028ddfd 40 }
el17sm 31:ab24d028ddfd 41
el17sm 46:f09711580d4a 42 void init()
el17sm 46:f09711580d4a 43 {
el17sm 46:f09711580d4a 44 lcd.init();
el17sm 46:f09711580d4a 45 lcd.setContrast(global_contrast);
el17sm 46:f09711580d4a 46 gamepad.init();
el17sm 46:f09711580d4a 47 for (int j = 0; j < MAX_ROOMS_MAP_Y; j++){
el17sm 46:f09711580d4a 48 for (int i = 0; i < MAX_ROOMS_MAP_X; i++){
el17sm 46:f09711580d4a 49 valid_rooms[j][i] = false;
el17sm 46:f09711580d4a 50 }
el17sm 46:f09711580d4a 51 }
el17sm 46:f09711580d4a 52 }
el17sm 46:f09711580d4a 53
el17sm 31:ab24d028ddfd 54 void game_loop()
el17sm 31:ab24d028ddfd 55 {
el17sm 31:ab24d028ddfd 56 while(1) { // Floor Loop
el17sm 46:f09711580d4a 57 boss_room_number = 5 + rand() % 4; // Boss room appears after travelling 5-8 rooms
el17sm 46:f09711580d4a 58 boss_room_counter = 0;
el17sm 46:f09711580d4a 59 while(1) { // Room Loop
el17sm 46:f09711580d4a 60 update_room_coords();
el17sm 46:f09711580d4a 61 if (!valid_rooms[room_y][room_x]){
el17sm 46:f09711580d4a 62 generate_room();
el17sm 30:ec915d24d3e9 63 }
el17sm 46:f09711580d4a 64 room_engine->load(player, rooms[room_y][room_x]);
el17sm 31:ab24d028ddfd 65 room_engine->entrance_scene(lcd, gamepad);
el17sm 31:ab24d028ddfd 66 while(room_engine->check_player_room_position() == INSIDE) { // Room actions
el17sm 31:ab24d028ddfd 67 room_engine->read_input(gamepad);
el17sm 47:6e31b195ce3c 68 room_engine->update(number_of_enemies_killed);
el17sm 31:ab24d028ddfd 69 room_engine->render(lcd, gamepad);
el17sm 46:f09711580d4a 70 minimap_detection();
el17sm 47:6e31b195ce3c 71 total_time++;
el17sm 31:ab24d028ddfd 72 if (player->get_hp() <= 0) {
el17sm 31:ab24d028ddfd 73 goto gameover;
el17sm 29:6b8411bb040a 74 }
el17sm 47:6e31b195ce3c 75 if ((rooms[room_y][room_x]->get_room_type() == 10) && !(rooms[room_y][room_x]->enemies_exist())){
el17sm 47:6e31b195ce3c 76 goto winner;
el17sm 47:6e31b195ce3c 77 }
el17sm 29:6b8411bb040a 78 }
el17sm 31:ab24d028ddfd 79 room_engine->exit_scene(lcd, gamepad);
el17sm 46:f09711580d4a 80 rooms[room_y][room_x]->unload();
el17sm 31:ab24d028ddfd 81 player->delete_bullets();
el17sm 31:ab24d028ddfd 82 room_engine->update_current_room();
el17sm 31:ab24d028ddfd 83 }
el17sm 31:ab24d028ddfd 84 }
el17sm 31:ab24d028ddfd 85 gameover : {
el17sm 31:ab24d028ddfd 86 game_over();
el17sm 47:6e31b195ce3c 87 goto displaystats;
el17sm 47:6e31b195ce3c 88 }
el17sm 47:6e31b195ce3c 89 winner : {
el17sm 47:6e31b195ce3c 90 win();
el17sm 47:6e31b195ce3c 91 goto displaystats;
el17sm 47:6e31b195ce3c 92 }
el17sm 47:6e31b195ce3c 93 displaystats : {
el17sm 47:6e31b195ce3c 94 display_stats();
el17sm 31:ab24d028ddfd 95 }
el17sm 31:ab24d028ddfd 96 }
el17sm 29:6b8411bb040a 97
el17sm 46:f09711580d4a 98 void generate_room()
el17sm 46:f09711580d4a 99 {
el17sm 46:f09711580d4a 100 valid_rooms[room_y][room_x] = true;
el17sm 46:f09711580d4a 101 if (boss_room_counter == 0) {
el17sm 46:f09711580d4a 102 rooms[room_y][room_x] = new Room(0, 0);
el17sm 46:f09711580d4a 103 rooms[room_y][room_x]->set_doorway(0, true);
el17sm 46:f09711580d4a 104 } else {
el17sm 46:f09711580d4a 105 rooms[room_y][room_x] = new Room(rand() % 4, 0);
el17sm 46:f09711580d4a 106 if (boss_room_counter < boss_room_number) {no_of_doorways = 2 + (rand() % 100 < 10) + (rand() % 100 < 10);} // 20% chance of adding doorways
el17sm 46:f09711580d4a 107 else {no_of_doorways = 1;}
el17sm 46:f09711580d4a 108 while (count_doorways() < no_of_doorways) {
el17sm 46:f09711580d4a 109 rooms[room_y][room_x]->set_doorway(rand() % 4, true); // Setting random doorways until number of desired doorways
el17sm 46:f09711580d4a 110 }
el17sm 46:f09711580d4a 111 update_definite_doorways();
el17sm 46:f09711580d4a 112 for (int i = 0; i < 4; i++) {
el17sm 46:f09711580d4a 113 if (cannot[i]){rooms[room_y][room_x]->set_doorway(i, false);}
el17sm 46:f09711580d4a 114 if (have_to[i]){rooms[room_y][room_x]->set_doorway(i, true);}
el17sm 46:f09711580d4a 115 }
el17sm 46:f09711580d4a 116 if ((boss_room_counter >= boss_room_number) && (!boss_room_exist)) {
el17sm 46:f09711580d4a 117 rooms[room_y][room_x]->set_boss_doorway(available_boss_room());
el17sm 46:f09711580d4a 118 boss_room_exist = true;
el17sm 46:f09711580d4a 119 }
el17sm 46:f09711580d4a 120 }
el17sm 46:f09711580d4a 121 boss_room_counter++;
el17sm 46:f09711580d4a 122 }
el17sm 46:f09711580d4a 123
el17sm 46:f09711580d4a 124 void update_room_coords()
el17sm 46:f09711580d4a 125 {
el17sm 46:f09711580d4a 126 prev_room_x = room_x;
el17sm 46:f09711580d4a 127 prev_room_y = room_y;
el17sm 46:f09711580d4a 128 room_y = room_engine->get_room_y();
el17sm 46:f09711580d4a 129 room_x = room_engine->get_room_x();
el17sm 46:f09711580d4a 130 }
el17sm 46:f09711580d4a 131
el17sm 46:f09711580d4a 132 int opposite(int value)
el17sm 46:f09711580d4a 133 {
el17sm 46:f09711580d4a 134 if (value <= 1) {
el17sm 46:f09711580d4a 135 return value + 2;
el17sm 46:f09711580d4a 136 } else {
el17sm 46:f09711580d4a 137 return value - 2;
el17sm 46:f09711580d4a 138 }
el17sm 46:f09711580d4a 139 }
el17sm 46:f09711580d4a 140
el17sm 46:f09711580d4a 141 int count_doorways() // counts number of exisisting doorways
el17sm 46:f09711580d4a 142 {
el17sm 46:f09711580d4a 143 int count = 0;
el17sm 46:f09711580d4a 144 for (int i = 0; i < 4; i++){
el17sm 46:f09711580d4a 145 if (rooms[room_y][room_x]->get_doorway(i)) {
el17sm 46:f09711580d4a 146 count++;
el17sm 46:f09711580d4a 147 }
el17sm 46:f09711580d4a 148 }
el17sm 46:f09711580d4a 149 return count;
el17sm 46:f09711580d4a 150 }
el17sm 46:f09711580d4a 151
el17sm 46:f09711580d4a 152 void update_definite_doorways()
el17sm 46:f09711580d4a 153 {
el17sm 46:f09711580d4a 154 // UP
el17sm 46:f09711580d4a 155 if (room_y == 1) {
el17sm 46:f09711580d4a 156 cannot[0] = true;
el17sm 46:f09711580d4a 157 have_to[0] = false;
el17sm 46:f09711580d4a 158 } else if (valid_rooms[room_y - 1][room_x]){
el17sm 46:f09711580d4a 159 if (rooms[room_y - 1][room_x]->get_doorway(2)){
el17sm 46:f09711580d4a 160 have_to[0] = true;
el17sm 46:f09711580d4a 161 cannot[0] = false;
el17sm 46:f09711580d4a 162 } else {
el17sm 46:f09711580d4a 163 have_to[0] = false;
el17sm 46:f09711580d4a 164 cannot[0] = true;
el17sm 46:f09711580d4a 165 }
el17sm 46:f09711580d4a 166 } else {
el17sm 46:f09711580d4a 167 have_to[0] = false;
el17sm 46:f09711580d4a 168 cannot[0] = false;
el17sm 46:f09711580d4a 169 }
el17sm 46:f09711580d4a 170
el17sm 46:f09711580d4a 171 // RIGHT
el17sm 46:f09711580d4a 172 if (room_x == 10) {
el17sm 46:f09711580d4a 173 cannot[1] = true;
el17sm 46:f09711580d4a 174 have_to[1] = false;
el17sm 46:f09711580d4a 175 } else if (valid_rooms[room_y][room_x + 1]){
el17sm 46:f09711580d4a 176 if (rooms[room_y][room_x + 1]->get_doorway(3)){
el17sm 46:f09711580d4a 177 have_to[1] = true;
el17sm 46:f09711580d4a 178 cannot[1] = false;
el17sm 46:f09711580d4a 179 } else {
el17sm 46:f09711580d4a 180 have_to[1] = false;
el17sm 46:f09711580d4a 181 cannot[1] = true;
el17sm 46:f09711580d4a 182 }
el17sm 46:f09711580d4a 183 } else {
el17sm 46:f09711580d4a 184 have_to[1] = false;
el17sm 46:f09711580d4a 185 cannot[1] = false;
el17sm 46:f09711580d4a 186 }
el17sm 46:f09711580d4a 187
el17sm 46:f09711580d4a 188 // DOWN
el17sm 46:f09711580d4a 189 if (room_y == 10) {
el17sm 46:f09711580d4a 190 cannot[2] = true;
el17sm 46:f09711580d4a 191 have_to[2] = false;
el17sm 46:f09711580d4a 192 } else if (valid_rooms[room_y + 1][room_x]){
el17sm 46:f09711580d4a 193 if (rooms[room_y + 1][room_x]->get_doorway(0)){
el17sm 46:f09711580d4a 194 have_to[2] = true;
el17sm 46:f09711580d4a 195 cannot[2] = false;
el17sm 46:f09711580d4a 196 } else {
el17sm 46:f09711580d4a 197 have_to[2] = false;
el17sm 46:f09711580d4a 198 cannot[2] = true;
el17sm 46:f09711580d4a 199 }
el17sm 46:f09711580d4a 200 } else {
el17sm 46:f09711580d4a 201 have_to[2] = false;
el17sm 46:f09711580d4a 202 cannot[2] = false;
el17sm 46:f09711580d4a 203 }
el17sm 46:f09711580d4a 204
el17sm 46:f09711580d4a 205 // LEFT
el17sm 46:f09711580d4a 206 if (room_x == 1) {
el17sm 46:f09711580d4a 207 cannot[3] = true;
el17sm 46:f09711580d4a 208 have_to[3] = false;
el17sm 46:f09711580d4a 209 } else if (valid_rooms[room_y][room_x - 1]){
el17sm 46:f09711580d4a 210 if (rooms[room_y][room_x - 1]->get_doorway(1)){
el17sm 46:f09711580d4a 211 have_to[3] = true;
el17sm 46:f09711580d4a 212 cannot[3] = false;
el17sm 46:f09711580d4a 213 } else {
el17sm 46:f09711580d4a 214 have_to[3] = false;
el17sm 46:f09711580d4a 215 cannot[3] = true;
el17sm 46:f09711580d4a 216 }
el17sm 46:f09711580d4a 217 } else {
el17sm 46:f09711580d4a 218 have_to[3] = false;
el17sm 46:f09711580d4a 219 cannot[3] = false;
el17sm 46:f09711580d4a 220 }
el17sm 46:f09711580d4a 221 }
el17sm 46:f09711580d4a 222
el17sm 46:f09711580d4a 223 int available_boss_room()
el17sm 46:f09711580d4a 224 {
el17sm 46:f09711580d4a 225 if (!valid_rooms[room_y - 1][room_x]){
el17sm 46:f09711580d4a 226 rooms[room_y][room_x]->set_doorway(0, true);
el17sm 46:f09711580d4a 227 valid_rooms[room_y - 1][room_x] = true;
el17sm 46:f09711580d4a 228 rooms[room_y - 1][room_x] = new Room(0, 10);
el17sm 46:f09711580d4a 229 rooms[room_y - 1][room_x]->set_doorway(2, true);
el17sm 46:f09711580d4a 230 return 0;
el17sm 46:f09711580d4a 231 } else if (!valid_rooms[room_y][room_x + 1]){
el17sm 46:f09711580d4a 232 rooms[room_y][room_x]->set_doorway(1, true);
el17sm 46:f09711580d4a 233 valid_rooms[room_y][room_x + 1] = true;
el17sm 46:f09711580d4a 234 rooms[room_y][room_x + 1] = new Room(0, 10);
el17sm 46:f09711580d4a 235 rooms[room_y][room_x + 1]->set_doorway(3, true);
el17sm 46:f09711580d4a 236 return 1;
el17sm 46:f09711580d4a 237 } else if (!valid_rooms[room_y + 1][room_x]){
el17sm 46:f09711580d4a 238 rooms[room_y][room_x]->set_doorway(2, true);
el17sm 46:f09711580d4a 239 valid_rooms[room_y + 1][room_x] = true;
el17sm 46:f09711580d4a 240 rooms[room_y + 1][room_x] = new Room(0, 10);
el17sm 46:f09711580d4a 241 rooms[room_y + 1][room_x]->set_doorway(0, true);
el17sm 46:f09711580d4a 242 return 2;
el17sm 46:f09711580d4a 243 } else if (!valid_rooms[room_y][room_x - 1]){
el17sm 46:f09711580d4a 244 rooms[room_y][room_x]->set_doorway(3, true);
el17sm 46:f09711580d4a 245 valid_rooms[room_y][room_x - 1] = true;
el17sm 46:f09711580d4a 246 rooms[room_y][room_x - 1] = new Room(0, 10);
el17sm 46:f09711580d4a 247 rooms[room_y][room_x - 1]->set_doorway(1, true);
el17sm 46:f09711580d4a 248 return 3;
el17sm 46:f09711580d4a 249 }
el17sm 46:f09711580d4a 250 delete rooms[room_y - 1][room_x];
el17sm 46:f09711580d4a 251 rooms[room_y - 1][room_x] = new Room(0, 10);
el17sm 46:f09711580d4a 252 rooms[room_y - 1][room_x]->set_doorway(2, true);
el17sm 46:f09711580d4a 253 return 0;
el17sm 46:f09711580d4a 254 }
el17sm 46:f09711580d4a 255
el17sm 46:f09711580d4a 256 void minimap_detection()
el17sm 46:f09711580d4a 257 {
el17sm 46:f09711580d4a 258 while(gamepad.check_event(Gamepad::BACK_PRESSED)) {
el17sm 46:f09711580d4a 259 lcd.clear();
el17sm 47:6e31b195ce3c 260 for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) {
el17sm 47:6e31b195ce3c 261 for (int i = 0; i < MAX_ROOMS_MAP_X; i++) {
el17sm 47:6e31b195ce3c 262 if (valid_rooms[j][i]) {
el17sm 47:6e31b195ce3c 263 lcd.drawSprite(33 + (i-room_x)*20, 17 + (j-room_y)*15, 15, 20, (char *)minimap_sprite[0]);
el17sm 47:6e31b195ce3c 264 if (rooms[j][i]->get_room_type() == 10) {
el17sm 47:6e31b195ce3c 265 lcd.drawSprite(33 + (i-room_x)*20, 17 + (j-room_y)*15, 15, 20, (char *)minimap_sprite[2]);
el17sm 47:6e31b195ce3c 266 } else if (rooms[j][i]->enemies_exist()) {
el17sm 47:6e31b195ce3c 267 lcd.drawSprite(33 + (i-room_x)*20, 17 + (j-room_y)*15, 15, 20, (char *)minimap_sprite[1]);
el17sm 47:6e31b195ce3c 268 }
el17sm 47:6e31b195ce3c 269 if (rooms[j][i]->get_doorway(0)) {
el17sm 47:6e31b195ce3c 270 lcd.drawLine(42 + (i-room_x)*20, 17 + (j-room_y)*15, 43 + (i-room_x)*20, 17 + (j-room_y)*15, 1);
el17sm 47:6e31b195ce3c 271 }
el17sm 47:6e31b195ce3c 272 if (rooms[j][i]->get_doorway(1)) {
el17sm 47:6e31b195ce3c 273 lcd.drawLine(52 + (i-room_x)*20, 23 + (j-room_y)*15, 52 + (i-room_x)*20, 24 + (j-room_y)*15, 1);
el17sm 47:6e31b195ce3c 274 }
el17sm 47:6e31b195ce3c 275 if (rooms[j][i]->get_doorway(2)) {
el17sm 47:6e31b195ce3c 276 lcd.drawLine(42 + (i-room_x)*20, 31 + (j-room_y)*15, 43 + (i-room_x)*20, 31 + (j-room_y)*15, 1);
el17sm 47:6e31b195ce3c 277 }
el17sm 47:6e31b195ce3c 278 if (rooms[j][i]->get_doorway(3)) {
el17sm 47:6e31b195ce3c 279 lcd.drawLine(33 + (i-room_x)*20, 23 + (j-room_y)*15, 33 + (i-room_x)*20, 24 + (j-room_y)*15, 1);
el17sm 47:6e31b195ce3c 280 }
el17sm 47:6e31b195ce3c 281 }
el17sm 47:6e31b195ce3c 282 }
el17sm 47:6e31b195ce3c 283 }
el17sm 47:6e31b195ce3c 284 lcd.drawSpriteTransparent(33, 17, 15, 20, (char *)minimap_sprite[3]);
el17sm 46:f09711580d4a 285 lcd.refresh();
el17sm 46:f09711580d4a 286 wait_ms(1000/40);
el17sm 46:f09711580d4a 287 };
el17sm 46:f09711580d4a 288 }
el17sm 47:6e31b195ce3c 289
el17sm 47:6e31b195ce3c 290 void game_over()
el17sm 47:6e31b195ce3c 291 {
el17sm 47:6e31b195ce3c 292 lcd.clear();
el17sm 47:6e31b195ce3c 293 lcd.setContrast(global_contrast);
el17sm 47:6e31b195ce3c 294 lcd.printString("Game Over", 0, 0);
el17sm 47:6e31b195ce3c 295 lcd.printString("Retry?", 0, 1);
el17sm 47:6e31b195ce3c 296 }
el17sm 47:6e31b195ce3c 297
el17sm 47:6e31b195ce3c 298 void win()
el17sm 47:6e31b195ce3c 299 {
el17sm 47:6e31b195ce3c 300 lcd.clear();
el17sm 47:6e31b195ce3c 301 lcd.setContrast(global_contrast);
el17sm 47:6e31b195ce3c 302 lcd.printString("You won!", 0, 0);
el17sm 47:6e31b195ce3c 303 }
el17sm 47:6e31b195ce3c 304
el17sm 47:6e31b195ce3c 305 void display_stats()
el17sm 47:6e31b195ce3c 306 {
el17sm 47:6e31b195ce3c 307 lcd.printString("Enemies Killed:", 0, 2);
el17sm 47:6e31b195ce3c 308 char kills[10];
el17sm 47:6e31b195ce3c 309 sprintf(kills, "%d enemies", number_of_enemies_killed);
el17sm 47:6e31b195ce3c 310 lcd.printString(kills, 0, 3);
el17sm 47:6e31b195ce3c 311 lcd.printString("Time:", 0, 4);
el17sm 47:6e31b195ce3c 312 char total_duration[10];
el17sm 47:6e31b195ce3c 313 sprintf(total_duration, "%d seconds", (total_time/40));
el17sm 47:6e31b195ce3c 314 lcd.printString(total_duration, 0, 5);
el17sm 47:6e31b195ce3c 315 lcd.refresh();
el17sm 47:6e31b195ce3c 316 while(gamepad.check_event(Gamepad::A_PRESSED)) {
el17sm 47:6e31b195ce3c 317 }
el17sm 47:6e31b195ce3c 318 wait(0.05);
el17sm 47:6e31b195ce3c 319 while(!gamepad.check_event(Gamepad::A_PRESSED)) {
el17sm 47:6e31b195ce3c 320 }
el17sm 47:6e31b195ce3c 321 wait(0.05);
el17sm 47:6e31b195ce3c 322 while(gamepad.check_event(Gamepad::A_PRESSED)) {
el17sm 47:6e31b195ce3c 323 }
el17sm 47:6e31b195ce3c 324 }