2013-07-02 08:40:43 +02:00
|
|
|
#pragma once
|
2013-12-20 17:02:46 +01:00
|
|
|
#ifndef _GAMEWORLD_HPP_
|
|
|
|
#define _GAMEWORLD_HPP_
|
2013-07-02 08:40:43 +02:00
|
|
|
|
2013-12-20 17:02:46 +01:00
|
|
|
#include <engine/GameData.hpp>
|
2014-07-25 04:30:44 +02:00
|
|
|
#include <engine/GameState.hpp>
|
2014-06-06 18:04:00 +02:00
|
|
|
#include <render/GameRenderer.hpp>
|
2014-07-25 04:30:44 +02:00
|
|
|
|
2013-12-20 15:03:32 +01:00
|
|
|
#include <loaders/LoaderIPL.hpp>
|
2014-06-06 18:04:00 +02:00
|
|
|
#include <ai/AIGraphNode.hpp>
|
2013-12-20 15:03:32 +01:00
|
|
|
#include <ai/AIGraph.hpp>
|
2013-07-02 08:40:43 +02:00
|
|
|
|
2014-06-06 13:18:32 +02:00
|
|
|
class WorkContext;
|
|
|
|
|
2014-02-28 12:23:51 +01:00
|
|
|
class GameObject;
|
2014-06-06 16:22:26 +02:00
|
|
|
class CharacterObject;
|
|
|
|
class InstanceObject;
|
|
|
|
class VehicleObject;
|
2013-09-09 01:18:36 +02:00
|
|
|
|
2014-06-28 04:22:53 +02:00
|
|
|
class WeaponScan;
|
|
|
|
|
2014-07-24 00:57:21 +02:00
|
|
|
class ScriptMachine;
|
|
|
|
|
2013-07-02 08:06:03 +02:00
|
|
|
#include <glm/glm.hpp>
|
|
|
|
|
2013-07-21 06:12:27 +02:00
|
|
|
#include <btBulletDynamicsCommon.h>
|
|
|
|
#include <btBulletCollisionCommon.h>
|
|
|
|
|
2013-07-02 08:40:43 +02:00
|
|
|
#include <vector>
|
2014-07-02 00:04:23 +02:00
|
|
|
#include <set>
|
2013-07-02 12:48:01 +02:00
|
|
|
#include <queue>
|
2013-07-04 01:23:12 +02:00
|
|
|
#include <random>
|
2013-07-02 08:40:43 +02:00
|
|
|
|
2013-07-02 08:06:03 +02:00
|
|
|
/**
|
2014-07-09 06:04:48 +02:00
|
|
|
* @brief Handles all data relating to object instances and other "worldly" state.
|
2013-07-02 08:06:03 +02:00
|
|
|
*/
|
2013-12-20 17:02:46 +01:00
|
|
|
class GameWorld
|
2013-07-02 08:06:03 +02:00
|
|
|
{
|
|
|
|
public:
|
2013-07-22 05:39:58 +02:00
|
|
|
|
2013-12-20 17:02:46 +01:00
|
|
|
GameWorld(const std::string& gamepath);
|
2014-06-06 13:18:32 +02:00
|
|
|
|
|
|
|
~GameWorld();
|
2013-07-02 08:06:03 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Loads the game data
|
|
|
|
*/
|
|
|
|
bool load();
|
|
|
|
|
2013-07-02 12:48:01 +02:00
|
|
|
struct LogEntry
|
|
|
|
{
|
|
|
|
enum Type {
|
|
|
|
Info,
|
|
|
|
Error,
|
|
|
|
Warning
|
|
|
|
};
|
|
|
|
|
|
|
|
Type type;
|
|
|
|
float time;
|
|
|
|
std::string message;
|
|
|
|
};
|
|
|
|
|
2013-07-06 02:39:54 +02:00
|
|
|
std::deque<LogEntry> log;
|
2013-07-02 12:48:01 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Displays an informative message
|
|
|
|
*/
|
|
|
|
void logInfo(const std::string& info);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Displays an alarming error
|
|
|
|
*/
|
|
|
|
void logError(const std::string& error);
|
|
|
|
|
2013-07-06 02:39:54 +02:00
|
|
|
/**
|
|
|
|
* Displays a comforting warning
|
|
|
|
*/
|
2013-07-22 05:39:58 +02:00
|
|
|
void logWarning(const std::string& warning);
|
2013-07-02 19:37:19 +02:00
|
|
|
|
2013-07-02 14:49:20 +02:00
|
|
|
/**
|
|
|
|
* Loads an IDE into the game
|
|
|
|
*/
|
|
|
|
bool defineItems(const std::string& name);
|
2014-07-24 00:57:21 +02:00
|
|
|
|
|
|
|
void runScript(const std::string& name);
|
2013-07-02 14:49:20 +02:00
|
|
|
|
2013-07-02 08:06:03 +02:00
|
|
|
/**
|
|
|
|
* Loads an IPL into the game.
|
|
|
|
* @param name The name of the IPL as it appears in the games' gta.dat
|
|
|
|
*/
|
2013-07-02 14:49:20 +02:00
|
|
|
bool placeItems(const std::string& name);
|
2013-07-02 08:06:03 +02:00
|
|
|
|
2013-07-02 18:29:20 +02:00
|
|
|
/**
|
|
|
|
* Loads the Zones from a zon/IPL file
|
|
|
|
*/
|
|
|
|
bool loadZone(const std::string& path);
|
|
|
|
|
2013-09-30 00:12:03 +02:00
|
|
|
/**
|
|
|
|
* Creates an instance
|
|
|
|
*/
|
2014-06-06 16:22:26 +02:00
|
|
|
InstanceObject *createInstance(const uint16_t id, const glm::vec3& pos, const glm::quat& rot = glm::quat());
|
2013-09-30 00:12:03 +02:00
|
|
|
|
2013-07-02 19:37:19 +02:00
|
|
|
/**
|
|
|
|
* Creates a vehicle
|
|
|
|
*/
|
2014-06-06 16:22:26 +02:00
|
|
|
VehicleObject *createVehicle(const uint16_t id, const glm::vec3& pos, const glm::quat& rot = glm::quat());
|
2013-07-22 05:39:58 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a pedestrian.
|
|
|
|
*/
|
2014-06-06 16:22:26 +02:00
|
|
|
CharacterObject* createPedestrian(const uint16_t id, const glm::vec3& pos, const glm::quat& rot = glm::quat());
|
2013-07-02 19:37:19 +02:00
|
|
|
|
2013-12-12 03:55:31 +01:00
|
|
|
/**
|
|
|
|
* Destroys an existing Object
|
|
|
|
*/
|
2014-02-28 12:23:51 +01:00
|
|
|
void destroyObject(GameObject* object);
|
2014-06-28 04:22:53 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Performs a weapon scan against things in the world
|
|
|
|
*/
|
2014-06-30 02:56:45 +02:00
|
|
|
void doWeaponScan(const WeaponScan &scan );
|
2013-12-12 03:55:31 +01:00
|
|
|
|
2013-12-27 23:57:11 +01:00
|
|
|
/**
|
|
|
|
* Returns the current hour
|
|
|
|
*/
|
|
|
|
int getHour();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the current minute
|
|
|
|
*/
|
|
|
|
int getMinute();
|
|
|
|
|
2013-07-02 12:48:01 +02:00
|
|
|
/**
|
|
|
|
* Game Clock
|
|
|
|
*/
|
|
|
|
float gameTime;
|
|
|
|
|
2013-07-02 08:06:03 +02:00
|
|
|
/**
|
|
|
|
* Game data
|
|
|
|
*/
|
2013-12-20 17:02:46 +01:00
|
|
|
GameData gameData;
|
2013-07-02 08:06:03 +02:00
|
|
|
|
2013-07-02 09:53:23 +02:00
|
|
|
/**
|
|
|
|
* Renderer
|
|
|
|
*/
|
2014-06-06 18:04:00 +02:00
|
|
|
GameRenderer renderer;
|
2014-07-25 04:30:44 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Gameplay state
|
|
|
|
*/
|
|
|
|
GameState state;
|
2013-07-02 09:53:23 +02:00
|
|
|
|
2013-07-02 18:29:20 +02:00
|
|
|
/**
|
|
|
|
* Map Zones
|
|
|
|
*/
|
|
|
|
std::vector<LoaderIPL::Zone> zones;
|
|
|
|
|
2013-07-02 08:06:03 +02:00
|
|
|
/**
|
2013-07-02 14:49:20 +02:00
|
|
|
* Object Definitions
|
2013-07-02 08:06:03 +02:00
|
|
|
*/
|
2013-11-26 17:14:13 +01:00
|
|
|
std::map<uint16_t, std::shared_ptr<ObjectData>> objectTypes;
|
|
|
|
|
|
|
|
/**
|
2014-07-09 06:04:48 +02:00
|
|
|
* Paths associated with each object definition.
|
|
|
|
*/
|
2013-11-26 17:14:13 +01:00
|
|
|
std::map<uint16_t, std::vector<std::shared_ptr<PathData>>> objectNodes;
|
|
|
|
|
2013-07-02 19:37:19 +02:00
|
|
|
/**
|
2014-07-09 06:04:48 +02:00
|
|
|
* Vehicle type definitions
|
|
|
|
* @todo move this non-instance data to GameData
|
2013-07-02 19:37:19 +02:00
|
|
|
*/
|
2014-02-28 12:23:51 +01:00
|
|
|
std::map<uint16_t, std::shared_ptr<VehicleData>> vehicleTypes;
|
2013-07-22 05:39:58 +02:00
|
|
|
|
2013-11-26 17:14:13 +01:00
|
|
|
/**
|
2014-07-09 06:04:48 +02:00
|
|
|
* Ped definitions
|
|
|
|
* @todo move this non-instance data to GameData
|
|
|
|
*/
|
2013-11-26 17:14:13 +01:00
|
|
|
std::map<uint16_t, std::shared_ptr<CharacterData>> pedestrianTypes;
|
2014-07-02 00:04:23 +02:00
|
|
|
|
2013-07-02 14:49:20 +02:00
|
|
|
/**
|
2014-07-02 00:04:23 +02:00
|
|
|
* @brief objects All active GameObjects in the world.
|
2014-07-09 06:04:48 +02:00
|
|
|
* @todo add some mechanism to allow objects to be "locked" preventing deletion.
|
|
|
|
* @todo add deletion queue to allow objects to self delete.
|
2013-07-02 14:49:20 +02:00
|
|
|
*/
|
2014-07-02 00:04:23 +02:00
|
|
|
std::set<GameObject*> objects;
|
|
|
|
|
2013-08-16 01:05:41 +02:00
|
|
|
/**
|
|
|
|
* Map of Model Names to Instances
|
|
|
|
*/
|
2014-07-02 00:04:23 +02:00
|
|
|
std::map<std::string, InstanceObject*> modelInstances;
|
2013-07-02 14:49:20 +02:00
|
|
|
|
2013-09-21 04:27:33 +02:00
|
|
|
/**
|
|
|
|
* AI Graph
|
|
|
|
*/
|
|
|
|
AIGraph aigraph;
|
2013-07-30 17:59:44 +02:00
|
|
|
|
2013-07-04 01:23:12 +02:00
|
|
|
/**
|
|
|
|
* Randomness Engine
|
|
|
|
*/
|
|
|
|
std::default_random_engine randomEngine;
|
2013-07-21 06:12:27 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Bullet
|
|
|
|
*/
|
|
|
|
btDefaultCollisionConfiguration* collisionConfig;
|
|
|
|
btCollisionDispatcher* collisionDispatcher;
|
|
|
|
btBroadphaseInterface* broadphase;
|
|
|
|
btSequentialImpulseConstraintSolver* solver;
|
|
|
|
btDiscreteDynamicsWorld* dynamicsWorld;
|
2014-06-06 13:18:32 +02:00
|
|
|
|
2014-06-11 22:00:53 +02:00
|
|
|
/**
|
2014-06-16 02:29:36 +02:00
|
|
|
* @brief physicsNearCallback
|
|
|
|
* Used to implement uprooting and other physics oddities.
|
2014-06-11 22:00:53 +02:00
|
|
|
*/
|
2014-06-16 02:29:36 +02:00
|
|
|
static bool ContactProcessedCallback(btManifoldPoint& mp, void* body0, void* body1);
|
2014-07-09 06:04:48 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief PhysicsTickCallback updates object each physics tick.
|
|
|
|
* @param physWorld
|
|
|
|
* @param timeStep
|
|
|
|
*/
|
2014-06-19 00:05:59 +02:00
|
|
|
static void PhysicsTickCallback(btDynamicsWorld* physWorld, btScalar timeStep);
|
2014-06-11 22:00:53 +02:00
|
|
|
|
2014-06-06 13:18:32 +02:00
|
|
|
/**
|
|
|
|
* Work related
|
|
|
|
*/
|
|
|
|
WorkContext* _work;
|
2014-07-24 00:57:21 +02:00
|
|
|
|
|
|
|
ScriptMachine* script;
|
2013-07-02 08:06:03 +02:00
|
|
|
};
|
|
|
|
|
2013-07-22 05:39:58 +02:00
|
|
|
#endif
|