Steven Mahasin / Mbed 2 deprecated DreamDungeon

Dependencies:   mbed MotionSensor

Committer:
el17sm
Date:
Thu May 09 14:55:43 2019 +0000
Revision:
60:44ddfb791e2b
Parent:
RoomEngine/Room/Room.cpp@51:4d0cd75e7ed3
Separated

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17sm 30:ec915d24d3e9 1 #include "Room.h"
el17sm 30:ec915d24d3e9 2
el17sm 30:ec915d24d3e9 3 // Constructor
el17sm 36:92d131695e7c 4 Room::Room(int no_of_enemies, int room_type)
el17sm 30:ec915d24d3e9 5 {
el17sm 51:4d0cd75e7ed3 6 _before_boss_room = 4;
el17sm 51:4d0cd75e7ed3 7
el17sm 37:a404860171a9 8 _room_type = room_type;
el17sm 45:8725b4171646 9
el17sm 51:4d0cd75e7ed3 10 for(int side = 0; side < 4; side++) {
el17sm 51:4d0cd75e7ed3 11 _doorways[side] = false;
el17sm 45:8725b4171646 12 }
el17sm 37:a404860171a9 13 for(int id = 0; id < MAX_ENEMIES; id++) {
el17sm 37:a404860171a9 14 valid_collectibles[id] = false;
el17sm 37:a404860171a9 15 }
el17sm 51:4d0cd75e7ed3 16
el17sm 51:4d0cd75e7ed3 17 if(room_type >= 10) { // Special Case for Boss rooms
el17sm 41:0697508a28ba 18 init_boss_room();
el17sm 41:0697508a28ba 19 } else {
el17sm 41:0697508a28ba 20 for (int id = 0; id < MAX_ENEMIES; id++) {
el17sm 41:0697508a28ba 21 valid_enemies[id] = id < no_of_enemies;
el17sm 51:4d0cd75e7ed3 22 if (id < no_of_enemies) { // For every undefined valid enemy, define:
el17sm 44:cc4cecfc639f 23 enemies_type[id] = (int)(rand() % 3)/2; // 2/3 chance headless 1/3 chance snake
el17sm 51:4d0cd75e7ed3 24 rand_enemy_coordinate(id); // define random spawn coordinate
el17sm 41:0697508a28ba 25 }
el17sm 41:0697508a28ba 26 }
el17sm 44:cc4cecfc639f 27 if (room_type == 0){
el17sm 41:0697508a28ba 28 init_normal_room();
el17sm 44:cc4cecfc639f 29 } else if (room_type == 1){
el17sm 44:cc4cecfc639f 30 init_middle_walled_room();
el17sm 41:0697508a28ba 31 } else if (room_type == 2){
el17sm 41:0697508a28ba 32 init_side_walled_room();
el17sm 41:0697508a28ba 33 }
el17sm 39:0c2521949429 34 }
el17sm 39:0c2521949429 35 }
el17sm 39:0c2521949429 36
el17sm 43:63f5c9d9689c 37 void Room::init_boss_room()
el17sm 43:63f5c9d9689c 38 {
el17sm 43:63f5c9d9689c 39 valid_walls[0] = false;
el17sm 43:63f5c9d9689c 40 valid_walls[1] = false;
el17sm 43:63f5c9d9689c 41 valid_enemies[0] = true;
el17sm 51:4d0cd75e7ed3 42 for (int id = 1; id < MAX_ENEMIES; id++) { // Updating valid_enemies to be false for all the others
el17sm 51:4d0cd75e7ed3 43 valid_enemies[id] = false;
el17sm 51:4d0cd75e7ed3 44 }
el17sm 43:63f5c9d9689c 45 }
el17sm 43:63f5c9d9689c 46
el17sm 41:0697508a28ba 47 void Room::init_normal_room()
el17sm 39:0c2521949429 48 {
el17sm 41:0697508a28ba 49 valid_walls[0] = false;
el17sm 41:0697508a28ba 50 valid_walls[1] = false;
el17sm 39:0c2521949429 51 }
el17sm 39:0c2521949429 52
el17sm 41:0697508a28ba 53 void Room::init_middle_walled_room()
el17sm 39:0c2521949429 54 {
el17sm 41:0697508a28ba 55 valid_walls[0] = true;
el17sm 41:0697508a28ba 56 _wall_stat[0][0] = 14;
el17sm 41:0697508a28ba 57 _wall_stat[0][1] = 22;
el17sm 41:0697508a28ba 58 _wall_stat[0][2] = 56;
el17sm 41:0697508a28ba 59 _wall_stat[0][3] = 12;
el17sm 39:0c2521949429 60
el17sm 41:0697508a28ba 61 valid_walls[1] = false;
el17sm 39:0c2521949429 62 }
el17sm 37:a404860171a9 63
el17sm 41:0697508a28ba 64 void Room::init_side_walled_room()
el17sm 39:0c2521949429 65 {
el17sm 41:0697508a28ba 66 valid_walls[0] = true;
el17sm 41:0697508a28ba 67 _wall_stat[0][0] = 16;
el17sm 41:0697508a28ba 68 _wall_stat[0][1] = 18;
el17sm 41:0697508a28ba 69 _wall_stat[0][2] = 7;
el17sm 41:0697508a28ba 70 _wall_stat[0][3] = 19;
el17sm 39:0c2521949429 71
el17sm 41:0697508a28ba 72 valid_walls[1] = true;
el17sm 41:0697508a28ba 73 _wall_stat[1][0] = 61;
el17sm 41:0697508a28ba 74 _wall_stat[1][1] = 18;
el17sm 41:0697508a28ba 75 _wall_stat[1][2] = 7;
el17sm 41:0697508a28ba 76 _wall_stat[1][3] = 19;
el17sm 39:0c2521949429 77 }
el17sm 39:0c2521949429 78
el17sm 51:4d0cd75e7ed3 79 // Deconstructor
el17sm 51:4d0cd75e7ed3 80 Room::~Room()
el17sm 51:4d0cd75e7ed3 81 {
el17sm 51:4d0cd75e7ed3 82
el17sm 51:4d0cd75e7ed3 83 }
el17sm 51:4d0cd75e7ed3 84
el17sm 45:8725b4171646 85 // Mutator
el17sm 51:4d0cd75e7ed3 86 void Room::set_doorway(int index, bool doorway_value) // Sets doorways to the needed value at index
el17sm 46:f09711580d4a 87 {
el17sm 46:f09711580d4a 88 _doorways[index] = doorway_value;
el17sm 46:f09711580d4a 89 }
el17sm 46:f09711580d4a 90
el17sm 51:4d0cd75e7ed3 91 void Room::set_boss_doorway(int before_boss_room) // Sets the boss doorway
el17sm 45:8725b4171646 92 {
el17sm 45:8725b4171646 93 _before_boss_room = before_boss_room;
el17sm 45:8725b4171646 94 }
el17sm 45:8725b4171646 95
el17sm 30:ec915d24d3e9 96 // Accessors
el17sm 34:1d5b4da3935e 97 char * Room::get_current_map_2d(){
el17sm 36:92d131695e7c 98 return ((char *)level_map[0][0]);
el17sm 30:ec915d24d3e9 99 }
el17sm 30:ec915d24d3e9 100
el17sm 46:f09711580d4a 101 bool * Room::get_doorways()
el17sm 46:f09711580d4a 102 {
el17sm 30:ec915d24d3e9 103 return (bool *)_doorways;
el17sm 30:ec915d24d3e9 104 }
el17sm 30:ec915d24d3e9 105
el17sm 46:f09711580d4a 106 bool Room::get_doorway(int index)
el17sm 46:f09711580d4a 107 {
el17sm 51:4d0cd75e7ed3 108 return _doorways[index];
el17sm 46:f09711580d4a 109 }
el17sm 46:f09711580d4a 110
el17sm 45:8725b4171646 111 char Room::get_room_type()
el17sm 45:8725b4171646 112 {
el17sm 45:8725b4171646 113 return _room_type;
el17sm 45:8725b4171646 114 }
el17sm 45:8725b4171646 115
el17sm 46:f09711580d4a 116 int Room::get_boss_doorway()
el17sm 46:f09711580d4a 117 {
el17sm 46:f09711580d4a 118 return _before_boss_room;
el17sm 46:f09711580d4a 119 }
el17sm 46:f09711580d4a 120
el17sm 30:ec915d24d3e9 121 // Functions
el17sm 44:cc4cecfc639f 122 void Room::rand_enemy_coordinate(int id)
el17sm 44:cc4cecfc639f 123 {
el17sm 51:4d0cd75e7ed3 124 _spawn_point_coord = rand() % n_spawn_points[_room_type]; // Random available spawning coordinate ID
el17sm 44:cc4cecfc639f 125 _spawn_point_counter = 0;
el17sm 44:cc4cecfc639f 126 for(int i = 0; i < WIDTH; i++) {
el17sm 44:cc4cecfc639f 127 for(int j = 0; j < HEIGHT; j++) {
el17sm 51:4d0cd75e7ed3 128 if(spawn_area[_room_type][j][i] == 0){ // Locate available spawning coordinate
el17sm 51:4d0cd75e7ed3 129 _spawn_point_counter++; // Increment counter ID
el17sm 44:cc4cecfc639f 130 }
el17sm 51:4d0cd75e7ed3 131 if(_spawn_point_counter >= _spawn_point_coord){ // If counter ID reaches the random coordinate ID
el17sm 51:4d0cd75e7ed3 132 _enemy_coord[id][0] = i; // Set the random coordinate
el17sm 44:cc4cecfc639f 133 _enemy_coord[id][1] = j;
el17sm 44:cc4cecfc639f 134 goto enemy_coord_set;
el17sm 44:cc4cecfc639f 135 }
el17sm 44:cc4cecfc639f 136 }
el17sm 44:cc4cecfc639f 137 }
el17sm 51:4d0cd75e7ed3 138 enemy_coord_set:{} // Acts as a break since there are two for loops
el17sm 44:cc4cecfc639f 139 }
el17sm 44:cc4cecfc639f 140
el17sm 51:4d0cd75e7ed3 141 void Room::load() // Spawns all Mobs and Walls with reset status (HP, Attack etc) given that they have not died yet (still valid)
el17sm 30:ec915d24d3e9 142 {
el17sm 44:cc4cecfc639f 143 if(_room_type == 10) {
el17sm 37:a404860171a9 144 if (valid_enemies[0]) {
el17sm 37:a404860171a9 145 enemies[0] = new Skull(33, 23);
el17sm 37:a404860171a9 146 }
el17sm 36:92d131695e7c 147 } else {
el17sm 36:92d131695e7c 148 for (int id = 0; id < MAX_ENEMIES; id++) {
el17sm 36:92d131695e7c 149 if (valid_enemies[id]) {
el17sm 36:92d131695e7c 150 switch(enemies_type[id]){
el17sm 36:92d131695e7c 151 case 0 :
el17sm 51:4d0cd75e7ed3 152 enemies[id] = new Headless(_enemy_coord[id][0], _enemy_coord[id][1]); break;
el17sm 36:92d131695e7c 153 case 1 :
el17sm 51:4d0cd75e7ed3 154 enemies[id] = new Snake(_enemy_coord[id][0], _enemy_coord[id][1]); break;
el17sm 36:92d131695e7c 155 }
el17sm 30:ec915d24d3e9 156 }
el17sm 30:ec915d24d3e9 157 }
el17sm 41:0697508a28ba 158 for (int id = 0; id < 2; id++) {
el17sm 41:0697508a28ba 159 if (valid_walls[id]) {
el17sm 41:0697508a28ba 160 walls[id] = new Walls(_wall_stat[id][0], _wall_stat[id][1], _wall_stat[id][2], _wall_stat[id][3]);
el17sm 41:0697508a28ba 161 }
el17sm 41:0697508a28ba 162 }
el17sm 30:ec915d24d3e9 163 }
el17sm 30:ec915d24d3e9 164 }
el17sm 30:ec915d24d3e9 165
el17sm 51:4d0cd75e7ed3 166 void Room::unload() // Delete existing enemies and walls
el17sm 30:ec915d24d3e9 167 {
el17sm 30:ec915d24d3e9 168 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 30:ec915d24d3e9 169 if (valid_enemies[i]) {
el17sm 30:ec915d24d3e9 170 delete enemies[i];
el17sm 30:ec915d24d3e9 171 }
el17sm 41:0697508a28ba 172 }
el17sm 41:0697508a28ba 173 for (int i = 0; i < 2; i++){
el17sm 41:0697508a28ba 174 if (valid_walls[i]) {
el17sm 41:0697508a28ba 175 delete walls[i];
el17sm 41:0697508a28ba 176 }
el17sm 41:0697508a28ba 177 }
el17sm 41:0697508a28ba 178 }
el17sm 41:0697508a28ba 179
el17sm 51:4d0cd75e7ed3 180 void Room::update_doorways() // If it's a boss, close the doorways, else,
el17sm 45:8725b4171646 181 {
el17sm 46:f09711580d4a 182 if(_room_type == 10) {
el17sm 45:8725b4171646 183 _doorways[0] = false;
el17sm 45:8725b4171646 184 _doorways[1] = false;
el17sm 45:8725b4171646 185 _doorways[2] = false;
el17sm 45:8725b4171646 186 _doorways[3] = false;
el17sm 45:8725b4171646 187 }
el17sm 45:8725b4171646 188 }
el17sm 45:8725b4171646 189
el17sm 41:0697508a28ba 190 void Room::draw(N5110 &lcd, int j)
el17sm 41:0697508a28ba 191 {
el17sm 41:0697508a28ba 192 draw_enemies(lcd, j);
el17sm 41:0697508a28ba 193 draw_collectibles(lcd, j);
el17sm 41:0697508a28ba 194 draw_walls(lcd, j);
el17sm 30:ec915d24d3e9 195 }
el17sm 30:ec915d24d3e9 196
el17sm 43:63f5c9d9689c 197 void Room::draw_enemies(N5110 &lcd, int j)
el17sm 43:63f5c9d9689c 198 {
el17sm 43:63f5c9d9689c 199 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 43:63f5c9d9689c 200 if (valid_enemies[i]) {
el17sm 43:63f5c9d9689c 201 if (enemies[i]->get_pos_y() == j) {
el17sm 43:63f5c9d9689c 202 enemies[i]->draw(lcd);
el17sm 43:63f5c9d9689c 203 }
el17sm 43:63f5c9d9689c 204 }
el17sm 43:63f5c9d9689c 205 }
el17sm 43:63f5c9d9689c 206 }
el17sm 43:63f5c9d9689c 207
el17sm 43:63f5c9d9689c 208 void Room::draw_collectibles(N5110 &lcd, int j)
el17sm 43:63f5c9d9689c 209 {
el17sm 43:63f5c9d9689c 210 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 43:63f5c9d9689c 211 if (valid_collectibles[i]) {
el17sm 43:63f5c9d9689c 212 if (collectibles[i]->get_pos_y() == j) {
el17sm 43:63f5c9d9689c 213 collectibles[i]->draw(lcd);
el17sm 43:63f5c9d9689c 214 }
el17sm 43:63f5c9d9689c 215 }
el17sm 43:63f5c9d9689c 216 }
el17sm 43:63f5c9d9689c 217 }
el17sm 43:63f5c9d9689c 218
el17sm 43:63f5c9d9689c 219 void Room::draw_walls(N5110 &lcd, int j)
el17sm 43:63f5c9d9689c 220 {
el17sm 43:63f5c9d9689c 221 for (int i = 0; i < 2; i++) {
el17sm 43:63f5c9d9689c 222 if (valid_walls[i]) {
el17sm 43:63f5c9d9689c 223 if (walls[i]->get_pos_y() == j) {
el17sm 43:63f5c9d9689c 224 walls[i]->draw(lcd);
el17sm 43:63f5c9d9689c 225 }
el17sm 43:63f5c9d9689c 226 }
el17sm 43:63f5c9d9689c 227 }
el17sm 43:63f5c9d9689c 228 }
el17sm 30:ec915d24d3e9 229 void Room::draw_room(N5110 &lcd)
el17sm 30:ec915d24d3e9 230 {
el17sm 36:92d131695e7c 231 lcd.drawSprite(0, 0, screen_height, screen_width, (char *)level_map[1]); // drawing 3d map
el17sm 51:4d0cd75e7ed3 232 draw_doorways(lcd); // Draw walls that are behind the player
el17sm 46:f09711580d4a 233 if (_before_boss_room == 0) { // Displaying Special Doorway to Boss room
el17sm 46:f09711580d4a 234 lcd.drawSprite(35, 0, 12, 14, (char *)boss_doorway_n[0]);
el17sm 44:cc4cecfc639f 235 }
el17sm 30:ec915d24d3e9 236 }
el17sm 30:ec915d24d3e9 237
el17sm 41:0697508a28ba 238 void Room::draw_doorways(N5110 &lcd)
el17sm 30:ec915d24d3e9 239 {
el17sm 41:0697508a28ba 240 if(!_doorways[0]) { // N
el17sm 41:0697508a28ba 241 lcd.drawSprite(36, 0, 10, 12, (char *)wall_n);
el17sm 30:ec915d24d3e9 242 }
el17sm 30:ec915d24d3e9 243 }
el17sm 30:ec915d24d3e9 244
el17sm 30:ec915d24d3e9 245 void Room::draw_room_overlay(N5110 &lcd)
el17sm 30:ec915d24d3e9 246 {
el17sm 36:92d131695e7c 247 lcd.drawSpriteTransparent(0, 0, screen_height, screen_width, (char *)level_map[2]); // drawing 3d map overlay
el17sm 41:0697508a28ba 248 draw_doorways_overlay(lcd);
el17sm 46:f09711580d4a 249 if (_before_boss_room == 0) { // Displaying Special Doorway to Boss room
el17sm 46:f09711580d4a 250 lcd.drawSpriteTransparent(35, 0, 12, 14, (char *)boss_doorway_n[1]);
el17sm 46:f09711580d4a 251 } else if (_before_boss_room == 1) {
el17sm 46:f09711580d4a 252 lcd.drawSpriteTransparent(79, 14, 19, 5, (char *)boss_doorway_e);
el17sm 46:f09711580d4a 253 } else if (_before_boss_room == 2) {
el17sm 46:f09711580d4a 254 lcd.drawSpriteTransparent(35, 41, 7, 14, (char *)boss_doorway_s);
el17sm 46:f09711580d4a 255 } else if (_before_boss_room == 3) {
el17sm 46:f09711580d4a 256 lcd.drawSpriteTransparent(0, 14, 19, 5, (char *)boss_doorway_w);
el17sm 44:cc4cecfc639f 257 }
el17sm 30:ec915d24d3e9 258 }
el17sm 30:ec915d24d3e9 259
el17sm 51:4d0cd75e7ed3 260 void Room::draw_doorways_overlay(N5110 &lcd) // Draw walls that are in front of the player
el17sm 30:ec915d24d3e9 261 {
el17sm 41:0697508a28ba 262 if(!_doorways[1]) { // E
el17sm 41:0697508a28ba 263 lcd.drawSpriteTransparent(81, 15, 11, 3, (char *)wall_x[0]);
el17sm 30:ec915d24d3e9 264 }
el17sm 41:0697508a28ba 265 if(!_doorways[2]) { // S
el17sm 41:0697508a28ba 266 lcd.drawSpriteTransparent(36, 45, 3, 12, (char *)wall_s);
el17sm 30:ec915d24d3e9 267 }
el17sm 41:0697508a28ba 268 if(!_doorways[3]) { // W
el17sm 41:0697508a28ba 269 lcd.drawSpriteTransparent(0, 15, 11, 3, (char *)wall_x[1]);
el17sm 30:ec915d24d3e9 270 }
el17sm 45:8725b4171646 271 }
el17sm 45:8725b4171646 272
el17sm 51:4d0cd75e7ed3 273 bool Room::enemies_exist() // Returns true if valid enemies exist
el17sm 45:8725b4171646 274 {
el17sm 45:8725b4171646 275 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 45:8725b4171646 276 if (valid_enemies[i]) {
el17sm 45:8725b4171646 277 return true;
el17sm 45:8725b4171646 278 }
el17sm 45:8725b4171646 279 }
el17sm 45:8725b4171646 280 return false;
el17sm 30:ec915d24d3e9 281 }