Steven Mahasin / Mbed 2 deprecated DreamDungeon

Dependencies:   mbed MotionSensor

Committer:
el17sm
Date:
Wed May 08 20:47:52 2019 +0000
Revision:
46:f09711580d4a
Parent:
45:8725b4171646
Child:
47:6e31b195ce3c
Map Generation Done

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
el17sm 46:f09711580d4a 19 boss_room_exist = false;
el17sm 32:fe6359ef9916 20 title.main(lcd, gamepad, global_contrast);
el17sm 31:ab24d028ddfd 21
el17sm 32:fe6359ef9916 22 srand(title.get_seed());
el17sm 31:ab24d028ddfd 23 player = new Player(39, 27);
el17sm 41:0697508a28ba 24 room_engine = new RoomEngine(global_contrast);
el17sm 31:ab24d028ddfd 25
el17sm 31:ab24d028ddfd 26 game_loop();
el17sm 31:ab24d028ddfd 27 game_over();
el17sm 46:f09711580d4a 28 for (int i = 0; i < MAX_ROOMS_MAP_X; i++) {
el17sm 46:f09711580d4a 29 for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) {
el17sm 46:f09711580d4a 30 if (valid_rooms[j][j]){
el17sm 40:cbcbf6fc1421 31 delete rooms[j][i];
el17sm 46:f09711580d4a 32 valid_rooms[i][j] = false;
el17sm 40:cbcbf6fc1421 33 }
el17sm 40:cbcbf6fc1421 34 }
el17sm 46:f09711580d4a 35 }
el17sm 31:ab24d028ddfd 36 delete room_engine;
el17sm 31:ab24d028ddfd 37 delete player;
el17sm 31:ab24d028ddfd 38 }
el17sm 31:ab24d028ddfd 39 }
el17sm 31:ab24d028ddfd 40
el17sm 46:f09711580d4a 41 void init()
el17sm 46:f09711580d4a 42 {
el17sm 46:f09711580d4a 43 lcd.init();
el17sm 46:f09711580d4a 44 lcd.setContrast(global_contrast);
el17sm 46:f09711580d4a 45 gamepad.init();
el17sm 46:f09711580d4a 46 for (int j = 0; j < MAX_ROOMS_MAP_Y; j++){
el17sm 46:f09711580d4a 47 for (int i = 0; i < MAX_ROOMS_MAP_X; i++){
el17sm 46:f09711580d4a 48 valid_rooms[j][i] = false;
el17sm 46:f09711580d4a 49 }
el17sm 46:f09711580d4a 50 }
el17sm 46:f09711580d4a 51 }
el17sm 46:f09711580d4a 52
el17sm 31:ab24d028ddfd 53 void game_loop()
el17sm 31:ab24d028ddfd 54 {
el17sm 31:ab24d028ddfd 55 while(1) { // Floor Loop
el17sm 46:f09711580d4a 56 boss_room_number = 5 + rand() % 4; // Boss room appears after travelling 5-8 rooms
el17sm 46:f09711580d4a 57 boss_room_counter = 0;
el17sm 46:f09711580d4a 58 while(1) { // Room Loop
el17sm 46:f09711580d4a 59 update_room_coords();
el17sm 46:f09711580d4a 60 if (!valid_rooms[room_y][room_x]){
el17sm 46:f09711580d4a 61 generate_room();
el17sm 30:ec915d24d3e9 62 }
el17sm 46:f09711580d4a 63 room_engine->load(player, rooms[room_y][room_x]);
el17sm 31:ab24d028ddfd 64 room_engine->entrance_scene(lcd, gamepad);
el17sm 31:ab24d028ddfd 65 while(room_engine->check_player_room_position() == INSIDE) { // Room actions
el17sm 31:ab24d028ddfd 66 room_engine->read_input(gamepad);
el17sm 31:ab24d028ddfd 67 room_engine->update();
el17sm 31:ab24d028ddfd 68 room_engine->render(lcd, gamepad);
el17sm 46:f09711580d4a 69 minimap_detection();
el17sm 31:ab24d028ddfd 70 if (player->get_hp() <= 0) {
el17sm 31:ab24d028ddfd 71 goto gameover;
el17sm 29:6b8411bb040a 72 }
el17sm 29:6b8411bb040a 73 }
el17sm 31:ab24d028ddfd 74 room_engine->exit_scene(lcd, gamepad);
el17sm 46:f09711580d4a 75 rooms[room_y][room_x]->unload();
el17sm 31:ab24d028ddfd 76 player->delete_bullets();
el17sm 31:ab24d028ddfd 77 room_engine->update_current_room();
el17sm 31:ab24d028ddfd 78 }
el17sm 31:ab24d028ddfd 79 }
el17sm 31:ab24d028ddfd 80 gameover : {
el17sm 31:ab24d028ddfd 81 game_over();
el17sm 31:ab24d028ddfd 82 }
el17sm 31:ab24d028ddfd 83 }
el17sm 29:6b8411bb040a 84
el17sm 46:f09711580d4a 85 void generate_room()
el17sm 46:f09711580d4a 86 {
el17sm 46:f09711580d4a 87 valid_rooms[room_y][room_x] = true;
el17sm 46:f09711580d4a 88 if (boss_room_counter == 0) {
el17sm 46:f09711580d4a 89 rooms[room_y][room_x] = new Room(0, 0);
el17sm 46:f09711580d4a 90 rooms[room_y][room_x]->set_doorway(0, true);
el17sm 46:f09711580d4a 91 } else {
el17sm 46:f09711580d4a 92 rooms[room_y][room_x] = new Room(rand() % 4, 0);
el17sm 46:f09711580d4a 93 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 94 else {no_of_doorways = 1;}
el17sm 46:f09711580d4a 95 while (count_doorways() < no_of_doorways) {
el17sm 46:f09711580d4a 96 rooms[room_y][room_x]->set_doorway(rand() % 4, true); // Setting random doorways until number of desired doorways
el17sm 46:f09711580d4a 97 }
el17sm 46:f09711580d4a 98 update_definite_doorways();
el17sm 46:f09711580d4a 99 for (int i = 0; i < 4; i++) {
el17sm 46:f09711580d4a 100 if (cannot[i]){rooms[room_y][room_x]->set_doorway(i, false);}
el17sm 46:f09711580d4a 101 if (have_to[i]){rooms[room_y][room_x]->set_doorway(i, true);}
el17sm 46:f09711580d4a 102 }
el17sm 46:f09711580d4a 103 if ((boss_room_counter >= boss_room_number) && (!boss_room_exist)) {
el17sm 46:f09711580d4a 104 rooms[room_y][room_x]->set_boss_doorway(available_boss_room());
el17sm 46:f09711580d4a 105 boss_room_exist = true;
el17sm 46:f09711580d4a 106 }
el17sm 46:f09711580d4a 107 }
el17sm 46:f09711580d4a 108 boss_room_counter++;
el17sm 46:f09711580d4a 109 }
el17sm 46:f09711580d4a 110
el17sm 31:ab24d028ddfd 111 void game_over()
el17sm 31:ab24d028ddfd 112 {
el17sm 31:ab24d028ddfd 113 while(1){ // Game Over Screen Loop
el17sm 30:ec915d24d3e9 114 lcd.clear();
el17sm 30:ec915d24d3e9 115 lcd.setContrast(global_contrast);
el17sm 30:ec915d24d3e9 116 lcd.printString("Game Over", 0, 0);
el17sm 30:ec915d24d3e9 117 lcd.printString("Retry?", 0, 1);
el17sm 30:ec915d24d3e9 118 lcd.refresh();
el17sm 30:ec915d24d3e9 119 while(!gamepad.check_event(Gamepad::A_PRESSED)) {
el17sm 30:ec915d24d3e9 120 }
el17sm 30:ec915d24d3e9 121 wait(0.05);
el17sm 30:ec915d24d3e9 122 while(gamepad.check_event(Gamepad::A_PRESSED)) {
el17sm 30:ec915d24d3e9 123 }
el17sm 30:ec915d24d3e9 124 break;
el17sm 30:ec915d24d3e9 125 }
el17sm 46:f09711580d4a 126 }
el17sm 46:f09711580d4a 127
el17sm 46:f09711580d4a 128 void update_room_coords()
el17sm 46:f09711580d4a 129 {
el17sm 46:f09711580d4a 130 prev_room_x = room_x;
el17sm 46:f09711580d4a 131 prev_room_y = room_y;
el17sm 46:f09711580d4a 132 room_y = room_engine->get_room_y();
el17sm 46:f09711580d4a 133 room_x = room_engine->get_room_x();
el17sm 46:f09711580d4a 134 }
el17sm 46:f09711580d4a 135
el17sm 46:f09711580d4a 136 int opposite(int value)
el17sm 46:f09711580d4a 137 {
el17sm 46:f09711580d4a 138 if (value <= 1) {
el17sm 46:f09711580d4a 139 return value + 2;
el17sm 46:f09711580d4a 140 } else {
el17sm 46:f09711580d4a 141 return value - 2;
el17sm 46:f09711580d4a 142 }
el17sm 46:f09711580d4a 143 }
el17sm 46:f09711580d4a 144
el17sm 46:f09711580d4a 145 int count_doorways() // counts number of exisisting doorways
el17sm 46:f09711580d4a 146 {
el17sm 46:f09711580d4a 147 int count = 0;
el17sm 46:f09711580d4a 148 for (int i = 0; i < 4; i++){
el17sm 46:f09711580d4a 149 if (rooms[room_y][room_x]->get_doorway(i)) {
el17sm 46:f09711580d4a 150 count++;
el17sm 46:f09711580d4a 151 }
el17sm 46:f09711580d4a 152 }
el17sm 46:f09711580d4a 153 return count;
el17sm 46:f09711580d4a 154 }
el17sm 46:f09711580d4a 155
el17sm 46:f09711580d4a 156 void update_definite_doorways()
el17sm 46:f09711580d4a 157 {
el17sm 46:f09711580d4a 158 // UP
el17sm 46:f09711580d4a 159 if (room_y == 1) {
el17sm 46:f09711580d4a 160 cannot[0] = true;
el17sm 46:f09711580d4a 161 have_to[0] = false;
el17sm 46:f09711580d4a 162 } else if (valid_rooms[room_y - 1][room_x]){
el17sm 46:f09711580d4a 163 if (rooms[room_y - 1][room_x]->get_doorway(2)){
el17sm 46:f09711580d4a 164 have_to[0] = true;
el17sm 46:f09711580d4a 165 cannot[0] = false;
el17sm 46:f09711580d4a 166 } else {
el17sm 46:f09711580d4a 167 have_to[0] = false;
el17sm 46:f09711580d4a 168 cannot[0] = true;
el17sm 46:f09711580d4a 169 }
el17sm 46:f09711580d4a 170 } else {
el17sm 46:f09711580d4a 171 have_to[0] = false;
el17sm 46:f09711580d4a 172 cannot[0] = false;
el17sm 46:f09711580d4a 173 }
el17sm 46:f09711580d4a 174
el17sm 46:f09711580d4a 175 // RIGHT
el17sm 46:f09711580d4a 176 if (room_x == 10) {
el17sm 46:f09711580d4a 177 cannot[1] = true;
el17sm 46:f09711580d4a 178 have_to[1] = false;
el17sm 46:f09711580d4a 179 } else if (valid_rooms[room_y][room_x + 1]){
el17sm 46:f09711580d4a 180 if (rooms[room_y][room_x + 1]->get_doorway(3)){
el17sm 46:f09711580d4a 181 have_to[1] = true;
el17sm 46:f09711580d4a 182 cannot[1] = false;
el17sm 46:f09711580d4a 183 } else {
el17sm 46:f09711580d4a 184 have_to[1] = false;
el17sm 46:f09711580d4a 185 cannot[1] = true;
el17sm 46:f09711580d4a 186 }
el17sm 46:f09711580d4a 187 } else {
el17sm 46:f09711580d4a 188 have_to[1] = false;
el17sm 46:f09711580d4a 189 cannot[1] = false;
el17sm 46:f09711580d4a 190 }
el17sm 46:f09711580d4a 191
el17sm 46:f09711580d4a 192 // DOWN
el17sm 46:f09711580d4a 193 if (room_y == 10) {
el17sm 46:f09711580d4a 194 cannot[2] = true;
el17sm 46:f09711580d4a 195 have_to[2] = false;
el17sm 46:f09711580d4a 196 } else if (valid_rooms[room_y + 1][room_x]){
el17sm 46:f09711580d4a 197 if (rooms[room_y + 1][room_x]->get_doorway(0)){
el17sm 46:f09711580d4a 198 have_to[2] = true;
el17sm 46:f09711580d4a 199 cannot[2] = false;
el17sm 46:f09711580d4a 200 } else {
el17sm 46:f09711580d4a 201 have_to[2] = false;
el17sm 46:f09711580d4a 202 cannot[2] = true;
el17sm 46:f09711580d4a 203 }
el17sm 46:f09711580d4a 204 } else {
el17sm 46:f09711580d4a 205 have_to[2] = false;
el17sm 46:f09711580d4a 206 cannot[2] = false;
el17sm 46:f09711580d4a 207 }
el17sm 46:f09711580d4a 208
el17sm 46:f09711580d4a 209 // LEFT
el17sm 46:f09711580d4a 210 if (room_x == 1) {
el17sm 46:f09711580d4a 211 cannot[3] = true;
el17sm 46:f09711580d4a 212 have_to[3] = false;
el17sm 46:f09711580d4a 213 } else if (valid_rooms[room_y][room_x - 1]){
el17sm 46:f09711580d4a 214 if (rooms[room_y][room_x - 1]->get_doorway(1)){
el17sm 46:f09711580d4a 215 have_to[3] = true;
el17sm 46:f09711580d4a 216 cannot[3] = false;
el17sm 46:f09711580d4a 217 } else {
el17sm 46:f09711580d4a 218 have_to[3] = false;
el17sm 46:f09711580d4a 219 cannot[3] = true;
el17sm 46:f09711580d4a 220 }
el17sm 46:f09711580d4a 221 } else {
el17sm 46:f09711580d4a 222 have_to[3] = false;
el17sm 46:f09711580d4a 223 cannot[3] = false;
el17sm 46:f09711580d4a 224 }
el17sm 46:f09711580d4a 225 }
el17sm 46:f09711580d4a 226
el17sm 46:f09711580d4a 227 int available_boss_room()
el17sm 46:f09711580d4a 228 {
el17sm 46:f09711580d4a 229 if (!valid_rooms[room_y - 1][room_x]){
el17sm 46:f09711580d4a 230 rooms[room_y][room_x]->set_doorway(0, true);
el17sm 46:f09711580d4a 231 valid_rooms[room_y - 1][room_x] = true;
el17sm 46:f09711580d4a 232 rooms[room_y - 1][room_x] = new Room(0, 10);
el17sm 46:f09711580d4a 233 rooms[room_y - 1][room_x]->set_doorway(2, true);
el17sm 46:f09711580d4a 234 return 0;
el17sm 46:f09711580d4a 235 } else if (!valid_rooms[room_y][room_x + 1]){
el17sm 46:f09711580d4a 236 rooms[room_y][room_x]->set_doorway(1, true);
el17sm 46:f09711580d4a 237 valid_rooms[room_y][room_x + 1] = true;
el17sm 46:f09711580d4a 238 rooms[room_y][room_x + 1] = new Room(0, 10);
el17sm 46:f09711580d4a 239 rooms[room_y][room_x + 1]->set_doorway(3, true);
el17sm 46:f09711580d4a 240 return 1;
el17sm 46:f09711580d4a 241 } else if (!valid_rooms[room_y + 1][room_x]){
el17sm 46:f09711580d4a 242 rooms[room_y][room_x]->set_doorway(2, true);
el17sm 46:f09711580d4a 243 valid_rooms[room_y + 1][room_x] = true;
el17sm 46:f09711580d4a 244 rooms[room_y + 1][room_x] = new Room(0, 10);
el17sm 46:f09711580d4a 245 rooms[room_y + 1][room_x]->set_doorway(0, true);
el17sm 46:f09711580d4a 246 return 2;
el17sm 46:f09711580d4a 247 } else if (!valid_rooms[room_y][room_x - 1]){
el17sm 46:f09711580d4a 248 rooms[room_y][room_x]->set_doorway(3, true);
el17sm 46:f09711580d4a 249 valid_rooms[room_y][room_x - 1] = true;
el17sm 46:f09711580d4a 250 rooms[room_y][room_x - 1] = new Room(0, 10);
el17sm 46:f09711580d4a 251 rooms[room_y][room_x - 1]->set_doorway(1, true);
el17sm 46:f09711580d4a 252 return 3;
el17sm 46:f09711580d4a 253 }
el17sm 46:f09711580d4a 254 delete rooms[room_y - 1][room_x];
el17sm 46:f09711580d4a 255 rooms[room_y - 1][room_x] = new Room(0, 10);
el17sm 46:f09711580d4a 256 rooms[room_y - 1][room_x]->set_doorway(2, true);
el17sm 46:f09711580d4a 257 return 0;
el17sm 46:f09711580d4a 258 }
el17sm 46:f09711580d4a 259
el17sm 46:f09711580d4a 260 void minimap_detection()
el17sm 46:f09711580d4a 261 {
el17sm 46:f09711580d4a 262 while(gamepad.check_event(Gamepad::BACK_PRESSED)) {
el17sm 46:f09711580d4a 263 lcd.clear();
el17sm 46:f09711580d4a 264 lcd.refresh();
el17sm 46:f09711580d4a 265 wait_ms(1000/40);
el17sm 46:f09711580d4a 266 };
el17sm 46:f09711580d4a 267 }