// 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