Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed MotionSensor
RoomEngine/Room/Room.cpp@59:fd4669864b67, 2019-05-09 (annotated)
- Committer:
- el17sm
- Date:
- Thu May 09 14:49:27 2019 +0000
- Revision:
- 59:fd4669864b67
- Parent:
- 51:4d0cd75e7ed3
wtf y no work
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |