diff options
Diffstat (limited to 'game/shared/dod/dod_gamerules.h')
| -rw-r--r-- | game/shared/dod/dod_gamerules.h | 526 |
1 files changed, 526 insertions, 0 deletions
diff --git a/game/shared/dod/dod_gamerules.h b/game/shared/dod/dod_gamerules.h new file mode 100644 index 0000000..2649fd8 --- /dev/null +++ b/game/shared/dod/dod_gamerules.h @@ -0,0 +1,526 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: The TF Game rules object +// +// $Workfile: $ +// $Date: $ +// $NoKeywords: $ +//=============================================================================// + +#ifndef DOD_GAMERULES_H +#define DOD_GAMERULES_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "teamplay_gamerules.h" +#include "convar.h" +#include "dod_shareddefs.h" +#include "gamevars_shared.h" +#include "weapon_dodbase.h" +#include "dod_round_timer.h" + +#ifdef CLIENT_DLL + #include "c_baseplayer.h" +#else + #include "player.h" + #include "dod_player.h" + #include "utlqueue.h" + #include "playerclass_info_parse.h" + #include "voice_gamemgr.h" + #include "dod_gamestats.h" +#endif + +#ifdef CLIENT_DLL + #define CDODGameRules C_DODGameRules + #define CDODGameRulesProxy C_DODGameRulesProxy +#else + extern IVoiceGameMgrHelper *g_pVoiceGameMgrHelper; + extern IUploadGameStats *gamestatsuploader; +#endif + +#ifndef CLIENT_DLL + + class CSpawnPoint : public CPointEntity + { + public: + bool IsDisabled() { return m_bDisabled; } + void InputEnable( inputdata_t &inputdata ) { m_bDisabled = false; } + void InputDisable( inputdata_t &inputdata ) { m_bDisabled = true; } + + private: + bool m_bDisabled; + DECLARE_DATADESC(); + }; + +#endif + +class CDODGameRulesProxy : public CGameRulesProxy +{ +public: + DECLARE_CLASS( CDODGameRulesProxy, CGameRulesProxy ); + DECLARE_NETWORKCLASS(); +}; + +class CDODGameRules; + +class CDODRoundStateInfo +{ +public: + DODRoundState m_iRoundState; + const char *m_pStateName; + + void (CDODGameRules::*pfnEnterState)(); // Init and deinit the state. + void (CDODGameRules::*pfnLeaveState)(); + void (CDODGameRules::*pfnThink)(); // Do a PreThink() in this state. +}; + +typedef enum +{ + STARTROUND_ATTACK = 0, + STARTROUND_DEFEND, + + STARTROUND_BEACH, + + STARTROUND_ATTACK_TIMED, + STARTROUND_DEFEND_TIMED, + + STARTROUND_FLAGS, +} startround_voice_t; + +class CDODGamePlayRules +{ +public: + DECLARE_CLASS_NOBASE( CDODGamePlayRules ); + DECLARE_EMBEDDED_NETWORKVAR(); + + DECLARE_SIMPLE_DATADESC(); + + CDODGamePlayRules() + { + Reset(); + } + + // This virtual method is necessary to generate a vtable in all cases + // (DECLARE_PREDICTABLE will generate a vtable also)! + virtual ~CDODGamePlayRules() {} + + void Reset( void ) + { + //RespawnFactor + m_fAlliesRespawnFactor = 1.0f; + m_fAxisRespawnFactor = 1.0f; + } + + //Respawn Factors + float m_fAlliesRespawnFactor; //How delayed are respawning players + float m_fAxisRespawnFactor; //1.0 is normal, 2.0 is twice as long + + int m_iAlliesStartRoundVoice; // Which voice to play at round start + int m_iAxisStartRoundVoice; +}; + + +//Mapper interface for gamerules +class CDODDetect : public CBaseEntity +{ +public: + DECLARE_CLASS( CDODDetect, CBaseEntity ); + + CDODDetect(); + void Spawn( void ); + virtual bool KeyValue( const char *szKeyName, const char *szValue ); + + bool IsMasteredOn( void ); + + inline CDODGamePlayRules *GetGamePlay() { return &m_GamePlayRules; } + CDODGamePlayRules m_GamePlayRules; + +private: +// string_t m_sMaster; +}; + +class CDODViewVectors : public CViewVectors +{ +public: + CDODViewVectors( + Vector vView, + Vector vHullMin, + Vector vHullMax, + Vector vDuckHullMin, + Vector vDuckHullMax, + Vector vDuckView, + Vector vObsHullMin, + Vector vObsHullMax, + Vector vDeadViewHeight, + Vector vProneHullMin, + Vector vProneHullMax ) : + CViewVectors( + vView, + vHullMin, + vHullMax, + vDuckHullMin, + vDuckHullMax, + vDuckView, + vObsHullMin, + vObsHullMax, + vDeadViewHeight ) + { + m_vProneHullMin = vProneHullMin; + m_vProneHullMax = vProneHullMax; + } + + Vector m_vProneHullMin; + Vector m_vProneHullMax; +}; + +//GAMERULES +class CDODGameRules : public CTeamplayRules +{ +public: + DECLARE_CLASS( CDODGameRules, CTeamplayRules ); + + virtual bool ShouldCollide( int collisionGroup0, int collisionGroup1 ); + + inline DODRoundState State_Get( void ) { return m_iRoundState; } + + int GetSubTeam( int team ); + + bool IsGameUnderTimeLimit( void ); + int GetTimeLeft( void ); + + int GetReinforcementTimerSeconds( int team, float flSpawnEligibleTime ); + + bool IsFriendlyFireOn( void ); + bool IsInBonusRound( void ); + + // Get the view vectors for this mod. + virtual const CViewVectors* GetViewVectors() const; + virtual const CDODViewVectors *GetDODViewVectors() const; + virtual const unsigned char *GetEncryptionKey( void ) { return (unsigned char *)"Wl0u5B3F"; } + + bool AwaitingReadyRestart( void ) { return m_bAwaitingReadyRestart; } + float GetRoundRestartTime( void ) { return m_flRestartRoundTime; } + + bool IsInWarmup( void ) { return m_bInWarmup; } + + bool IsBombingTeam( int team ); + + virtual bool IsConnectedUserInfoChangeAllowed( CBasePlayer *pPlayer ); + +#ifndef CLIENT_DLL + float GetPresentDropChance( void ); // holiday 2011, presents instead of ammo boxes +#endif + +#ifdef CLIENT_DLL + + DECLARE_CLIENTCLASS_NOBASE(); // This makes datatables able to access our private vars. + + void SetRoundState( int iRoundState ); + float m_flLastRoundStateChangeTime; + +#else + + DECLARE_SERVERCLASS_NOBASE(); // This makes datatables able to access our private vars. + + CDODGameRules(); + virtual ~CDODGameRules(); + + virtual void LevelShutdown( void ); + void UploadLevelStats( void ); + + virtual bool ClientCommand( CBaseEntity *pEdict, const CCommand &args ); + virtual void RadiusDamage( const CTakeDamageInfo &info, const Vector &vecSrc, float flRadius, int iClassIgnore, CBaseEntity *pEntityIgnore ); + virtual void RadiusDamage( const CTakeDamageInfo &info, const Vector &vecSrcIn, float flRadius, int iClassIgnore, CBaseEntity *pEntityIgnore, bool bIgnoreWorld = false ); + void RadiusStun( const CTakeDamageInfo &info, const Vector &vecSrc, float flRadius ); + virtual void Think(); + virtual void PlayerKilled( CBasePlayer *pVictim, const CTakeDamageInfo &info ); + virtual void ClientDisconnected( edict_t *pClient ); + virtual float FlPlayerFallDamage( CBasePlayer *pPlayer ); + + virtual const char *GetGameDescription( void ) + { + return "Day of Defeat: Source"; + } + + void CreateStandardEntities( void ); + + virtual const char *GetChatPrefix( bool bTeamOnly, CBasePlayer *pPlayer ); + + CBaseEntity *GetPlayerSpawnSpot( CBasePlayer *pPlayer ); + bool IsSpawnPointValid( CBaseEntity *pSpot, CBasePlayer *pPlayer ); + virtual void PlayerSpawn( CBasePlayer *pPlayer ); + + int DODPointsForKill( CBasePlayer *pVictim, const CTakeDamageInfo &info ); + + //Round state machine + void State_Transition( DODRoundState newState ); + void State_Enter( DODRoundState newState ); // Initialize the new state. + void State_Leave(); // Cleanup the previous state. + void State_Think(); // Update the current state. + + CDODRoundStateInfo *m_pCurStateInfo; //Fn ptrs for the current state + float m_flStateTransitionTime; //Timer for round states + + // Find the state info for the specified state. + static CDODRoundStateInfo* State_LookupInfo( DODRoundState state ); + + //State Functions + void State_Enter_INIT( void ); + void State_Think_INIT( void ); + + void State_Enter_PREGAME( void ); + void State_Think_PREGAME( void ); + + void State_Enter_STARTGAME( void ); + void State_Think_STARTGAME( void ); + + void State_Enter_PREROUND( void ); + void State_Think_PREROUND( void ); + + void State_Enter_RND_RUNNING( void ); + void State_Think_RND_RUNNING( void ); + + void State_Enter_ALLIES_WIN( void ); + void State_Think_ALLIES_WIN( void ); + + void State_Enter_AXIS_WIN( void ); + void State_Think_AXIS_WIN( void ); + + void State_Enter_RESTART( void ); + void State_Think_RESTART( void ); + + void SetInWarmup( bool bWarmup ); + void CheckWarmup( void ); + void CheckRestartRound( void ); + void CheckRespawnWaves( void ); + + void InitTeams( void ); + + void RoundRespawn( void ); + void CleanUpMap( void ); + void ResetScores( void ); + + // Respawn everyone regardless of state - round reset + inline void RespawnAllPlayers( void ) { RespawnPlayers( true ); } + + // Respawn only one team, players that are ready to spawn - wave reset + inline void RespawnTeam( int iTeam ) { RespawnPlayers( false, true, iTeam ); } + + void RespawnPlayers( bool bForceRespawn, bool bTeam = false, int iTeam = TEAM_UNASSIGNED ); + + void FailSafeSpawnPlayersOnTeam( int iTeam ); + + bool IsPlayerClassOnTeam( int cls, int team ); + bool CanPlayerJoinClass( CDODPlayer *pPlayer, int cls ); + void ChooseRandomClass( CDODPlayer *pPlayer ); + bool ReachedClassLimit( int team, int cls ); + int CountPlayerClass( int team, int cls ); + int GetClassLimit( int team, int cls ); + + int CountActivePlayers( void ); //How many players have chosen a team? + + void SetWinningTeam( int team ); + void PlayWinSong( int team ); + void PlayStartRoundVoice( void ); + void BroadcastSound( const char *sound ); + void PlaySpawnSoundToTeam( const char *sound, int team ); + + int SelectDefaultTeam( void ); + + void CopyGamePlayLogic( const CDODGamePlayRules otherGamePlay ); + + + void DeathNotice( CBasePlayer *pVictim, const CTakeDamageInfo &info ); + + virtual bool CanHavePlayerItem( CBasePlayer *pPlayer, CBaseCombatWeapon *pWeapon ); + + bool TeamFull( int team_id ); + bool TeamStacked( int iNewTeam, int iCurTeam ); + + const char *GetPlayerClassName( int cls, int team ); + + virtual void ClientSettingsChanged( CBasePlayer *pPlayer ); + + void CheckChatForReadySignal( CDODPlayer *pPlayer, const char *chatmsg ); + bool AreAlliesReady( void ) { return m_bHeardAlliesReady; } + bool AreAxisReady( void ) { return m_bHeardAxisReady; } + + void CreateOrJoinRespawnWave( CDODPlayer *pPlayer ); + + virtual bool InRoundRestart( void ); + + void SendTeamScoresEvent( void ); + + void WriteStatsFile( const char *pszLogName ); + + void AddTimerSeconds( int iSecondsToAdd ); + int GetTimerSeconds( void ); + + void CapEvent( int event, int team ); + int m_iLastAlliesCapEvent; + int m_iLastAxisCapEvent; + + // Set the time at which the map was reset to 'now' + // and send an event with the time remaining until map change + void ResetMapTime( void ); + + virtual CBaseCombatWeapon *GetNextBestWeapon( CBaseCombatCharacter *pPlayer, CBaseCombatWeapon *pCurrentWeapon ); + + virtual bool CanEntityBeUsePushed( CBaseEntity *pEnt ); + + virtual void CalcDominationAndRevenge( CDODPlayer *pAttacker, CDODPlayer *pVictim, int *piDeathFlags ); + + float m_flNextFailSafeWaveCheckTime; + + CUtlVector<EHANDLE> *GetSpawnPointListForTeam( int iTeam ); + + virtual void GetTaggedConVarList( KeyValues *pCvarTagList ); + +protected: + virtual void GoToIntermission( void ); + virtual bool UseSuicidePenalty() { return false; } + + void CheckPlayerPositions( void ); + +private: + bool CheckTimeLimit( void ); + bool CheckWinLimit( void ); + + void RadiusDamage( const CTakeDamageInfo &info, const Vector &vecSrcIn, float flRadius, int iClassIgnore, bool bIgnoreWorld ); + float GetExplosionDamageAdjustment(Vector & vecSrc, Vector & vecEnd, CBaseEntity *pTarget, CBaseEntity *pEntityToIgnore); // returns multiplier between 0.0 and 1.0 that is the percentage of any damage done from vecSrc to vecEnd that actually makes it. + float GetAmountOfEntityVisible(Vector & src, CBaseEntity *pTarget, CBaseEntity *pEntityToIgnore); // returns a value from 0 to 1 that is the percentage of player visible from src. + + void CheckLevelInitialized( void ); + bool m_bLevelInitialized; + + int m_iSpawnPointCount_Allies; //number of allies spawns on the map + int m_iSpawnPointCount_Axis; //number of axis spawns on the map + + #define MAX_PLAYERCLASSES_PER_TEAM 16 + + PLAYERCLASS_FILE_INFO_HANDLE m_hPlayerClassInfoHandles[2][MAX_PLAYERCLASSES_PER_TEAM]; + + // restart and warmup variables + float m_flWarmupTimeEnds; + float m_flNextPeriodicThink; + + Vector2D m_vecPlayerPositions[MAX_PLAYERS]; + + + //BELOW HERE NEED TO BE HOOKED UP + + + int m_iNumAlliesAlive; //the number of players alive on each team + int m_iNumAxisAlive; + int m_iNumAlliesOnTeam; //the number of players on each team + int m_iNumAxisOnTeam; + + bool m_bClanMatch; + bool m_bClanMatchActive; + + float GetMaxWaveTime( int iTeam ); + float GetWaveTime( int iTeam ); + void AddWaveTime( int team, float flTime ); + void PopWaveTime( int team ); + + void DetectGameRules( void ); + + bool m_bHeardAlliesReady; + bool m_bHeardAxisReady; + + bool m_bUsingTimer; + int m_iTimerWinTeam; + CHandle< CDODRoundTimer > m_pRoundTimer; + + bool m_bPlayTimerWarning_1Minute; + bool m_bPlayTimerWarning_2Minute; + + bool m_bInitialSpawn; // first time activating? longer wait time for people to join + + bool m_bChangeLevelOnRoundEnd; + +#endif //CLIENT_DLL + + CNetworkVarEmbedded( CDODGamePlayRules, m_GamePlayRules ); + + CNetworkVar( DODRoundState, m_iRoundState ); + + #define DOD_RESPAWN_QUEUE_SIZE 10 + + CNetworkArray( float, m_AlliesRespawnQueue, DOD_RESPAWN_QUEUE_SIZE ); + CNetworkArray( float, m_AxisRespawnQueue, DOD_RESPAWN_QUEUE_SIZE ); + + CNetworkVar( int, m_iAlliesRespawnHead ); + CNetworkVar( int, m_iAlliesRespawnTail ); + + CNetworkVar( int, m_iAxisRespawnHead ); + CNetworkVar( int, m_iAxisRespawnTail ); + + int m_iNumAlliesRespawnWaves; + int m_iNumAxisRespawnWaves; + + CNetworkVar( bool, m_bInWarmup ); + CNetworkVar( bool, m_bAwaitingReadyRestart ); + CNetworkVar( float, m_flRestartRoundTime ); + CNetworkVar( float, m_flMapResetTime ); // time that the map was reset + + CNetworkVar( bool, m_bAlliesAreBombing ); + CNetworkVar( bool, m_bAxisAreBombing ); + +#ifndef CLIENT_DLL +public: + // Stats + void Stats_PlayerKill( int team, int cls ); + void Stats_PlayerCap( int team, int cls ); + void Stats_PlayerDefended( int team, int cls ); + void Stats_WeaponFired( int weaponID ); + void Stats_WeaponHit( int weaponID, float flDist ); + int Stats_WeaponDistanceToBucket( int weaponID, float flDist ); + + float m_flSecondsPlayedPerClass_Allies[7]; + float m_flSecondsPlayedPerClass_Axis[7]; + + int m_iStatsKillsPerClass_Allies[6]; + int m_iStatsKillsPerClass_Axis[6]; + + int m_iStatsSpawnsPerClass_Allies[6]; + int m_iStatsSpawnsPerClass_Axis[6]; + + int m_iStatsCapsPerClass_Allies[6]; + int m_iStatsCapsPerClass_Axis[6]; + + int m_iStatsDefensesPerClass_Allies[6]; + int m_iStatsDefensesPerClass_Axis[6]; + + int m_iWeaponShotsFired[WEAPON_MAX]; + int m_iWeaponShotsHit[WEAPON_MAX]; + int m_iWeaponDistanceBuckets[WEAPON_MAX][DOD_NUM_WEAPON_DISTANCE_BUCKETS]; // distances of buckets are defined per-weapon + + // List of spawn points + CUtlVector<EHANDLE> m_AlliesSpawnPoints; + CUtlVector<EHANDLE> m_AxisSpawnPoints; + + bool m_bWinterHolidayActive; + +#endif // ndef CLIENTDLL +}; + +//----------------------------------------------------------------------------- +// Gets us at the team fortress game rules +//----------------------------------------------------------------------------- + +inline CDODGameRules* DODGameRules() +{ + return static_cast<CDODGameRules*>(g_pGameRules); +} + +#ifdef CLIENT_DLL + +#else + bool EntityPlacementTest( CBaseEntity *pMainEnt, const Vector &vOrigin, Vector &outPos, bool bDropToGround ); +#endif //CLIENT_DLL + + +#endif // DOD_GAMERULES_H |