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

Dependencies:   mbed MotionSensor

RoomEngine/RoomEngine.h

Committer:
el17sm
Date:
2019-05-09
Revision:
61:901871a7c6ff
Parent:
58:c8d90bb7404a
Child:
59:fd4669864b67

File content as of revision 61:901871a7c6ff:

#ifndef ROOMENGINE_H
#define ROOMENGINE_H
#include "N5110.h"
#include "Gamepad.h"

#include "Player.h"
#include "Health.h"
#include "Room.h"

#include "sprites.h"
#define MAX_ROOMS_MAP_X 11
#define MAX_ROOMS_MAP_Y 11

/**RoomEngine Class
@author Steven Mahasin
@brief Handles all Inter-Class Interactions in the room
@date May 2019
*/
class RoomEngine
{
public:
    /** Constructor 
    *   @param global_contrast @details the contrast that the game runs on, set by title screen
    */
    RoomEngine(float global_contrast);
    /** Destructor */
    ~RoomEngine();
    
    // Functions
    /**
    *   @brief loads the current player and room into the engine
    *   @param current_player @details the player we control
    *   @param current_room @details the room the player is currently in
    */
    void load(Player *current_player, Room *current_room);
    /**
    *   @brief plays an entrance_scene of the player into the room
    *   @param lcd @details the screen that is being drawn on
    *   @param gamepad @details the gamepad whose controls are being read
    */
    void entrance_scene(N5110 &lcd, Gamepad &gamepad);
    /**
    *   @brief increments the room coordinate based on which side the player exits the screen from
    */
    void update_current_room();
    
    /**
    *   @brief returns 0-4 based on the player's position in the screen
    *   @return which side of the screen the player is currently at (4 = inside)
    */
    int check_player_room_position();
    
    /**
    *   @brief reads the input from the gamepad and converts it into member variables
    *   @param gamepad @details the gamepad whose controls are being read
    */
    void read_input(Gamepad &gamepad);
    /**
    *   @brief updates the interaction between entities in room (enemies hp, damage, etc)
    *   @param number_of_enemies_killed @details for the final score, gets incremented everytime an enemy is killed
    */
    void update(int &number_of_enemies_killed);
    /**
    *   @brief to draw all the map, entities, doorway onto the screen
    *   @param lcd @details the screen that the roomengine draws on
    */
    void render(N5110 &lcd, Gamepad &gamepad);
    
    /**
    *   @brief Plays an exit scene of the player leaving the room
    *   @param lcd @details the screen that the exit scene is drawn on
    *   @param gamepad @details the gamepad whose controls are being read
    */
    void exit_scene(N5110 &lcd, Gamepad &gamepad);
    
    // Accessor
    /**
    *   @brief reads the member variable _room_x
    *   @return the current room's x-coordinate
    */
    int get_room_x();
    /**
    *   @brief reads the member variable _room_y
    *   @return the current room's y-coordinate
    */
    int get_room_y();
    
private:
    // Member variables
    /**
    *   @brief A boolean to indicate if button L is pressed
    */
    bool _L;
    /**
    *   @brief A boolean to indicate if button R is pressed
    */
    bool _R;
    /**
    *   @brief A boolean to indicate if button A is pressed
    */
    bool _A;
    /**
    *   @brief A boolean to indicate if button B is pressed
    */
    bool _B;
    /**
    *   @brief A boolean to indicate if button X is pressed
    */
    bool _X;
    /**
    *   @brief A boolean to indicate if button Y is pressed
    */
    bool _Y;
    /**
    *   @brief A vector2D that stores the x and y of the mapped_coordinates of the joystick
    */
    Vector2D mapped_coord;
    /**
    *   @brief The x-coordinate value for the current room's position
    */
    int _room_x;
    /**
    *   @brief The y-coordinate value for the current room's position
    */
    int _room_y;
    /**
    *   @brief The value of set contrast from title screen, which dictates the contrast of lcd
    */
    float _global_contrast;
    /**
    *   @brief A pointer to a Room, used to access the current room class and it's functions
    */
    Room *room;
    /**
    *   @brief A pointer to a Player, used to access the current player class and it's functions
    */
    Player *player;
    
