A rouge-like rpg, heavily inspired on the binding of isaac. Running on a FRDM-K64F Mbed board. C++.

Dependencies:   mbed MotionSensor

Revision:
49:3f83ed62d123
Parent:
48:f7d9ae3e554d
Child:
50:2c5cb92a5361
--- a/main.cpp	Thu May 09 02:46:44 2019 +0000
+++ b/main.cpp	Thu May 09 04:24:30 2019 +0000
@@ -90,7 +90,7 @@
     } 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;}
+        else {no_of_doorways = 0;}
         while (count_doorways() < no_of_doorways) {
             rooms[room_y][room_x]->set_doorway(rand() % 4, true);   // Setting random doorways until number of desired doorways
         }
@@ -117,7 +117,7 @@
 
 void minimap_detection()
 {
-    while(gamepad.check_event(Gamepad::BACK_PRESSED)) {
+    while(gamepad.check_event(Gamepad::R_PRESSED)) {
         lcd.clear();
         for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) {
             for (int i = 0; i < MAX_ROOMS_MAP_X; i++) {
@@ -153,19 +153,19 @@
 {
     lcd.clear();
     lcd.setContrast(global_contrast);
-    lcd.printString("Game Over", 0, 0);
-    lcd.printString("Retry?", 0, 1);        
+    lcd.printString("Game Over", 0, 0);     
 }
 
 void win()
 {
     lcd.clear();
     lcd.setContrast(global_contrast);
-    lcd.printString("You won!", 0, 0);
+    lcd.printString("You won!", 0, 0);   
 }
 
 void display_stats()
 {
+    lcd.printString("Restart?", 0, 1);   
     lcd.printString("Enemies Killed:", 0, 2);
     char kills[10];
     sprintf(kills, "%d enemies", number_of_enemies_killed);
@@ -189,35 +189,49 @@
 {
     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);
+        set_boss_room(room_y - 1, room_x, 0);
         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);
+        set_boss_room(room_y, room_x + 1, 1);
         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);
+        set_boss_room(room_y + 1, room_x, 2);
         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;
-    }
+        set_boss_room(room_y, room_x - 1, 3);
+        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);
+    rooms[room_y][room_x]->set_doorway(3, true);
+    set_boss_room(room_y - 1, room_x, 0);
     return 0;
 }
 
+void set_boss_room(int room_y, int room_x, int side)
+{
+    valid_rooms[room_y][room_x] = true;
+    rooms[room_y][room_x] = new Room(0, 10);
+    rooms[room_y][room_x]->set_doorway(opposite(side), true);
+    if ((opposite(side) != 0) && (valid_rooms[room_y - 1][room_x])){
+        if (rooms[room_y - 1][room_x]->get_doorway(2)){
+            rooms[room_y - 1][room_x]->set_doorway(2, false);
+    }}
+    if ((opposite(side) != 1) && (valid_rooms[room_y][room_x + 1])){
+        if (rooms[room_y][room_x + 1]->get_doorway(3)){
+            rooms[room_y][room_x + 1]->set_doorway(3, false);
+    }}
+    if ((opposite(side) != 2) && (valid_rooms[room_y + 1][room_x])){
+        if (rooms[room_y + 1][room_x]->get_doorway(0)){
+            rooms[room_y + 1][room_x]->set_doorway(0, false);
+    }}
+    if ((opposite(side) != 3) && (valid_rooms[room_y][room_x - 1])){
+        if (rooms[room_y][room_x - 1]->get_doorway(1)){
+            rooms[room_y][room_x - 1]->set_doorway(1, false);
+    }}
+}
+
 void game_unload()
 {
     for (int i = 0; i < MAX_ROOMS_MAP_X; i++) { 
@@ -255,11 +269,18 @@
 
 void update_definite_doorways()
 {
-    // UP
-    if (room_y == 1) {
+    update_definite_doorways_up();
+    update_definite_doorways_right();
+    update_definite_doorways_down();
+    update_definite_doorways_left();
+}
+
+void update_definite_doorways_up()
+{
+    if (room_y == 1) {  // if room to be generated is on the border, then doorway cannot exist
         cannot[0] = true;
         have_to[0] = false;
-    } else if (valid_rooms[room_y - 1][room_x]){
+    } else if (valid_rooms[room_y - 1][room_x]){ // if room to be generated is on the border, then doorway cannot exist
         if (rooms[room_y - 1][room_x]->get_doorway(2)){
             have_to[0] = true;
             cannot[0] = false;
@@ -271,8 +292,9 @@
         have_to[0] = false;
         cannot[0] = false;
     }
-    
-    // RIGHT
+}
+void update_definite_doorways_right()
+{
     if (room_x == 10) {
         cannot[1] = true;
         have_to[1] = false;
@@ -288,8 +310,10 @@
         have_to[1] = false;
         cannot[1] = false;
     }
-    
-    // DOWN
+}
+
+void update_definite_doorways_down()
+{
     if (room_y == 10) {
         cannot[2] = true;
         have_to[2] = false;
@@ -305,8 +329,10 @@
         have_to[2] = false;
         cannot[2] = false;
     }
-    
-    // LEFT
+}
+
+void update_definite_doorways_left()
+{
     if (room_x == 1) {
         cannot[3] = true;
         have_to[3] = false;