Steven Mahasin / Mbed 2 deprecated DreamDungeon

Dependencies:   mbed MotionSensor

Revision:
46:f09711580d4a
Parent:
45:8725b4171646
Child:
47:6e31b195ce3c
diff -r 8725b4171646 -r f09711580d4a main.cpp
--- a/main.cpp	Wed May 08 12:40:52 2019 +0000
+++ b/main.cpp	Wed May 08 20:47:52 2019 +0000
@@ -7,49 +7,16 @@
 Student ID Number: 201192939
 Date: 11/04/2019
 */
-
-// Pre-Processor
-#include "mbed.h"
-#include "Gamepad.h"
-#include "N5110.h"
-#include "math.h"
-#include "sprites.h"
-#include "Entity.h"
-#include "Player.h"
-#include "Headless.h"
-#include "Snake.h"
-#include "RoomEngine.h"
-#include "Title.h"
-
-#define INSIDE 4
-#define MAX_ROOMS_MAP_X 11
-#define MAX_ROOMS_MAP_Y 11
-
-// Variables
-float global_contrast = 0.5;
-Player *player;
-Room *rooms[MAX_ROOMS_MAP_Y][MAX_ROOMS_MAP_X];
-bool valid_rooms[MAX_ROOMS_MAP_Y][MAX_ROOMS_MAP_X];
-RoomEngine *room_engine;
-
-// Objects
-N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
-Gamepad gamepad;
-Title title;
-
-// Prototypes
-void game_loop();
-void game_over();
+#include "main.h"
 
 int main()
 {
     // Initialize
-    lcd.init();
-    lcd.setContrast(global_contrast); 
-    gamepad.init();
+    init();
     
     while(1) { // Gameloop
-        
+    
+        boss_room_exist = false;
         title.main(lcd, gamepad, global_contrast);
         
         srand(title.get_seed());
@@ -58,43 +25,54 @@
         
         game_loop();
         game_over();
-        for (int i = 0; i < MAX_ROOMS_MAP_X; i++) {
-                for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) {
+        for (int i = 0; i < MAX_ROOMS_MAP_X; i++) { 
+            for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) {
+                if (valid_rooms[j][j]){
                     delete rooms[j][i];
+                    valid_rooms[i][j] = false;
                 }
             }
+        }
         delete room_engine;
         delete player;
     }
 }
 
