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