A rouge-like rpg, heavily inspired on the binding of isaac. Running on a FRDM-K64F Mbed board. C++.
Dependencies: mbed MotionSensor
Diff: main.cpp
- Revision:
- 50:2c5cb92a5361
- Parent:
- 49:3f83ed62d123
- Child:
- 51:4d0cd75e7ed3
--- a/main.cpp Thu May 09 04:24:30 2019 +0000 +++ b/main.cpp Thu May 09 06:33:28 2019 +0000 @@ -15,7 +15,7 @@ init(); while(1) { // Gameloop - boss_room_exist = false; + boss_room_exist = false; // Game initialize variables number_of_enemies_killed = 0; total_time = 0; @@ -25,7 +25,7 @@ room_engine = new RoomEngine(global_contrast); game_loop(); - game_unload(); + game_unload(); // Deletion of player, rooms, roomengine } } @@ -47,17 +47,17 @@ boss_room_number = 5 + rand() % 4; // Boss room appears after travelling 5-8 rooms boss_room_counter = 0; while(1) { // Room Loop - room_entrance(); + room_entrance(); // Generation of new room, loading of room and entrance scene while(room_engine->check_player_room_position() == INSIDE) { // actions inside the Room room_engine->read_input(gamepad); room_engine->update(number_of_enemies_killed); room_engine->render(lcd, gamepad); minimap_detection(); - total_time++; + total_time++; // Incrementing time score if (player->get_hp() <= 0) {goto gameover;} // gameover if player health depleted if ((rooms[room_y][room_x]->get_room_type() == 10) && !(rooms[room_y][room_x]->enemies_exist())){goto winner;} // wins game if room is a boss room, and the boss is dead } - room_exit(); + room_exit(); // Exit scene, deletion of existing entities and update of room coordinates } } gameover : { game_over(); goto displaystats;} @@ -67,7 +67,7 @@ void room_entrance() { - update_room_coords(); + update_room_coords(); // Accessor to room_engine room coords if (!valid_rooms[room_y][room_x]){generate_room();} // generate a new room if player enters a nonexistent room room_engine->load(player, rooms[room_y][room_x]); room_engine->entrance_scene(lcd, gamepad); @@ -78,28 +78,28 @@ room_engine->exit_scene(lcd, gamepad); rooms[room_y][room_x]->unload(); player->delete_bullets(); - room_engine->update_current_room(); + room_engine->update_current_room(); // Increments room coord } void generate_room() { - valid_rooms[room_y][room_x] = true; - if (boss_room_counter == 0) { - rooms[room_y][room_x] = new Room(0, 0); + valid_rooms[room_y][room_x] = true; // Sets the room coord to be valid + if (boss_room_counter == 0) { // if first room + rooms[room_y][room_x] = new Room(0, 0); // no enemies rooms[room_y][room_x]->set_doorway(0, true); } else { - rooms[room_y][room_x] = new Room(rand() % 4, 0); + rooms[room_y][room_x] = new Room(rand() % 4, 0); // random enemies (0-3) 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 = 0;} + else {no_of_doorways = 1;} // If boss room exist, ensure all unexplored rooms branch out into a dead end while (count_doorways() < no_of_doorways) { rooms[room_y][room_x]->set_doorway(rand() % 4, true); // Setting random doorways until number of desired doorways } update_definite_doorways(); - for (int i = 0; i < 4; i++) { + for (int i = 0; i < 4; i++) { // Sets the definitive doorways if (cannot[i]){rooms[room_y][room_x]->set_doorway(i, false);} if (have_to[i]){rooms[room_y][room_x]->set_doorway(i, true);} } - if ((boss_room_counter >= boss_room_number) && (!boss_room_exist)) { + if ((boss_room_counter >= boss_room_number) && (!boss_room_exist)) { // Sets the doorway towards the boss room to be a boss doorway rooms[room_y][room_x]->set_boss_doorway(available_boss_room()); boss_room_exist = true; } @@ -109,8 +109,6 @@ void update_room_coords() { - prev_room_x = room_x; - prev_room_y = room_y; room_y = room_engine->get_room_y(); room_x = room_engine->get_room_x(); } @@ -122,33 +120,38 @@ for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) { for (int i = 0; i < MAX_ROOMS_MAP_X; i++) { if (valid_rooms[j][i]) { - lcd.drawSprite(33 + (i-room_x)*20, 17 + (j-room_y)*15, 15, 20, (char *)minimap_sprite[0]); - if (rooms[j][i]->get_room_type() == 10) { - lcd.drawSprite(33 + (i-room_x)*20, 17 + (j-room_y)*15, 15, 20, (char *)minimap_sprite[2]); - } else if (rooms[j][i]->enemies_exist()) { - lcd.drawSprite(33 + (i-room_x)*20, 17 + (j-room_y)*15, 15, 20, (char *)minimap_sprite[1]); - } - if (rooms[j][i]->get_doorway(0)) { - lcd.drawLine(42 + (i-room_x)*20, 17 + (j-room_y)*15, 43 + (i-room_x)*20, 17 + (j-room_y)*15, 1); - } - if (rooms[j][i]->get_doorway(1)) { - lcd.drawLine(52 + (i-room_x)*20, 23 + (j-room_y)*15, 52 + (i-room_x)*20, 24 + (j-room_y)*15, 1); - } - if (rooms[j][i]->get_doorway(2)) { - lcd.drawLine(42 + (i-room_x)*20, 31 + (j-room_y)*15, 43 + (i-room_x)*20, 31 + (j-room_y)*15, 1); - } - if (rooms[j][i]->get_doorway(3)) { - lcd.drawLine(33 + (i-room_x)*20, 23 + (j-room_y)*15, 33 + (i-room_x)*20, 24 + (j-room_y)*15, 1); - } + draw_minimap(j,i); } } } - lcd.drawSpriteTransparent(33, 17, 15, 20, (char *)minimap_sprite[3]); + lcd.drawSpriteTransparent(33, 17, 15, 20, (char *)minimap_sprite[3]); // draws your current room lcd.refresh(); wait_ms(1000/40); }; } +void draw_minimap(int j, int i) +{ + lcd.drawSprite(33 + (i-room_x)*20, 17 + (j-room_y)*15, 15, 20, (char *)minimap_sprite[0]); // draws normal room + if (rooms[j][i]->get_room_type() == 10) { + lcd.drawSprite(33 + (i-room_x)*20, 17 + (j-room_y)*15, 15, 20, (char *)minimap_sprite[2]); // draws boss room + } else if (rooms[j][i]->enemies_exist()) { + lcd.drawSprite(33 + (i-room_x)*20, 17 + (j-room_y)*15, 15, 20, (char *)minimap_sprite[1]); // draws mob room + } + if (rooms[j][i]->get_doorway(0)) { // Drawing all doorways + lcd.drawLine(42 + (i-room_x)*20, 17 + (j-room_y)*15, 43 + (i-room_x)*20, 17 + (j-room_y)*15, 1); + } + if (rooms[j][i]->get_doorway(1)) { + lcd.drawLine(52 + (i-room_x)*20, 23 + (j-room_y)*15, 52 + (i-room_x)*20, 24 + (j-room_y)*15, 1); + } + if (rooms[j][i]->get_doorway(2)) { + lcd.drawLine(42 + (i-room_x)*20, 31 + (j-room_y)*15, 43 + (i-room_x)*20, 31 + (j-room_y)*15, 1); + } + if (rooms[j][i]->get_doorway(3)) { + lcd.drawLine(33 + (i-room_x)*20, 23 + (j-room_y)*15, 33 + (i-room_x)*20, 24 + (j-room_y)*15, 1); + } +} + void game_over() { lcd.clear(); @@ -187,7 +190,7 @@ int available_boss_room() { - if (!valid_rooms[room_y - 1][room_x]){ + if (!valid_rooms[room_y - 1][room_x]){ // if any of the adjacent room is invalid, it is replaced with a boss room rooms[room_y][room_x]->set_doorway(0, true); set_boss_room(room_y - 1, room_x, 0); return 0; @@ -203,7 +206,7 @@ rooms[room_y][room_x]->set_doorway(3, true); set_boss_room(room_y, room_x - 1, 3); return 3; } - delete rooms[room_y - 1][room_x]; + delete rooms[room_y - 1][room_x]; // if all adjacent room is valid, mutate the top room into a boss room (default case) rooms[room_y][room_x]->set_doorway(3, true); set_boss_room(room_y - 1, room_x, 0); return 0; @@ -213,8 +216,8 @@ { 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])){ + rooms[room_y][room_x]->set_doorway(opposite(side), true); // Sets a definite doorway on the side player comes from + if ((opposite(side) != 0) && (valid_rooms[room_y - 1][room_x])){ // Deletes any existing doorways unless player entered from that side if (rooms[room_y - 1][room_x]->get_doorway(2)){ rooms[room_y - 1][room_x]->set_doorway(2, false); }} @@ -234,16 +237,17 @@ void game_unload() { + // Deletes every generated rooms for (int i = 0; i < MAX_ROOMS_MAP_X; i++) { - for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) { - if (valid_rooms[j][j]){ - delete rooms[j][i]; - valid_rooms[i][j] = false; - } + for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) { + if (valid_rooms[j][j]){ + delete rooms[j][i]; + valid_rooms[i][j] = false; } } - delete room_engine; - delete player; + } + delete room_engine; + delete player; } // Functions @@ -280,33 +284,33 @@ 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]){ // if room to be generated is on the border, then doorway cannot exist - if (rooms[room_y - 1][room_x]->get_doorway(2)){ + } else if (valid_rooms[room_y - 1][room_x]){ // if room to be generated has an existing room above it + if (rooms[room_y - 1][room_x]->get_doorway(2)){ // if room to be generated has an existing doorway, then doorway must exist have_to[0] = true; cannot[0] = false; - } else { + } else { // if room to be generated does not have an existing doorway, then doorway must not exist have_to[0] = false; cannot[0] = true; } - } else { + } else { // else the room does not have any definite doorways set on it's north have_to[0] = false; cannot[0] = false; } } void update_definite_doorways_right() { - if (room_x == 10) { + if (room_x == 10) { // if room to be generated is on the border, then doorway cannot exist cannot[1] = true; have_to[1] = false; - } else if (valid_rooms[room_y][room_x + 1]){ - if (rooms[room_y][room_x + 1]->get_doorway(3)){ + } else if (valid_rooms[room_y][room_x + 1]){ // if room to be generated has an existing room on it's right + if (rooms[room_y][room_x + 1]->get_doorway(3)){ // if room to be generated has an existing doorway, then doorway must exist have_to[1] = true; cannot[1] = false; - } else { + } else { // if room to be generated does not have an existing doorway, then doorway must not exist have_to[1] = false; cannot[1] = true; } - } else { + } else { // else the room does not have any definite doorways set on it's right have_to[1] = false; cannot[1] = false; } @@ -314,18 +318,18 @@ void update_definite_doorways_down() { - if (room_y == 10) { + if (room_y == 10) { // if room to be generated is on the border, then doorway cannot exist cannot[2] = true; have_to[2] = false; - } else if (valid_rooms[room_y + 1][room_x]){ - if (rooms[room_y + 1][room_x]->get_doorway(0)){ + } else if (valid_rooms[room_y + 1][room_x]){ // if room to be generated has an existing room below it + if (rooms[room_y + 1][room_x]->get_doorway(0)){ // if room to be generated has an existing doorway, then doorway must exist have_to[2] = true; cannot[2] = false; - } else { + } else { // if room to be generated does not have an existing doorway, then doorway must not exist have_to[2] = false; cannot[2] = true; } - } else { + } else { // else the room does not have any definite doorways set on it's south have_to[2] = false; cannot[2] = false; } @@ -333,18 +337,18 @@ void update_definite_doorways_left() { - if (room_x == 1) { + if (room_x == 1) { // if room to be generated is on the border, then doorway cannot exist cannot[3] = true; have_to[3] = false; - } else if (valid_rooms[room_y][room_x - 1]){ - if (rooms[room_y][room_x - 1]->get_doorway(1)){ + } else if (valid_rooms[room_y][room_x - 1]){ // if room to be generated has an existing room on it's left + if (rooms[room_y][room_x - 1]->get_doorway(1)){ // if room to be generated has an existing doorway, then doorway must exist have_to[3] = true; cannot[3] = false; - } else { + } else { // if room to be generated does not have an existing doorway, then doorway must not exist have_to[3] = false; cannot[3] = true; } - } else { + } else { // else the room does not have any definite doorways set on it's left have_to[3] = false; cannot[3] = false; }