//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #ifndef DOD_CONTROL_POINT_MASTER_H #define DOD_CONTROL_POINT_MASTER_H #ifdef _WIN32 #pragma once #endif #include "utlmap.h" #include "dod_shareddefs.h" #include "dod_team.h" #include "dod_gamerules.h" #include "dod_control_point.h" #include "dod_area_capture.h" #include "dod_objective_resource.h" #include "GameEventListener.h" // ==================== // Control Point Master // ==================== // One ControlPointMaster is spawned per level. Shortly after spawning it detects all the Control // points in the map and puts them into the m_ControlPoints. From there it detects the state // where all points are captured and resets them if necessary It gives points every time interval to // the owners of the points // ==================== #define TIMER_CONTEXT "TIMER_CONTEXT" #define FLAGS_CONTEXT "FLAGS_CONTEXT" class CControlPointMaster : public CBaseEntity { public: DECLARE_CLASS( CControlPointMaster, CBaseEntity ); CControlPointMaster(); virtual void Spawn( void ); virtual bool KeyValue( const char *szKeyName, const char *szValue ); int GetNumPoints( void ); int GetPointOwner( int point ); void Reset( void ); void RoundRespawn( void ); int CountAdvantageFlags( int team ); bool IsActive( void ) { return ( m_bDisabled == false ); } bool IsUsingRoundTimer( void ) { return m_bUseTimer; } void GetTimerData( int &iTimerSeconds, int &iTimerWinTeam ); void FireTeamWinOutput( int iWinningTeam ); void CheckWinConditions( void ); bool WouldNewCPOwnerWinGame( CControlPoint *pPoint, int iNewOwner ); CControlPoint *GetCPByIndex( int index ); private: void BecomeActive( void ); void BecomeInactive( void ); void EXPORT CPMThink( void ); int TeamOwnsAllPoints( CControlPoint *pOverridePoint = NULL, int iOverrideNewTeam = TEAM_UNASSIGNED ); void TeamWins( int team ); bool FindControlPoints( void ); //look in the map to find active control points void InputAddTimerSeconds( inputdata_t &inputdata ); CUtlMap m_ControlPoints; bool m_bFoundPoints; //true when the control points have been found and the array is initialized float m_fGivePointsTime; //the time at which we give points for holding control points DECLARE_DATADESC(); bool m_bDisabled; //is this CPM active or not void InputEnable( inputdata_t &inputdata ) { BecomeInactive(); } void InputDisable( inputdata_t &inputdata ) { BecomeActive(); } void InputRoundInit( inputdata_t &inputdata ); void InputRoundStart( inputdata_t &inputdata ); bool m_bUseTimer; int m_iTimerTeam; int m_iTimerLength; COutputEvent m_AlliesWinOutput; COutputEvent m_AxisWinOutput; }; class CDODCustomScoring : public CBaseEntity, public CGameEventListener { public: DECLARE_CLASS( CDODCustomScoring, CBaseEntity ); DECLARE_DATADESC(); CDODCustomScoring() { ListenForGameEvent( "dod_round_win" ); ListenForGameEvent( "dod_round_active" ); } virtual void Spawn( void ) { Assert( m_iPointTeam == TEAM_ALLIES || m_iPointTeam == TEAM_AXIS ); } virtual void FireGameEvent( IGameEvent *event ) { const char *eventName = event->GetName(); if ( !Q_strcmp( eventName, "dod_round_win" ) ) { int team = event->GetInt( "team" ); if ( team == m_iPointTeam ) { GiveRemainingPoints(); } // stop giving points, round is over SetThink( NULL ); // think no more! } else if ( !Q_strcmp( eventName, "dod_round_active" ) ) { StartGivingPoints(); } } // Needs to be activated by gamerules void StartGivingPoints( void ) { if ( m_iNumPointGives <= 0 ) return; if ( m_iPointsToGive <= 0 ) return; m_iRemainingPoints = m_iNumPointGives * m_iPointsToGive; SetThink( &CDODCustomScoring::PointsThink ); SetNextThink( gpGlobals->curtime + m_iTickLength ); } // Give this team all the points that they would have gotten had we continued void GiveRemainingPoints( void ) { GivePoints( m_iRemainingPoints ); } // input to give tick points to our team void InputGivePoints( inputdata_t &inputdata ) { int iPoints = inputdata.value.Int(); GetGlobalTeam(m_iPointTeam)->AddScore( MAX( iPoints, 0 ) ); } // accessor for our point team int GetPointTeam( void ) { return m_iPointTeam; } private: void GivePoints( int points ) { GetGlobalTeam(m_iPointTeam)->AddScore( MAX( points, 0 ) ); m_iRemainingPoints -= points; if ( points > 0 ) { if ( points == 1 ) { UTIL_ClientPrintAll( HUD_PRINTTALK, "#game_score_allie_point" ); } else { char buf[8]; Q_snprintf( buf, sizeof(buf), "%d", points ); UTIL_ClientPrintAll( HUD_PRINTTALK, "#game_score_allie_points", buf ); } IGameEvent *event = gameeventmanager->CreateEvent( "dod_tick_points" ); if ( event ) { event->SetInt( "team", m_iPointTeam ); event->SetInt( "score", points ); event->SetInt( "totalscore", GetGlobalTeam(m_iPointTeam)->GetScore() ); gameeventmanager->FireEvent( event ); } } } void PointsThink( void ) { GivePoints( m_iPointsToGive ); SetNextThink( gpGlobals->curtime + m_iTickLength ); } int m_iPointTeam; // team to give points to int m_iPointsToGive; // points to give per tick int m_iRemainingPoints; // total number of points we have left to give int m_iTickLength; // time between point gives int m_iNumPointGives; // number of times we're planning on giving out points }; #endif //DOD_CONTROL_POINT_MASTER_H