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

Dependencies:   mbed MotionSensor

main.cpp

Committer:
el17sm
Date:
2019-05-08
Revision:
45:8725b4171646
Parent:
44:cc4cecfc639f
Child:
46:f09711580d4a

File content as of revision 45:8725b4171646:

/*
ELEC2645 Embedded Systems Project
School of Electronic & Electrical Engineering
University of Leeds
Name: Steven Mahasin
Username: el17sm
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();

int main()
{
    // Initialize
    lcd.init();
    lcd.setContrast(global_contrast); 
    gamepad.init();
    
    while(1) { // Gameloop
        
        title.main(lcd, gamepad, global_contrast);
        
        srand(title.get_seed());
        player = new Player(39, 27);
        room_engine = new RoomEngine(global_contrast);
        
        game_loop();
        game_over();
        for (int i = 0; i < MAX_ROOMS_MAP_X; i++) {
                for (int j = 0; j < MAX_ROOMS_MAP_Y; j++) {
                    delete rooms[j][i];
                }
            }
        delete room_engine;
        delete player;
    }
}

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);
            }
        }
        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->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);
                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();
            player->delete_bullets();
            room_engine->update_current_room();
        }
    }
    gameover : {
        game_over();
    }
}

void game_over()
{
    while(1){   // Game Over Screen Loop
                lcd.clear();
                lcd.setContrast(global_contrast);
                lcd.printString("Game Over", 0, 0);
                lcd.printString("Retry?", 0, 1);
                lcd.refresh();
                while(!gamepad.check_event(Gamepad::A_PRESSED)) {
                }
                wait(0.05);
                while(gamepad.check_event(Gamepad::A_PRESSED)) {
                }
                break;
            }
}