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

Dependencies:   mbed MotionSensor

Committer:
el17sm
Date:
Tue May 07 17:02:30 2019 +0000
Revision:
41:0697508a28ba
Parent:
40:cbcbf6fc1421
Child:
42:cdcda895cb1b
Added room types and wall entity

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17sm 26:abbc19edc5c1 1 #include "RoomEngine.h"
el17sm 32:fe6359ef9916 2 // Constructor
el17sm 41:0697508a28ba 3 RoomEngine::RoomEngine(float global_contrast)
el17sm 26:abbc19edc5c1 4 {
el17sm 29:6b8411bb040a 5 _room_x = 5;
el17sm 29:6b8411bb040a 6 _room_y = 5;
el17sm 30:ec915d24d3e9 7 _global_contrast = global_contrast;
el17sm 26:abbc19edc5c1 8 }
el17sm 26:abbc19edc5c1 9
el17sm 32:fe6359ef9916 10 // Destructor
el17sm 27:a1b41626f57c 11 RoomEngine::~RoomEngine()
el17sm 27:a1b41626f57c 12 {
el17sm 40:cbcbf6fc1421 13 room->unload();
el17sm 27:a1b41626f57c 14 }
el17sm 27:a1b41626f57c 15
el17sm 32:fe6359ef9916 16 // Public Functions
el17sm 31:ab24d028ddfd 17 void RoomEngine::load(Player *current_player, Room *current_room)
el17sm 28:98848e6a77a2 18 {
el17sm 31:ab24d028ddfd 19 player = current_player;
el17sm 29:6b8411bb040a 20 room = current_room;
el17sm 28:98848e6a77a2 21 set_input(0,0,0,0,0,0,0,0);
el17sm 28:98848e6a77a2 22 update_player_position(check_player_room_position());
el17sm 28:98848e6a77a2 23 }
el17sm 28:98848e6a77a2 24
el17sm 28:98848e6a77a2 25 void RoomEngine::entrance_scene(N5110 &lcd, Gamepad &gamepad)
el17sm 27:a1b41626f57c 26 {
el17sm 28:98848e6a77a2 27 int side = check_player_room_position();
el17sm 28:98848e6a77a2 28
el17sm 28:98848e6a77a2 29 for(int i = 0; i<50; i++) {
el17sm 28:98848e6a77a2 30 switch(side) {
el17sm 28:98848e6a77a2 31 case 0 :
el17sm 41:0697508a28ba 32 set_mapped_coord(0, -((4 + player->get_sprite_height()) / (50 * player->get_velocity())));
el17sm 28:98848e6a77a2 33 break;
el17sm 28:98848e6a77a2 34 case 1 :
el17sm 41:0697508a28ba 35 set_mapped_coord(-((4 + player->get_hitbox_width()) / (50 * player->get_velocity())), 0);
el17sm 28:98848e6a77a2 36 break;
el17sm 28:98848e6a77a2 37 case 2 :
el17sm 41:0697508a28ba 38 set_mapped_coord(0, ((4 + player->get_hitbox_height()) / (50 * player->get_velocity())));
el17sm 28:98848e6a77a2 39 break;
el17sm 28:98848e6a77a2 40 case 3 :
el17sm 41:0697508a28ba 41 set_mapped_coord(((4 + player->get_hitbox_width()) / (50 * player->get_velocity())), 0);
el17sm 28:98848e6a77a2 42 break;
el17sm 28:98848e6a77a2 43 }
el17sm 28:98848e6a77a2 44 move_player();
el17sm 28:98848e6a77a2 45 render(lcd, gamepad);
el17sm 30:ec915d24d3e9 46 if (0.75 - (i * 0.005) > _global_contrast) {
el17sm 30:ec915d24d3e9 47 lcd.setContrast(0.75 - (i * 0.005));
el17sm 30:ec915d24d3e9 48 } else {
el17sm 30:ec915d24d3e9 49 lcd.setContrast(_global_contrast);
el17sm 30:ec915d24d3e9 50 }
el17sm 28:98848e6a77a2 51 }
el17sm 28:98848e6a77a2 52 }
el17sm 28:98848e6a77a2 53
el17sm 28:98848e6a77a2 54 void RoomEngine::exit_scene(N5110 &lcd, Gamepad &gamepad)
el17sm 28:98848e6a77a2 55 {
el17sm 28:98848e6a77a2 56 int side = check_player_room_position();
el17sm 28:98848e6a77a2 57
el17sm 28:98848e6a77a2 58 for(int i = 0; i<50; i++) {
el17sm 28:98848e6a77a2 59 switch(side) {
el17sm 28:98848e6a77a2 60 case 0 :
el17sm 28:98848e6a77a2 61 set_mapped_coord(0, (player->get_velocity() / 2));
el17sm 28:98848e6a77a2 62 break;
el17sm 28:98848e6a77a2 63 case 1 :
el17sm 28:98848e6a77a2 64 set_mapped_coord((player->get_velocity() / 2), 0);
el17sm 28:98848e6a77a2 65 break;
el17sm 28:98848e6a77a2 66 case 2 :
el17sm 28:98848e6a77a2 67 set_mapped_coord(0, -(player->get_velocity() / 2));
el17sm 28:98848e6a77a2 68 break;
el17sm 28:98848e6a77a2 69 case 3 :
el17sm 28:98848e6a77a2 70 set_mapped_coord(-(player->get_velocity() / 2), 0);
el17sm 28:98848e6a77a2 71 break;
el17sm 28:98848e6a77a2 72 }
el17sm 28:98848e6a77a2 73 move_player();
el17sm 28:98848e6a77a2 74 render(lcd, gamepad);
el17sm 30:ec915d24d3e9 75 lcd.setContrast(_global_contrast + (i * 0.005));
el17sm 28:98848e6a77a2 76 }
el17sm 30:ec915d24d3e9 77 lcd.setContrast(0.75);
el17sm 27:a1b41626f57c 78 }
el17sm 27:a1b41626f57c 79
el17sm 29:6b8411bb040a 80 void RoomEngine::update_current_room()
el17sm 29:6b8411bb040a 81 {
el17sm 29:6b8411bb040a 82 switch(check_player_room_position()) {
el17sm 29:6b8411bb040a 83 case 0 :
el17sm 29:6b8411bb040a 84 _room_y++;
el17sm 29:6b8411bb040a 85 break;
el17sm 29:6b8411bb040a 86 case 1 :
el17sm 29:6b8411bb040a 87 _room_x++;
el17sm 29:6b8411bb040a 88 break;
el17sm 29:6b8411bb040a 89 case 2 :
el17sm 29:6b8411bb040a 90 _room_y--;
el17sm 29:6b8411bb040a 91 break;
el17sm 29:6b8411bb040a 92 case 3 :
el17sm 29:6b8411bb040a 93 _room_x--;
el17sm 29:6b8411bb040a 94 break;
el17sm 29:6b8411bb040a 95 default :
el17sm 29:6b8411bb040a 96 break;
el17sm 29:6b8411bb040a 97 }
el17sm 29:6b8411bb040a 98 }
el17sm 29:6b8411bb040a 99
el17sm 27:a1b41626f57c 100 void RoomEngine::read_input(Gamepad &gamepad)
el17sm 26:abbc19edc5c1 101 {
el17sm 26:abbc19edc5c1 102 _L = gamepad.check_event(Gamepad::L_PRESSED);
el17sm 26:abbc19edc5c1 103 _R = gamepad.check_event(Gamepad::R_PRESSED);
el17sm 26:abbc19edc5c1 104 _A = gamepad.check_event(Gamepad::A_PRESSED);
el17sm 26:abbc19edc5c1 105 _B = gamepad.check_event(Gamepad::B_PRESSED);
el17sm 26:abbc19edc5c1 106 _X = gamepad.check_event(Gamepad::X_PRESSED);
el17sm 26:abbc19edc5c1 107 _Y = gamepad.check_event(Gamepad::Y_PRESSED);
el17sm 26:abbc19edc5c1 108 mapped_coord = gamepad.get_mapped_coord();
el17sm 26:abbc19edc5c1 109 }
el17sm 26:abbc19edc5c1 110
el17sm 27:a1b41626f57c 111 void RoomEngine::update()
el17sm 26:abbc19edc5c1 112 {
el17sm 26:abbc19edc5c1 113 check_damage();
el17sm 27:a1b41626f57c 114 check_enemies_death();
el17sm 41:0697508a28ba 115 check_walls_collision();
el17sm 26:abbc19edc5c1 116 move();
el17sm 27:a1b41626f57c 117 player->buttons(_A, _B, _Y, _X);
el17sm 26:abbc19edc5c1 118 }
el17sm 26:abbc19edc5c1 119
el17sm 27:a1b41626f57c 120 void RoomEngine::render(N5110 &lcd, Gamepad &gamepad)
el17sm 27:a1b41626f57c 121 {
el17sm 27:a1b41626f57c 122 minimap_detection(lcd, gamepad);
el17sm 27:a1b41626f57c 123 pause_detection(lcd, gamepad);
el17sm 27:a1b41626f57c 124 lcd.clear();
el17sm 27:a1b41626f57c 125 draw(lcd);
el17sm 27:a1b41626f57c 126 lcd.refresh();
el17sm 27:a1b41626f57c 127 wait_ms(1000/40); // setting FPS
el17sm 27:a1b41626f57c 128 }
el17sm 27:a1b41626f57c 129
el17sm 28:98848e6a77a2 130 int RoomEngine::check_player_room_position() // returns 0,1,2,3 if the player exits the respective directions, returns 4 if the player is in the room
el17sm 28:98848e6a77a2 131 {
el17sm 28:98848e6a77a2 132 if (player->get_pos_y() < 0) {
el17sm 28:98848e6a77a2 133 return 0;
el17sm 28:98848e6a77a2 134 }
el17sm 28:98848e6a77a2 135 else if (player->get_pos_x() > WIDTH - (player->get_hitbox_width())) {
el17sm 28:98848e6a77a2 136 return 1;
el17sm 28:98848e6a77a2 137 }
el17sm 28:98848e6a77a2 138 else if (player->get_pos_y() > HEIGHT - (player->get_hitbox_height())) {
el17sm 28:98848e6a77a2 139 return 2;
el17sm 28:98848e6a77a2 140 }
el17sm 28:98848e6a77a2 141 else if (player->get_pos_x() < 0) {
el17sm 28:98848e6a77a2 142 return 3;
el17sm 28:98848e6a77a2 143 }
el17sm 28:98848e6a77a2 144 else {
el17sm 28:98848e6a77a2 145 return 4;
el17sm 28:98848e6a77a2 146 }
el17sm 28:98848e6a77a2 147 }
el17sm 28:98848e6a77a2 148
el17sm 29:6b8411bb040a 149 // Public Accessors
el17sm 29:6b8411bb040a 150
el17sm 29:6b8411bb040a 151 int RoomEngine::get_room_x()
el17sm 29:6b8411bb040a 152 {
el17sm 29:6b8411bb040a 153 return _room_x;
el17sm 29:6b8411bb040a 154 }
el17sm 29:6b8411bb040a 155 int RoomEngine::get_room_y()
el17sm 29:6b8411bb040a 156 {
el17sm 29:6b8411bb040a 157 return _room_y;
el17sm 29:6b8411bb040a 158 }
el17sm 29:6b8411bb040a 159
el17sm 28:98848e6a77a2 160 // Private Mutators
el17sm 28:98848e6a77a2 161
el17sm 28:98848e6a77a2 162 void RoomEngine::set_input(bool L, bool R, bool A, bool B, bool X, bool Y, float mapped_x, float mapped_y)
el17sm 28:98848e6a77a2 163 {
el17sm 28:98848e6a77a2 164 _L = L;
el17sm 28:98848e6a77a2 165 _R = R;
el17sm 28:98848e6a77a2 166 _A = A;
el17sm 28:98848e6a77a2 167 _B = B;
el17sm 28:98848e6a77a2 168 _X = X;
el17sm 28:98848e6a77a2 169 _Y = Y;
el17sm 28:98848e6a77a2 170 set_mapped_coord(mapped_x, mapped_y);
el17sm 28:98848e6a77a2 171 }
el17sm 28:98848e6a77a2 172
el17sm 28:98848e6a77a2 173 void RoomEngine::set_mapped_coord(float x, float y)
el17sm 28:98848e6a77a2 174 {
el17sm 28:98848e6a77a2 175 mapped_coord.x = x;
el17sm 28:98848e6a77a2 176 mapped_coord.y = y;
el17sm 28:98848e6a77a2 177 }
el17sm 28:98848e6a77a2 178
el17sm 26:abbc19edc5c1 179 // Private Functions
el17sm 26:abbc19edc5c1 180
el17sm 27:a1b41626f57c 181 bool RoomEngine::entity_collision(Entity &a, Entity &b) // returns true if the two entity hitboxes collide
el17sm 26:abbc19edc5c1 182 {
el17sm 26:abbc19edc5c1 183 if (((b.get_pos_x() <= a.get_pos_x()) && (a.get_pos_x() <= b.get_pos_x() + b.get_hitbox_width() - 1)) ||
el17sm 26:abbc19edc5c1 184 ((b.get_pos_x() <= a.get_pos_x() + a.get_hitbox_width() - 1) && (a.get_pos_x() + a.get_hitbox_width() - 1 <= b.get_pos_x() + b.get_hitbox_width() - 1))) {
el17sm 26:abbc19edc5c1 185 if (((b.get_pos_y() <= a.get_pos_y()) && (a.get_pos_y() <= b.get_pos_y() + b.get_hitbox_height() - 1)) ||
el17sm 26:abbc19edc5c1 186 ((b.get_pos_y() <= a.get_pos_y() + a.get_hitbox_height() - 1) && (a.get_pos_y() + a.get_hitbox_height() - 1 <= b.get_pos_y() + b.get_hitbox_height() - 1))) {
el17sm 26:abbc19edc5c1 187 return true;
el17sm 26:abbc19edc5c1 188 }
el17sm 26:abbc19edc5c1 189 }
el17sm 26:abbc19edc5c1 190 return 0;
el17sm 26:abbc19edc5c1 191 }
el17sm 26:abbc19edc5c1 192
el17sm 26:abbc19edc5c1 193 // returns true if the hitbox of "entity a" collides with any hitboxes of enttities within "array" as "entity a" moves on the x direction
el17sm 27:a1b41626f57c 194 float RoomEngine::entity_move_check_x(Entity *a, Entity *array[], int no_of_enemies, int current_entity, bool valid_enemies[])
el17sm 26:abbc19edc5c1 195 {
el17sm 26:abbc19edc5c1 196 for (int i = 0; i < no_of_enemies; i++) {
el17sm 26:abbc19edc5c1 197 if (valid_enemies[i]) {
el17sm 26:abbc19edc5c1 198 if(i != current_entity) {
el17sm 26:abbc19edc5c1 199 if (((array[i]->get_prev_pos_x() <= a->get_pos_x()) && (a->get_pos_x() <= array[i]->get_prev_pos_x() + array[i]->get_hitbox_width() - 1)) ||
el17sm 26:abbc19edc5c1 200 ((array[i]->get_prev_pos_x() <= a->get_pos_x() + a->get_hitbox_width() - 1) && (a->get_pos_x() + a->get_hitbox_width() - 1 <= array[i]->get_prev_pos_x() + array[i]->get_hitbox_width() - 1))) {
el17sm 26:abbc19edc5c1 201 if (((array[i]->get_prev_pos_y() <= a->get_prev_pos_y()) && (a->get_prev_pos_y() <= array[i]->get_prev_pos_y() + array[i]->get_hitbox_height() - 1)) ||
el17sm 26:abbc19edc5c1 202 ((array[i]->get_prev_pos_y() <= a->get_prev_pos_y() + a->get_hitbox_height() - 1) && (a->get_prev_pos_y() + a->get_hitbox_height() - 1 <= array[i]->get_prev_pos_y() + array[i]->get_hitbox_height() - 1))) {
el17sm 26:abbc19edc5c1 203 return (2*((a->get_pos_x() > array[i]->get_prev_pos_x()) - 0.5));
el17sm 26:abbc19edc5c1 204 }
el17sm 26:abbc19edc5c1 205 }
el17sm 26:abbc19edc5c1 206 }
el17sm 26:abbc19edc5c1 207 }
el17sm 26:abbc19edc5c1 208 }
el17sm 26:abbc19edc5c1 209 return 0;
el17sm 26:abbc19edc5c1 210 }
el17sm 26:abbc19edc5c1 211
el17sm 26:abbc19edc5c1 212 // returns true if the hitbox of "entity a" collides with any hitboxes of enttities within "array" as "entity a" moves on the y direction
el17sm 27:a1b41626f57c 213 float RoomEngine::entity_move_check_y(Entity *a, Entity *array[], int no_of_enemies, int current_entity, bool valid_enemies[])
el17sm 26:abbc19edc5c1 214 {
el17sm 26:abbc19edc5c1 215 for (int i = 0; i < no_of_enemies; i++) {
el17sm 26:abbc19edc5c1 216 if (valid_enemies[i]) {
el17sm 26:abbc19edc5c1 217 if(i != current_entity) {
el17sm 26:abbc19edc5c1 218 if (((array[i]->get_prev_pos_x() <= a->get_prev_pos_x()) && (a->get_prev_pos_x() <= array[i]->get_prev_pos_x() + array[i]->get_hitbox_width() - 1)) ||
el17sm 26:abbc19edc5c1 219 ((array[i]->get_prev_pos_x() <= a->get_prev_pos_x() + a->get_hitbox_width() - 1) && (a->get_prev_pos_x() + a->get_hitbox_width() - 1 <= array[i]->get_prev_pos_x() + array[i]->get_hitbox_width() - 1))) {
el17sm 26:abbc19edc5c1 220 if (((array[i]->get_prev_pos_y() <= a->get_pos_y()) && (a->get_pos_y() <= array[i]->get_prev_pos_y() + array[i]->get_hitbox_height() - 1)) ||
el17sm 26:abbc19edc5c1 221 ((array[i]->get_prev_pos_y() <= a->get_pos_y() + a->get_hitbox_height() - 1) && (a->get_pos_y() + a->get_hitbox_height() - 1 <= array[i]->get_prev_pos_y() + array[i]->get_hitbox_height() - 1))) {
el17sm 26:abbc19edc5c1 222 return (2*((a->get_pos_y() > array[i]->get_prev_pos_y()) - 0.5));
el17sm 26:abbc19edc5c1 223 }
el17sm 26:abbc19edc5c1 224 }
el17sm 26:abbc19edc5c1 225 }
el17sm 26:abbc19edc5c1 226 }
el17sm 26:abbc19edc5c1 227 }
el17sm 26:abbc19edc5c1 228 return 0;
el17sm 26:abbc19edc5c1 229 }
el17sm 26:abbc19edc5c1 230
el17sm 27:a1b41626f57c 231 void RoomEngine::check_damage()
el17sm 26:abbc19edc5c1 232 {
el17sm 26:abbc19edc5c1 233 check_damage_player();
el17sm 26:abbc19edc5c1 234 check_damage_enemies();
el17sm 26:abbc19edc5c1 235 }
el17sm 26:abbc19edc5c1 236
el17sm 27:a1b41626f57c 237 void RoomEngine::check_damage_player()
el17sm 26:abbc19edc5c1 238 {
el17sm 26:abbc19edc5c1 239 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 27:a1b41626f57c 240 if (room->valid_enemies[i]) {
el17sm 27:a1b41626f57c 241 if(entity_collision(*player, *room->enemies[i])) {
el17sm 27:a1b41626f57c 242 player->take_damage(room->enemies[i]->get_attack());
el17sm 28:98848e6a77a2 243 break; // only let 1 enemy damage player at a time
el17sm 26:abbc19edc5c1 244 }
el17sm 26:abbc19edc5c1 245 }
el17sm 37:a404860171a9 246 if (room->valid_collectibles[i]) {
el17sm 37:a404860171a9 247 if(entity_collision(*player, *room->collectibles[i])) {
el17sm 37:a404860171a9 248 player->take_damage(room->collectibles[i]->get_attack());
el17sm 37:a404860171a9 249 delete room->collectibles[i];
el17sm 37:a404860171a9 250 room->valid_collectibles[i] = false;
el17sm 37:a404860171a9 251 break; // only let 1 heart heal player at a time
el17sm 37:a404860171a9 252 }
el17sm 37:a404860171a9 253 }
el17sm 27:a1b41626f57c 254 }
el17sm 26:abbc19edc5c1 255 }
el17sm 26:abbc19edc5c1 256
el17sm 27:a1b41626f57c 257 void RoomEngine::check_damage_enemies()
el17sm 26:abbc19edc5c1 258 {
el17sm 28:98848e6a77a2 259 check_damage_enemies_by_bullets();
el17sm 28:98848e6a77a2 260 }
el17sm 28:98848e6a77a2 261
el17sm 28:98848e6a77a2 262 void RoomEngine::check_damage_enemies_by_bullets()
el17sm 28:98848e6a77a2 263 {
el17sm 26:abbc19edc5c1 264 for (int i = 0; i < bullets_max; i++) {
el17sm 27:a1b41626f57c 265 if (player->valid_bullets[i]) {
el17sm 30:ec915d24d3e9 266 if (player->update_bullets(room->get_current_map_2d(), room->get_doorways())) {
el17sm 26:abbc19edc5c1 267 } else {
el17sm 26:abbc19edc5c1 268 for (int j = 0; j < MAX_ENEMIES; j++) {
el17sm 27:a1b41626f57c 269 if (room->valid_enemies[j] && (entity_collision(*player->bullets_array[i], *room->enemies[j]))) {
el17sm 27:a1b41626f57c 270 room->enemies[j]->take_damage(player->get_attack());
el17sm 27:a1b41626f57c 271 player->valid_bullets[i] = false;
el17sm 27:a1b41626f57c 272 delete player->bullets_array[i];
el17sm 26:abbc19edc5c1 273 break;
el17sm 26:abbc19edc5c1 274 }
el17sm 26:abbc19edc5c1 275 }
el17sm 26:abbc19edc5c1 276 }
el17sm 26:abbc19edc5c1 277 }
el17sm 26:abbc19edc5c1 278 }
el17sm 26:abbc19edc5c1 279 }
el17sm 26:abbc19edc5c1 280
el17sm 27:a1b41626f57c 281 void RoomEngine::check_enemies_death()
el17sm 26:abbc19edc5c1 282 {
el17sm 26:abbc19edc5c1 283 // Enemy Death
el17sm 26:abbc19edc5c1 284 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 37:a404860171a9 285 if((room->valid_enemies[i]) && (room->enemies[i]->get_hp() <= 0)) {
el17sm 37:a404860171a9 286 if ((rand() % 100) < room->enemies[i]->get_hp_drop_chance()){
el17sm 37:a404860171a9 287 for (int j = 0; j < MAX_ENEMIES; j++) {
el17sm 37:a404860171a9 288 if (!room->valid_collectibles[j]) {
el17sm 37:a404860171a9 289 room->collectibles[j] = new Health(room->enemies[i]->get_pos_x(), room->enemies[i]->get_pos_y()); // Spawn a health drop
el17sm 37:a404860171a9 290 room->valid_collectibles[j] = true;
el17sm 37:a404860171a9 291 break;
el17sm 37:a404860171a9 292 }
el17sm 28:98848e6a77a2 293 }
el17sm 26:abbc19edc5c1 294 }
el17sm 37:a404860171a9 295 delete room->enemies[i];
el17sm 37:a404860171a9 296 room->valid_enemies[i] = false;
el17sm 26:abbc19edc5c1 297 }
el17sm 26:abbc19edc5c1 298 }
el17sm 26:abbc19edc5c1 299 }
el17sm 26:abbc19edc5c1 300
el17sm 41:0697508a28ba 301 void RoomEngine::check_walls_collision()
el17sm 41:0697508a28ba 302 {
el17sm 41:0697508a28ba 303 // Enemy
el17sm 41:0697508a28ba 304 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 41:0697508a28ba 305 if(room->valid_enemies[i]) {
el17sm 41:0697508a28ba 306 room->enemies[i]->undo_move_x(entity_move_check_x(room->enemies[i], room->walls, 2, 10, room->valid_walls));
el17sm 41:0697508a28ba 307 room->enemies[i]->undo_move_y(entity_move_check_y(room->enemies[i], room->walls, 2, 10, room->valid_walls));
el17sm 41:0697508a28ba 308 }
el17sm 41:0697508a28ba 309 }
el17sm 41:0697508a28ba 310 // Player
el17sm 41:0697508a28ba 311 player->undo_move_x(entity_move_check_x(player, room->walls, 2, 10, room->valid_walls));
el17sm 41:0697508a28ba 312 player->undo_move_y(entity_move_check_y(player, room->walls, 2, 10, room->valid_walls));
el17sm 41:0697508a28ba 313 // Bullets
el17sm 41:0697508a28ba 314 for (int i = 0; i < bullets_max; i++) {
el17sm 41:0697508a28ba 315 for (int j = 0; j < 2; j++) {
el17sm 41:0697508a28ba 316 if ((player->valid_bullets[i]) && (room->valid_walls[j]) && (entity_collision(*player->bullets_array[i], *room->walls[j]))) {
el17sm 41:0697508a28ba 317 delete player->bullets_array[i]; player->valid_bullets[i] = false;
el17sm 41:0697508a28ba 318 }
el17sm 41:0697508a28ba 319 }
el17sm 41:0697508a28ba 320 }
el17sm 41:0697508a28ba 321 }
el17sm 41:0697508a28ba 322
el17sm 27:a1b41626f57c 323 void RoomEngine::move()
el17sm 26:abbc19edc5c1 324 {
el17sm 26:abbc19edc5c1 325 move_player();
el17sm 26:abbc19edc5c1 326 move_enemies();
el17sm 26:abbc19edc5c1 327 }
el17sm 26:abbc19edc5c1 328
el17sm 27:a1b41626f57c 329 void RoomEngine::move_player()
el17sm 26:abbc19edc5c1 330 {
el17sm 29:6b8411bb040a 331 player->move(mapped_coord.x, mapped_coord.y, room->get_current_map_2d(), room->get_doorways());
el17sm 26:abbc19edc5c1 332 }
el17sm 26:abbc19edc5c1 333
el17sm 27:a1b41626f57c 334 void RoomEngine::move_enemies()
el17sm 26:abbc19edc5c1 335 {
el17sm 26:abbc19edc5c1 336 // Actual Movement of Enemies
el17sm 26:abbc19edc5c1 337 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 27:a1b41626f57c 338 if (room->valid_enemies[i]) {
el17sm 27:a1b41626f57c 339 room->enemies[i]->update_prev_pos();
el17sm 29:6b8411bb040a 340 room->enemies[i]->move(player->get_pos_x(), player->get_pos_y(), room->get_current_map_2d(), room->get_doorways());
el17sm 26:abbc19edc5c1 341 }
el17sm 27:a1b41626f57c 342 }
el17sm 26:abbc19edc5c1 343 // Entity Collision Repulsion
el17sm 26:abbc19edc5c1 344 for (int i = 0; i < MAX_ENEMIES; i++) {
el17sm 37:a404860171a9 345 if (room->valid_enemies[i]) {
el17sm 27:a1b41626f57c 346 room->enemies[i]->position_add_x(entity_move_check_x(room->enemies[i], room->enemies, MAX_ENEMIES, i, room->valid_enemies));
el17sm 27:a1b41626f57c 347 room->enemies[i]->position_add_y(entity_move_check_y(room->enemies[i], room->enemies, MAX_ENEMIES, i, room->valid_enemies));
el17sm 26:abbc19edc5c1 348 }
el17sm 27:a1b41626f57c 349 }
el17sm 27:a1b41626f57c 350 }
el17sm 27:a1b41626f57c 351
el17sm 28:98848e6a77a2 352 void RoomEngine::update_player_position(int side)
el17sm 28:98848e6a77a2 353 {
el17sm 28:98848e6a77a2 354 switch(side) {
el17sm 28:98848e6a77a2 355 case 0 :
el17sm 28:98848e6a77a2 356 player->set_position(39, 49);
el17sm 28:98848e6a77a2 357 break;
el17sm 28:98848e6a77a2 358 case 1 :
el17sm 28:98848e6a77a2 359 player->set_position(0 - player->get_hitbox_width(), 25);
el17sm 28:98848e6a77a2 360 break;
el17sm 28:98848e6a77a2 361 case 2 :
el17sm 28:98848e6a77a2 362 player->set_position(39, 0 - player->get_hitbox_height());
el17sm 28:98848e6a77a2 363 break;
el17sm 28:98848e6a77a2 364 case 3 :
el17sm 28:98848e6a77a2 365 player->set_position(85, 25);
el17sm 28:98848e6a77a2 366 break;
el17sm 28:98848e6a77a2 367 case 4 :
el17sm 41:0697508a28ba 368 player->set_position(39, 37);
el17sm 28:98848e6a77a2 369 break;
el17sm 28:98848e6a77a2 370 }
el17sm 28:98848e6a77a2 371 }
el17sm 28:98848e6a77a2 372
el17sm 27:a1b41626f57c 373 void RoomEngine::minimap_detection(N5110 &lcd, Gamepad &gamepad)
el17sm 27:a1b41626f57c 374 {
el17sm 28:98848e6a77a2 375 while(gamepad.check_event(Gamepad::BACK_PRESSED)) {
el17sm 27:a1b41626f57c 376 lcd.clear();
el17sm 27:a1b41626f57c 377 lcd.refresh();
el17sm 27:a1b41626f57c 378 wait_ms(1000/40);
el17sm 26:abbc19edc5c1 379 };
el17sm 26:abbc19edc5c1 380 }
el17sm 26:abbc19edc5c1 381
el17sm 27:a1b41626f57c 382 void RoomEngine::pause_detection(N5110 &lcd, Gamepad &gamepad)
el17sm 26:abbc19edc5c1 383 {
el17sm 28:98848e6a77a2 384 if(gamepad.check_event(Gamepad::START_PRESSED)) {
el17sm 27:a1b41626f57c 385 draw_health(lcd);
el17sm 33:4f3948dcd2f7 386 char * paused_screen = lcd.readScreen();
el17sm 26:abbc19edc5c1 387 int pause_timer = 2;
el17sm 33:4f3948dcd2f7 388 lcd.drawSpriteTransparent(20, 20, 9, 45, (char *)pause_sprite);
el17sm 26:abbc19edc5c1 389 wait(0.05);
el17sm 28:98848e6a77a2 390 while(gamepad.check_event(Gamepad::START_PRESSED)) {
el17sm 26:abbc19edc5c1 391 lcd.clear();
el17sm 26:abbc19edc5c1 392 lcd.drawSprite(0, 0, HEIGHT, WIDTH, paused_screen);
el17sm 26:abbc19edc5c1 393 if (pause_timer % 10 <= 4) {
el17sm 33:4f3948dcd2f7 394 lcd.drawSpriteTransparent(20, 20, 9, 45, (char *)pause_sprite);
el17sm 26:abbc19edc5c1 395 }
el17sm 26:abbc19edc5c1 396 lcd.refresh();
el17sm 26:abbc19edc5c1 397 pause_timer++;
el17sm 26:abbc19edc5c1 398 wait_ms(1000/40);
el17sm 27:a1b41626f57c 399 }
el17sm 26:abbc19edc5c1 400 wait(0.05);
el17sm 26:abbc19edc5c1 401 pause_timer += 2;
el17sm 28:98848e6a77a2 402 while(!gamepad.check_event(Gamepad::START_PRESSED)) {
el17sm 26:abbc19edc5c1 403 lcd.clear();
el17sm 26:abbc19edc5c1 404 lcd.drawSprite(0, 0, HEIGHT, WIDTH, paused_screen);
el17sm 26:abbc19edc5c1 405 if (pause_timer % 10 <= 4) {
el17sm 33:4f3948dcd2f7 406 lcd.drawSpriteTransparent(20, 20, 9, 45, (char *)pause_sprite);
el17sm 26:abbc19edc5c1 407 }
el17sm 26:abbc19edc5c1 408 lcd.refresh();
el17sm 26:abbc19edc5c1 409 pause_timer++;
el17sm 26:abbc19edc5c1 410 wait_ms(1000/40);
el17sm 27:a1b41626f57c 411 }
el17sm 26:abbc19edc5c1 412 wait(0.05);
el17sm 26:abbc19edc5c1 413 pause_timer += 2;
el17sm 28:98848e6a77a2 414 while(gamepad.check_event(Gamepad::START_PRESSED)) {
el17sm 26:abbc19edc5c1 415 lcd.clear();
el17sm 26:abbc19edc5c1 416 lcd.drawSprite(0, 0, HEIGHT, WIDTH, paused_screen);
el17sm 26:abbc19edc5c1 417 if (pause_timer % 10 <= 4) {
el17sm 33:4f3948dcd2f7 418 lcd.drawSpriteTransparent(20, 20, 9, 45, (char *)pause_sprite);
el17sm 26:abbc19edc5c1 419 }
el17sm 26:abbc19edc5c1 420 lcd.refresh();
el17sm 26:abbc19edc5c1 421 pause_timer++;
el17sm 26:abbc19edc5c1 422 wait_ms(1000/40);
el17sm 27:a1b41626f57c 423 }
el17sm 27:a1b41626f57c 424 }
el17sm 27:a1b41626f57c 425 }
el17sm 27:a1b41626f57c 426
el17sm 27:a1b41626f57c 427 void RoomEngine::draw(N5110 &lcd)
el17sm 27:a1b41626f57c 428 {
el17sm 27:a1b41626f57c 429 room->draw_room(lcd);
el17sm 34:1d5b4da3935e 430 //lcd.drawSprite(0,0,screen_height,screen_width,(char *)level_map[1]);
el17sm 39:0c2521949429 431 for(int j = 0; j < HEIGHT; j++) {
el17sm 39:0c2521949429 432 if (j == player->get_pos_y()) {
el17sm 39:0c2521949429 433 player->draw(lcd);
el17sm 39:0c2521949429 434 }
el17sm 40:cbcbf6fc1421 435 player->draw_bullets(lcd, j);
el17sm 41:0697508a28ba 436 room->draw(lcd, j);
el17sm 39:0c2521949429 437 }
el17sm 39:0c2521949429 438
el17sm 29:6b8411bb040a 439 room->draw_room_overlay(lcd);
el17sm 27:a1b41626f57c 440 if (_L) {
el17sm 27:a1b41626f57c 441 draw_health(lcd);
el17sm 26:abbc19edc5c1 442 }
el17sm 26:abbc19edc5c1 443 }
el17sm 26:abbc19edc5c1 444
el17sm 27:a1b41626f57c 445 void RoomEngine::draw_health(N5110 &lcd)
el17sm 26:abbc19edc5c1 446 {
el17sm 27:a1b41626f57c 447 for (int i = 0; i < player->get_hp(); i++){
el17sm 27:a1b41626f57c 448 lcd.drawSpriteTransparent(i*10,
el17sm 27:a1b41626f57c 449 0,
el17sm 27:a1b41626f57c 450 player->get_hearts_height(),
el17sm 27:a1b41626f57c 451 player->get_hearts_width(),
el17sm 27:a1b41626f57c 452 player->get_hearts_sprite());
el17sm 27:a1b41626f57c 453 }
el17sm 26:abbc19edc5c1 454 }