/*
===========================================================================
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__