Newer
Older
Import / applications / HighwayDash / ports / GameSim / GameSim.h
//  BlockyFroggy
//  Copyright © 2017 John Ryland.
//  All rights reserved.
#pragma once
#ifndef GAME_SIM_H
#define GAME_SIM_H


#include <stdint.h>
#include <vector>
#include <memory>
#include <limits>
#include "Math.h"


//! Game specific simulation environment.
//! This is the backend model/logic of the game, not the presentation of it.
namespace GameSim {


enum ObjectClass
{
  Terrain,
  Obstacle,
  Vehicle,
  WaterCraft,
  Pickup
  //Player
};


enum Movement
{
  Forward,
  Backward,
  Right,
  Left
};


enum ObjectType
{
  // Terrain
  Ground,
  Road,
  Rail,
  WaterLane,
  Water,

  // Obstacle
  Tree,
  Shrub,
  Building,
  Rocks,

  // Vehicle
  Bike,
  Car,
  Van,
  Truck,

  Train1,
  Train2,
  Train3,
  Train4,

  // WaterCraft
  Log,
  Boat,
  Crocodile,
  LilyPad,
  SteppingStone,

  // Pickup
  Coin,
  Food,
  Life,
  Bonus,

  // Player
  Player,
  
  // Number of values in the enum
  COUNT
};


class GameObject
{
public:
    ObjectType m_type = Ground;
    uint32_t m_lane;
    float m_x, m_y, m_z, m_w, m_h, m_d, m_dx, m_dy;
    uint32_t m_color; // type
};


typedef std::vector<GameObject> GameObjectList;


class GameLogic
{
public:
    GameLogic();
    ~GameLogic();

    void reset();
    void movePlayer(Movement a_movement);
    bool isGameOver() { return m_gameOver; }
    bool hasWon()     { return m_won; }
    void update(float a_dt);
    float getTime() { return m_time; }
    int getLaneHeight(int y);
    int getPlayerHeight();

    const std::vector<GameObjectList*>& objectLists();

    //GameObjectList& carObjectList() { return m_carObjects; }

private:
    void generateLevel();
    bool checkGameOver();
    GameObjectList m_backgroundLevel;
    GameObjectList m_populationLevel;
    GameObjectList m_movingObjects;
    GameObjectList m_player;
    std::vector<GameObjectList*> m_objLists;

    //GameObjectList m_carObjects;
  
    bool m_gameOver;
    bool m_won;
    Math::RandomNumberGenerator m_rng;
    float m_time;
#define LANES 150
    const int m_lanes = LANES;
    ObjectType m_laneFlags[LANES];
};


} // namespace GameSim


#endif // GAME_SIM_H