    // Mutator
    /**
    *   @brief mutates all the user input manually
    *   @param L @details value to be written onto _L
    *   @param R @details value to be written onto _R
    *   @param A @details value to be written onto _A
    *   @param B @details value to be written onto _B
    *   @param X @details value to be written onto _X
    *   @param Y @details value to be written onto _Y
    *   @param mapped_x @details value to be written onto _mapped_coord.x
    *   @param mapped_y @details value to be written onto _mapped_coord.y
    */
    void set_input(bool L, bool R, bool A, bool B, bool X, bool Y, float mapped_x, float mapped_y);
    /**
    *   @brief mutates _mapped_coord manually
    *   @param mapped_x @details value to be written onto _mapped_coord.x
    *   @param mapped_y @details value to be written onto _mapped_coord.y
    */
    void set_mapped_coord(float x, float y);
    
    // Methods
    /**
    *   @brief checks if the two entities a and b collide
    *   @param a @details entity a to be checked if colliding with entity  b
    *   @param b @details entity b to be checked if colliding with entity  a
    *   @return true if the two entities collide
    */
    bool entity_collision(Entity &a, Entity &b);
    /**
    *   @brief checks if the entity a collides with any entities in the entity array "array[]" if entity a moves in the x direction
    *   @param a @details entity a to be checked if colliding with any entity in the array[]
    *   @param array[] @details an array of entities to be check if colliding with a
    *   @param no_of_enemies @details constant length of enemies in the array[]
    *   @param current_entity @details the index of the enemy to be ignored if entity a is within array[]
    *   @param valid_enemies[] @details the array that defines which entities in array[] exists
    *   @return -1 or 1 if the entity a collides with any entities in the entity array "array[]" when entity a moves in the x direction depending if a's x pos is bigger than the colliding entity's x pos or not
    */
    float entity_move_check_x(Entity *a, Entity *array[], int no_of_enemies, int current_entity, bool valid_enemies[]);
    /**
    *   @brief checks if the entity a collides with any entities in the entity array "array[]" if entity a moves in the y direction
    *   @param a @details entity a to be checked if colliding with any entity in the array[]
    *   @param array[] @details an array of entities to be check if colliding with a
    *   @param no_of_enemies @details constant length of enemies in the array[]
    *   @param current_entity @details the index of the enemy to be ignored if entity a is within array[]
    *   @param valid_enemies[] @details the array that defines which entities in array[] exists
    *   @return -1 or 1 if the entity a collides with any entities in the entity array "array[]" when entity a moves in the y direction depending if a's x pos is bigger than the colliding entity's x pos or not
    */
    float entity_move_check_y(Entity *a, Entity *array[], int no_of_enemies, int current_entity, bool valid_enemies[]);
    
    /**
    *   @brief inflict any damage happening to any entities in the room
    */
    void check_damage();
    /**
    *   @brief inflict any damage happening to the player in the room
    */
    void check_damage_player();
    /**
    *   @brief inflict any damage happening to any enemies in the room
    */
    void check_damage_enemies();
    /**
    *   @brief delete any enemies that has it's health depleted
    *   @param number_of_enemies_killed @details increments whenever an enemy is successfully deleted
    */
    void check_enemies_death(int &number_of_enemies_killed);
    /**
    *   @brief undo movement of entity if the entity collides with the wall (not used in this version)
    */
    void check_walls_collision();
    
    /**
    *   @brief updates the positions of all entities
    */
    void move();
    /**
    *   @brief updates the positions of player based on the joystick and wall constraint
    */
    void move_player();
    /**
    *   @brief updates the positions of enemies based on their coded movement patterns, repulsion effect and wall constraint
    */
    void move_enemies();
    /**
    *   @brief updates the position of the player whenever the player has just exit the screen
    *   @param side @details the side the player exits the room from
    */
    void update_player_position(int side);
    
    /**
    *   @brief holds the loop and detection for when a player pauses
    *   @param lcd @details the screen where the paused screen is going to be displayed on
    *   @param gamepad @details the gamepad whose controls are being read
    */
    void pause_detection(N5110 &lcd, Gamepad &gamepad);
    /**
    *   @brief draws the pause screen onto lcd
    *   @param lcd @details the screen where the paused screen is going to be displayed on
    *   @param paused_screen @details the char array of the frozen screen when paused
    *   @param pause_timer @details the loop count to check if the pause sprite should appear or not for blink effect
    */
    void draw_pause_screen(N5110 &lcd, char * paused_screen, int &pause_timer);
    
    /**
    *   @brief draws the map, the entities and map overlays in the order of descending j
    *   @param lcd @details the screen where all entities are being drawn on
    */
    void draw(N5110 &lcd);
    /**
    *   @brief draws number of hp as hearts on the top left of the screen whenever the user holds button L
    *   @param lcd @details the screen where the hearts are being drawn on
    */
    void draw_health(N5110 &lcd);
    
};
#endif