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
Diff: main.cpp
- Revision:
- 46:f09711580d4a
- Parent:
- 45:8725b4171646
- Child:
- 47:6e31b195ce3c
--- a/main.cpp Wed May 08 12:40:52 2019 +0000
+++ b/main.cpp Wed May 08 20:47:52 2019 +0000
@@ -7,49 +7,16 @@
Student ID Number: 201192939
Date: 11/04/2019
*/
-
-// Pre-Processor
-#include "mbed.h"
-#include "Gamepad.h"
-#include "N5110.h"
-#include "math.h"
-#include "sprites.h"
-#include "Entity.h"
-#include "Player.h"
-#include "Headless.h"
-#include "Snake.h"
-#include "RoomEngine.h"
-#include "Title.h"
-
-#define INSIDE 4
-#define MAX_ROOMS_MAP_X 11
-#define MAX_ROOMS_MAP_Y 11
-
-// Variables
-float global_contrast = 0.5;
-Player *player;
-Room *rooms[MAX_ROOMS_MAP_Y][MAX_ROOMS_MAP_X];
-bool valid_rooms[MAX_ROOMS_MAP_Y][MAX_ROOMS_MAP_X];
-RoomEngine *room_engine;
-
-// Objects
-N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
-Gamepad gamepad;
-Title title;
-
-// Prototypes
-void game_loop();
-void game_over();
+#include "main.h"
int main()
{
// Initialize
- lcd.init();
- lcd.setContrast(global_contrast);
- gamepad.init();
+ init();
while(1) { // Gameloop
-
+
+ boss_room_exist = false;
title.main(lcd, gamepad, global_contrast);
srand(title.get_seed());
@@ -58,43 +25,54 @@
game_loop();
game_over();
- for (int i = 0; i < MAX_ROOMS_MAP_X; i++) {
- for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) {
+ 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;
}
}
+ }
delete room_engine;
delete player;
}
}
+void init()
+{
+ lcd.init();
+ lcd.setContrast(global_contrast);
+ gamepad.init();
+ for (int j = 0; j < MAX_ROOMS_MAP_Y; j++){
+ for (int i = 0; i < MAX_ROOMS_MAP_X; i++){
+ valid_rooms[j][i] = false;
+ }
+ }
+}
+
void game_loop()
{
while(1) { // Floor Loop
- for (int i = 0; i < MAX_ROOMS_MAP_X; i++) {
- for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) {
- rooms[j][i] = new Room(rand() % 1, 10);
+ boss_room_number = 5 + rand() % 4; // Boss room appears after travelling 5-8 rooms
+ boss_room_counter = 0;
+ while(1) { // Room Loop
+ update_room_coords();
+ if (!valid_rooms[room_y][room_x]){
+ generate_room();
}
- }
- rooms[7][6]->set_boss_doorway(true);
- delete rooms[8][6];
- rooms[8][6] = new Room(0,10);
-
- // Rooms Generation
- while(1) { // Room Loop
- rooms[room_engine->get_room_y()][room_engine->get_room_x()]->load();
- room_engine->load(player, rooms[room_engine->get_room_y()][room_engine->get_room_x()]);
+ room_engine->load(player, rooms[room_y][room_x]);
room_engine->entrance_scene(lcd, gamepad);
while(room_engine->check_player_room_position() == INSIDE) { // Room actions
room_engine->read_input(gamepad);
room_engine->update();
room_engine->render(lcd, gamepad);
+ minimap_detection();
if (player->get_hp() <= 0) {
goto gameover;
}
}
room_engine->exit_scene(lcd, gamepad);
- rooms[room_engine->get_room_y()][room_engine->get_room_x()]->unload();
+ rooms[room_y][room_x]->unload();
player->delete_bullets();
room_engine->update_current_room();
}
@@ -104,6 +82,32 @@
}
}
+void generate_room()
+{
+ valid_rooms[room_y][room_x] = true;
+ if (boss_room_counter == 0) {
+ rooms[room_y][room_x] = new Room(0, 0);
+ rooms[room_y][room_x]->set_doorway(0, true);
+ } else {
+ rooms[room_y][room_x] = new Room(rand() % 4, 0);
+ 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 = 1;}
+ 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++) {
+ 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)) {
+ rooms[room_y][room_x]->set_boss_doorway(available_boss_room());
+ boss_room_exist = true;
+ }
+ }
+ boss_room_counter++;
+}
+
void game_over()
{
while(1){ // Game Over Screen Loop
@@ -119,4 +123,145 @@
}
break;
}
-}
\ No newline at end of file
+}
+
+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();
+}
+
+int opposite(int value)
+{
+ if (value <= 1) {
+ return value + 2;
+ } else {
+ return value - 2;
+ }
+}
+
+int count_doorways() // counts number of exisisting doorways
+{
+ int count = 0;
+ for (int i = 0; i < 4; i++){
+ if (rooms[room_y][room_x]->get_doorway(i)) {
+ count++;
+ }
+ }
+ return count;
+}
+
+void update_definite_doorways()
+{
+ // UP
+ if (room_y == 1) {
+ cannot[0] = true;
+ have_to[0] = false;
+ } else if (valid_rooms[room_y - 1][room_x]){
+ if (rooms[room_y - 1][room_x]->get_doorway(2)){
+ have_to[0] = true;
+ cannot[0] = false;
+ } else {
+ have_to[0] = false;
+ cannot[0] = true;
+ }
+ } else {
+ have_to[0] = false;
+ cannot[0] = false;
+ }
+
+ // RIGHT
+ if (room_x == 10) {
+ 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)){
+ have_to[1] = true;
+ cannot[1] = false;
+ } else {
+ have_to[1] = false;
+ cannot[1] = true;
+ }
+ } else {
+ have_to[1] = false;
+ cannot[1] = false;
+ }
+
+ // DOWN
+ if (room_y == 10) {
+ 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)){
+ have_to[2] = true;
+ cannot[2] = false;
+ } else {
+ have_to[2] = false;
+ cannot[2] = true;
+ }
+ } else {
+ have_to[2] = false;
+ cannot[2] = false;
+ }
+
+ // LEFT
+ if (room_x == 1) {
+ 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)){
+ have_to[3] = true;
+ cannot[3] = false;
+ } else {
+ have_to[3] = false;
+ cannot[3] = true;
+ }
+ } else {
+ have_to[3] = false;
+ cannot[3] = false;
+ }
+}
+
+int available_boss_room()
+{
+ if (!valid_rooms[room_y - 1][room_x]){
+ rooms[room_y][room_x]->set_doorway(0, true);
+ valid_rooms[room_y - 1][room_x] = true;
+ rooms[room_y - 1][room_x] = new Room(0, 10);
+ rooms[room_y - 1][room_x]->set_doorway(2, true);
+ return 0;
+ } else if (!valid_rooms[room_y][room_x + 1]){
+ rooms[room_y][room_x]->set_doorway(1, true);
+ valid_rooms[room_y][room_x + 1] = true;
+ rooms[room_y][room_x + 1] = new Room(0, 10);
+ rooms[room_y][room_x + 1]->set_doorway(3, true);
+ return 1;
+ } else if (!valid_rooms[room_y + 1][room_x]){
+ rooms[room_y][room_x]->set_doorway(2, true);
+ valid_rooms[room_y + 1][room_x] = true;
+ rooms[room_y + 1][room_x] = new Room(0, 10);
+ rooms[room_y + 1][room_x]->set_doorway(0, true);
+ return 2;
+ } else if (!valid_rooms[room_y][room_x - 1]){
+ rooms[room_y][room_x]->set_doorway(3, true);
+ valid_rooms[room_y][room_x - 1] = true;
+ rooms[room_y][room_x - 1] = new Room(0, 10);
+ rooms[room_y][room_x - 1]->set_doorway(1, true);
+ return 3;
+ }
+ delete rooms[room_y - 1][room_x];
+ rooms[room_y - 1][room_x] = new Room(0, 10);
+ rooms[room_y - 1][room_x]->set_doorway(2, true);
+ return 0;
+}
+
+void minimap_detection()
+{
+ while(gamepad.check_event(Gamepad::BACK_PRESSED)) {
+ lcd.clear();
+ lcd.refresh();
+ wait_ms(1000/40);
+ };
+}