gremlin/src/common/Game.h

130 lines
2.9 KiB
C++

#ifndef GREMLIN_GAME_H
#define GREMLIN_GAME_H
#include "common.h"
#include "sigslot.h"
#include "trimeshloader.h"
#include "Schedule.h"
#include <vector>
#include <memory>
// bullet forward declatations
class btDefaultCollisionConfiguration;
class btCollisionDispatcher;
class btBroadphaseInterface;
class btSequentialImpulseConstraintSolver;
class btDiscreteDynamicsWorld;
class btCollisionShape;
class btTriangleIndexVertexArray;
class btRigidBody;
class btMotionState;
namespace gln {
typedef struct Team Team;
typedef struct player_t player_t;
class Game;
#define GAME_PLAYER_COUNT 64
#define GAME_BOMB_COUNT (GAME_PLAYER_COUNT * 5)
#define GAME_POINT_COUNT 50
struct player_t {
uint16_t id;
uint16_t status;
// double x, y, z;
// double rx, ry, rz, rw;
// double vx, vy, vz;
Team *team;
uint16_t points;
std::auto_ptr<btMotionState> state;
std::auto_ptr<btRigidBody> body;
float m[16];
};
struct bomb_t {
uint8_t status;
double x, y, z;
double vx, vy, vz;
double ttl;
};
struct point_t {
uint8_t status;
double x, y, z;
};
class Team {
public:
uint16_t id;
double x, y, z;
float color[4];
uint16_t points;
uint16_t wins;
};
class Game {
public:
Game();
~Game();
std::vector<Team> teams;
player_t player[GAME_PLAYER_COUNT];
bomb_t bomb[GAME_BOMB_COUNT];
point_t point[GAME_POINT_COUNT];
int16_t max_player_id;
int master;
double updateTime;
player_t *local_player;
sigslot::signal3<double, double, double> ExplosionSignal;
void setup();
void reset();
Team *team_with_least_players();
player_t *spawnPlayer(Team *team);
player_t *spawnPlayerWithId(Team *team, uint16_t id);
Team *getTeam(uint16_t id);
player_t *getPlayer(uint16_t id);
bomb_t *getBomb(uint16_t index);
void update_players(double dt);
bomb_t *spawn_bomb();
point_t *spawn_point();
void update_bombs(double dt);
void update_points(double dt);
void update(double time, double dt);
void set_master(int master);
player_t *getFreePlayer();
void explode_bomb(bomb_t *bomb);
void update_point(point_t *point);
size_t active_team_players(Team *team);
tlTrimesh *levelMesh;
tlTrimesh *shipMesh;
private:
void setupLevel();
void loadLevelShape();
void loadShipShape();
std::auto_ptr<btTriangleIndexVertexArray> levelVertexArray;
std::auto_ptr<btCollisionShape> levelShape;
std::auto_ptr<btMotionState> levelState;
std::auto_ptr<btRigidBody> levelBody;
std::auto_ptr<btTriangleIndexVertexArray> shipVertexArray;
std::auto_ptr<btCollisionShape> shipShape;
const std::auto_ptr<btDefaultCollisionConfiguration> collisionConfiguration;
const std::auto_ptr<btCollisionDispatcher> dispatcher;
const std::auto_ptr<btBroadphaseInterface> overlappingPairCache;
const std::auto_ptr<btSequentialImpulseConstraintSolver> solver;
const std::auto_ptr<btDiscreteDynamicsWorld> dynamicsWorld;
Schedule slaveUpdate;
};
} // namespace grln
#endif