/*
===========================================================================
Doom 3 BFG Edition GPL Source Code
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Doom 3 BFG Edition Source Code. If not, see .
In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
*/
#ifndef __GAME_SSD_WINDOW_H__
#define __GAME_SSD_WINDOW_H__
class idGameSSDWindow;
class SSDCrossHair {
public:
enum {
CROSSHAIR_STANDARD = 0,
CROSSHAIR_SUPER,
CROSSHAIR_COUNT
};
const idMaterial* crosshairMaterial[CROSSHAIR_COUNT];
int currentCrosshair;
float crosshairWidth, crosshairHeight;
public:
SSDCrossHair();
~SSDCrossHair();
virtual void WriteToSaveGame( idFile *savefile );
virtual void ReadFromSaveGame( idFile *savefile );
void InitCrosshairs();
void Draw(const idVec2& cursor);
};
enum {
SSD_ENTITY_BASE = 0,
SSD_ENTITY_ASTEROID,
SSD_ENTITY_ASTRONAUT,
SSD_ENTITY_EXPLOSION,
SSD_ENTITY_POINTS,
SSD_ENTITY_PROJECTILE,
SSD_ENTITY_POWERUP
};
class SSDEntity {
public:
//SSDEntity Information
int type;
int id;
idStr materialName;
const idMaterial* material;
idVec3 position;
idVec2 size;
float radius;
float hitRadius;
float rotation;
idVec4 matColor;
idStr text;
float textScale;
idVec4 foreColor;
idGameSSDWindow* game;
int currentTime;
int lastUpdate;
int elapsed;
bool destroyed;
bool noHit;
bool noPlayerDamage;
bool inUse;
public:
SSDEntity();
virtual ~SSDEntity();
virtual void WriteToSaveGame( idFile *savefile );
virtual void ReadFromSaveGame( idFile *savefile, idGameSSDWindow* _game );
void EntityInit();
void SetGame(idGameSSDWindow* _game);
void SetMaterial(const char* _name);
void SetPosition(const idVec3& _position);
void SetSize(const idVec2& _size);
void SetRadius(float _radius, float _hitFactor = 1.0f);
void SetRotation(float _rotation);
void Update();
bool HitTest(const idVec2& pt);
virtual void EntityUpdate() {};
virtual void Draw();
virtual void DestroyEntity();
virtual void OnHit(int key) {};
virtual void OnStrikePlayer() {};
idBounds WorldToScreen(const idBounds worldBounds);
idVec3 WorldToScreen(const idVec3& worldPos);
idVec3 ScreenToWorld(const idVec3& screenPos);
};
/*
*****************************************************************************
* SSDMover
****************************************************************************
*/
class SSDMover : public SSDEntity {
public:
idVec3 speed;
float rotationSpeed;
public:
SSDMover();
virtual ~SSDMover();
virtual void WriteToSaveGame( idFile *savefile );
virtual void ReadFromSaveGame( idFile *savefile, idGameSSDWindow* _game );
void MoverInit(const idVec3& _speed, float _rotationSpeed);
virtual void EntityUpdate();
};
/*
*****************************************************************************
* SSDAsteroid
****************************************************************************
*/
#define MAX_ASTEROIDS 64
class SSDAsteroid : public SSDMover {
public:
int health;
public:
SSDAsteroid();
~SSDAsteroid();
virtual void WriteToSaveGame( idFile *savefile );
virtual void ReadFromSaveGame( idFile *savefile, idGameSSDWindow* _game );
void Init(idGameSSDWindow* _game, const idVec3& startPosition, const idVec2& _size, float _speed, float rotate, int _health);
virtual void EntityUpdate();
static SSDAsteroid* GetNewAsteroid(idGameSSDWindow* _game, const idVec3& startPosition, const idVec2& _size, float _speed, float rotate, int _health);
static SSDAsteroid* GetSpecificAsteroid(int id);
static void WriteAsteroids(idFile* savefile);
static void ReadAsteroids(idFile* savefile, idGameSSDWindow* _game);
protected:
static SSDAsteroid asteroidPool[MAX_ASTEROIDS];
};
/*
*****************************************************************************
* SSDAstronaut
****************************************************************************
*/
#define MAX_ASTRONAUT 8
class SSDAstronaut : public SSDMover {
public:
int health;
public:
SSDAstronaut();
~SSDAstronaut();
virtual void WriteToSaveGame( idFile *savefile );
virtual void ReadFromSaveGame( idFile *savefile, idGameSSDWindow* _game );
void Init(idGameSSDWindow* _game, const idVec3& startPosition, float _speed, float rotate, int _health);
static SSDAstronaut* GetNewAstronaut(idGameSSDWindow* _game, const idVec3& startPosition, float _speed, float rotate, int _health);
static SSDAstronaut* GetSpecificAstronaut(int id);
static void WriteAstronauts(idFile* savefile);
static void ReadAstronauts(idFile* savefile, idGameSSDWindow* _game);
protected:
static SSDAstronaut astronautPool[MAX_ASTRONAUT];
};
/*
*****************************************************************************
* SSDExplosion
****************************************************************************
*/
#define MAX_EXPLOSIONS 64
class SSDExplosion : public SSDEntity {
public:
idVec2 finalSize;
int length;
int beginTime;
int endTime;
int explosionType;
//The entity that is exploding
SSDEntity* buddy;
bool killBuddy;
bool followBuddy;
enum {
EXPLOSION_NORMAL = 0,
EXPLOSION_TELEPORT = 1
};
public:
SSDExplosion();
~SSDExplosion();
virtual void WriteToSaveGame( idFile *savefile );
virtual void ReadFromSaveGame( idFile *savefile, idGameSSDWindow* _game );
void Init(idGameSSDWindow* _game, const idVec3& _position, const idVec2& _size, int _length, int _type, SSDEntity* _buddy, bool _killBuddy = true, bool _followBuddy = true);
virtual void EntityUpdate();
static SSDExplosion* GetNewExplosion(idGameSSDWindow* _game, const idVec3& _position, const idVec2& _size, int _length, int _type, SSDEntity* _buddy, bool _killBuddy = true, bool _followBuddy = true);
static SSDExplosion* GetSpecificExplosion(int id);
static void WriteExplosions(idFile* savefile);
static void ReadExplosions(idFile* savefile, idGameSSDWindow* _game);
protected:
static SSDExplosion explosionPool[MAX_EXPLOSIONS];
};
#define MAX_POINTS 16
class SSDPoints : public SSDEntity {
int length;
int distance;
int beginTime;
int endTime;
idVec3 beginPosition;
idVec3 endPosition;
idVec4 beginColor;
idVec4 endColor;
public:
SSDPoints();
~SSDPoints();
virtual void WriteToSaveGame( idFile *savefile );
virtual void ReadFromSaveGame( idFile *savefile, idGameSSDWindow* _game );
void Init(idGameSSDWindow* _game, SSDEntity* _ent, int _points, int _length, int _distance, const idVec4& color);
virtual void EntityUpdate();
static SSDPoints* GetNewPoints(idGameSSDWindow* _game, SSDEntity* _ent, int _points, int _length, int _distance, const idVec4& color);
static SSDPoints* GetSpecificPoints(int id);
static void WritePoints(idFile* savefile);
static void ReadPoints(idFile* savefile, idGameSSDWindow* _game);
protected:
static SSDPoints pointsPool[MAX_POINTS];
};
#define MAX_PROJECTILES 64
class SSDProjectile : public SSDEntity {
idVec3 dir;
idVec3 speed;
int beginTime;
int endTime;
idVec3 endPosition;
public:
SSDProjectile();
~SSDProjectile();
virtual void WriteToSaveGame( idFile *savefile );
virtual void ReadFromSaveGame( idFile *savefile, idGameSSDWindow* _game );
void Init(idGameSSDWindow* _game, const idVec3& _beginPosition, const idVec3& _endPosition, float _speed, float _size);
virtual void EntityUpdate();
static SSDProjectile* GetNewProjectile(idGameSSDWindow* _game, const idVec3& _beginPosition, const idVec3& _endPosition, float _speed, float _size);
static SSDProjectile* GetSpecificProjectile(int id);
static void WriteProjectiles(idFile* savefile);
static void ReadProjectiles(idFile* savefile, idGameSSDWindow* _game);
protected:
static SSDProjectile projectilePool[MAX_PROJECTILES];
};
#define MAX_POWERUPS 64
/**
* Powerups work in two phases:
* 1.) Closed container hurls at you
* If you shoot the container it open
* 3.) If an opened powerup hits the player he aquires the powerup
* Powerup Types:
* Health - Give a specific amount of health
* Super Blaster - Increases the power of the blaster (lasts a specific amount of time)
* Asteroid Nuke - Destroys all asteroids on screen as soon as it is aquired
* Rescue Powerup - Rescues all astronauts as soon as it is acquited
* Bonus Points - Gives some bonus points when acquired
*/
class SSDPowerup : public SSDMover {
enum {
POWERUP_STATE_CLOSED = 0,
POWERUP_STATE_OPEN
};
enum {
POWERUP_TYPE_HEALTH = 0,
POWERUP_TYPE_SUPER_BLASTER,
POWERUP_TYPE_ASTEROID_NUKE,
POWERUP_TYPE_RESCUE_ALL,
POWERUP_TYPE_BONUS_POINTS,
POWERUP_TYPE_DAMAGE,
POWERUP_TYPE_MAX
};
int powerupState;
int powerupType;
public:
public:
SSDPowerup();
virtual ~SSDPowerup();
virtual void WriteToSaveGame( idFile *savefile );
virtual void ReadFromSaveGame( idFile *savefile, idGameSSDWindow* _game );
virtual void OnHit(int key);
virtual void OnStrikePlayer();
void OnOpenPowerup();
void OnActivatePowerup();
void Init(idGameSSDWindow* _game, float _speed, float _rotation);
static SSDPowerup* GetNewPowerup(idGameSSDWindow* _game, float _speed, float _rotation);
static SSDPowerup* GetSpecificPowerup(int id);
static void WritePowerups(idFile* savefile);
static void ReadPowerups(idFile* savefile, idGameSSDWindow* _game);
protected:
static SSDPowerup powerupPool[MAX_POWERUPS];
};
typedef struct {
float spawnBuffer;
int needToWin;
} SSDLevelData_t;
typedef struct {
float speedMin, speedMax;
float sizeMin, sizeMax;
float rotateMin, rotateMax;
int spawnMin, spawnMax;
int asteroidHealth;
int asteroidPoints;
int asteroidDamage;
} SSDAsteroidData_t;
typedef struct {
float speedMin, speedMax;
float rotateMin, rotateMax;
int spawnMin, spawnMax;
int health;
int points;
int penalty;
} SSDAstronautData_t;
typedef struct {
float speedMin, speedMax;
float rotateMin, rotateMax;
int spawnMin, spawnMax;
} SSDPowerupData_t;
typedef struct {
float speed;
int damage;
int size;
} SSDWeaponData_t;
/**
* SSDLevelStats_t
* Data that is used for each level. This data is reset
* each new level.
*/
typedef struct {
int shotCount;
int hitCount;
int destroyedAsteroids;
int nextAsteroidSpawnTime;
int killedAstronauts;
int savedAstronauts;
//Astronaut Level Data
int nextAstronautSpawnTime;
//Powerup Level Data
int nextPowerupSpawnTime;
SSDEntity* targetEnt;
} SSDLevelStats_t;
/**
* SSDGameStats_t
* Data that is used for the game that is currently running. Memset this
* to completely reset the game
*/
typedef struct {
bool gameRunning;
int score;
int prebonusscore;
int health;
int currentWeapon;
int currentLevel;
int nextLevel;
SSDLevelStats_t levelStats;
} SSDGameStats_t;
class idGameSSDWindow : public idWindow {
public:
idGameSSDWindow(idUserInterfaceLocal *gui);
~idGameSSDWindow();
virtual void WriteToSaveGame( idFile *savefile );
virtual void ReadFromSaveGame( idFile *savefile );
virtual const char* HandleEvent(const sysEvent_t *event, bool *updateVisuals);
virtual idWinVar* GetWinVarByName (const char *_name, bool winLookup = false, drawWin_t** owner = NULL);
virtual void Draw(int time, float x, float y);
void AddHealth(int health);
void AddScore(SSDEntity* ent, int points);
void AddDamage(int damage);
void OnNuke();
void OnRescueAll();
void OnSuperBlaster();
SSDEntity* GetSpecificEntity(int type, int id);
void PlaySound(const char* sound);
static idRandom random;
int ssdTime;
private:
//Initialization
virtual bool ParseInternalVar(const char *name, idTokenParser *src);
void ParseLevelData(int level, const idStr& levelDataString);
void ParseAsteroidData(int level, const idStr& asteroidDataString);
void ParseWeaponData(int weapon, const idStr& weaponDataString);
void ParseAstronautData(int level, const idStr& astronautDataString);
void ParsePowerupData(int level, const idStr& powerupDataString);
void CommonInit();
void ResetGameStats();
void ResetLevelStats();
void ResetEntities();
//Game Running Methods
void StartGame();
void StopGame();
void GameOver();
//Starting the Game
void BeginLevel(int level);
void ContinueGame();
//Stopping the Game
void LevelComplete();
void GameComplete();
void UpdateGame();
void CheckForHits();
void ZOrderEntities();
void SpawnAsteroid();
void FireWeapon(int key);
SSDEntity* EntityHitTest(const idVec2& pt);
void HitAsteroid(SSDAsteroid* asteroid, int key);
void AsteroidStruckPlayer(SSDAsteroid* asteroid);
void RefreshGuiData();
idVec2 GetCursorWorld();
//Astronaut Methods
void SpawnAstronaut();
void HitAstronaut(SSDAstronaut* astronaut, int key);
void AstronautStruckPlayer(SSDAstronaut* astronaut);
//Powerup Methods
void SpawnPowerup();
void StartSuperBlaster();
void StopSuperBlaster();
//void FreeSoundEmitter( bool immediate );
public:
//WinVars used to call functions from the guis
idWinBool beginLevel;
idWinBool resetGame;
idWinBool continueGame;
idWinBool refreshGuiData;
SSDCrossHair crosshair;
idBounds screenBounds;
//Level Data
int levelCount;
idList levelData;
idList asteroidData;
idList astronautData;
idList powerupData;
//Weapon Data
int weaponCount;
idList weaponData;
int superBlasterTimeout;
//All current game data is stored in this structure (except the entity list)
SSDGameStats_t gameStats;
idList entities;
int currentSound;
};
#endif //__GAME_SSD_WINDOW_H__