+void init()
+{
+    lcd.init();
+    lcd.setContrast(global_contrast); 
+    gamepad.init();
+    for (int j = 0; j < MAX_ROOMS_MAP_Y; j++){
+        for (int i = 0; i < MAX_ROOMS_MAP_X; i++){
+            valid_rooms[j][i] = false;
+        }
+    }
+}
+
 void game_loop()
 {
     while(1) {  // Floor Loop 
-        for (int i = 0; i < MAX_ROOMS_MAP_X; i++) {
-            for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) {
-                rooms[j][i] = new Room(rand() % 1, 10);
+        boss_room_number = 5 + rand() % 4; // Boss room appears after travelling 5-8 rooms
+        boss_room_counter = 0;
+        while(1) {  // Room Loop
+            update_room_coords();
+            if (!valid_rooms[room_y][room_x]){
+                generate_room();
             }
-        }
-        rooms[7][6]->set_boss_doorway(true);
-        delete rooms[8][6];
-        rooms[8][6] = new Room(0,10);
-    
-        // Rooms Generation
-        while(1) {  // Room Loop
-            rooms[room_engine->get_room_y()][room_engine->get_room_x()]->load();
-            room_engine->load(player, rooms[room_engine->get_room_y()][room_engine->get_room_x()]);
+            room_engine->load(player, rooms[room_y][room_x]);
             room_engine->entrance_scene(lcd, gamepad);
             while(room_engine->check_player_room_position() == INSIDE) {  // Room actions
                 room_engine->read_input(gamepad);
                 room_engine->update();
                 room_engine->render(lcd, gamepad);
+                minimap_detection();
                 if  (player->get_hp() <= 0) {
                     goto gameover;
                 }
             }
             room_engine->exit_scene(lcd, gamepad);
-            rooms[room_engine->get_room_y()][room_engine->get_room_x()]->unload();
+            rooms[room_y][room_x]->unload();
             player->delete_bullets();
             room_engine->update_current_room();
         }
@@ -104,6 +82,32 @@
     }
 }
 
+void generate_room()
+{
+    valid_rooms[room_y][room_x] = true;
+    if (boss_room_counter == 0) {
+        rooms[room_y][room_x] = new Room(0, 0);
+        rooms[room_y][room_x]->set_doorway(0, true);
+    } else {
+        rooms[room_y][room_x] = new Room(rand() % 4, 0);
+        if (boss_room_counter < boss_room_number) {no_of_doorways = 2 + (rand() % 100 < 10) + (rand() % 100 < 10);} // 20% chance of adding doorways
+        else {no_of_doorways = 1;}
+        while (count_doorways() < no_of_doorways) {
+            rooms[room_y][room_x]->set_doorway(rand() % 4, true);   // Setting random doorways until number of desired doorways
+        }
+        update_definite_doorways();
+        for (int i = 0; i < 4; i++) {
+            if (cannot[i]){rooms[room_y][room_x]->set_doorway(i, false);}
+            if (have_to[i]){rooms[room_y][room_x]->set_doorway(i, true);}
+        }
+        if ((boss_room_counter >= boss_room_number) && (!boss_room_exist)) {
+            rooms[room_y][room_x]->set_boss_doorway(available_boss_room());
+            boss_room_exist = true;
+        }
+    }
+    boss_room_counter++;
+}
+
 void game_over()
 {
     while(1){   // Game Over Screen Loop
@@ -119,4 +123,145 @@
                 }
                 break;
             }
-}
\ No newline at end of file
+}
+
+void update_room_coords()
+{
+    prev_room_x = room_x;
+    prev_room_y = room_y;
+    room_y = room_engine->get_room_y();
+    room_x = room_engine->get_room_x();
+}
+
+int opposite(int value)
+{
+    if (value <= 1) {
+        return value + 2;
+    } else {
+        return value - 2;
+    }
+}
+
+int count_doorways()    // counts number of exisisting doorways
+{
+    int count = 0;
+    for (int i = 0; i < 4; i++){
+        if (rooms[room_y][room_x]->get_doorway(i)) {
+            count++;
+        }
+    }
+    return count;
+}
+
+void update_definite_doorways()
+{
+    // UP
+    if (room_y == 1) {
+        cannot[0] = true;
+        have_to[0] = false;
+    } else if (valid_rooms[room_y - 1][room_x]){
+        if (rooms[room_y - 1][room_x]->get_doorway(2)){
+            have_to[0] = true;
+            cannot[0] = false;
+        } else {
+            have_to[0] = false;
+            cannot[0] = true;
+        }
+    } else {
+        have_to[0] = false;
+        cannot[0] = false;
+    }
+    
+    // RIGHT
+    if (room_x == 10) {
+        cannot[1] = true;
+        have_to[1] = false;
+    } else if (valid_rooms[room_y][room_x + 1]){
+        if (rooms[room_y][room_x + 1]->get_doorway(3)){
+            have_to[1] = true;
+            cannot[1] = false;
+        } else {
+            have_to[1] = false;
+            cannot[1] = true;
+        }
+    } else {
+        have_to[1] = false;
+        cannot[1] = false;
+    }
+    
+    // DOWN
+    if (room_y == 10) {
+        cannot[2] = true;
+        have_to[2] = false;
+    } else if (valid_rooms[room_y + 1][room_x]){
+        if (rooms[room_y + 1][room_x]->get_doorway(0)){
+            have_to[2] = true;
+            cannot[2] = false;
+        } else {
+            have_to[2] = false;
+            cannot[2] = true;
+        }
+    } else {
+        have_to[2] = false;
+        cannot[2] = false;
+    }
+    
+    // LEFT
+    if (room_x == 1) {
+        cannot[3] = true;
+        have_to[3] = false;
+    } else if (valid_rooms[room_y][room_x - 1]){
+        if (rooms[room_y][room_x - 1]->get_doorway(1)){
+            have_to[3] = true;
+            cannot[3] = false;
+        } else {
+            have_to[3] = false;
+            cannot[3] = true;
+        }
+    } else {
+        have_to[3] = false;
+        cannot[3] = false;
+    }
+}
+
+int available_boss_room()
+{
+    if (!valid_rooms[room_y - 1][room_x]){
+        rooms[room_y][room_x]->set_doorway(0, true);
+        valid_rooms[room_y - 1][room_x] = true;
+        rooms[room_y - 1][room_x] = new Room(0, 10);
+        rooms[room_y - 1][room_x]->set_doorway(2, true);
+        return 0;
+    } else if (!valid_rooms[room_y][room_x + 1]){
+        rooms[room_y][room_x]->set_doorway(1, true);
+        valid_rooms[room_y][room_x + 1] = true;
+        rooms[room_y][room_x + 1] = new Room(0, 10);
+        rooms[room_y][room_x + 1]->set_doorway(3, true);
+        return 1;
+    } else if (!valid_rooms[room_y + 1][room_x]){
+        rooms[room_y][room_x]->set_doorway(2, true);
+        valid_rooms[room_y + 1][room_x] = true;
+        rooms[room_y + 1][room_x] = new Room(0, 10);
+        rooms[room_y + 1][room_x]->set_doorway(0, true);
+        return 2;
+    } else if (!valid_rooms[room_y][room_x - 1]){
+        rooms[room_y][room_x]->set_doorway(3, true);
+        valid_rooms[room_y][room_x - 1] = true;
+        rooms[room_y][room_x - 1] = new Room(0, 10);
+        rooms[room_y][room_x - 1]->set_doorway(1, true);
+        return 3;
+    }
+    delete rooms[room_y - 1][room_x];
+    rooms[room_y - 1][room_x] = new Room(0, 10);
+    rooms[room_y - 1][room_x]->set_doorway(2, true);
+    return 0;
+}
+
+void minimap_detection()
+{
+    while(gamepad.check_event(Gamepad::BACK_PRESSED)) {
+        lcd.clear();
+        lcd.refresh();
+        wait_ms(1000/40);
+    };
+}