//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: DOD's objective resource, transmits all objective states to players
//
// $NoKeywords: $
//=============================================================================//

#ifndef TF_OBJECTIVE_RESOURCE_H
#define TF_OBJECTIVE_RESOURCE_H
#ifdef _WIN32
#pragma once
#endif

#include "tf_shareddefs.h"
#include "team_objectiveresource.h"

class CTFObjectiveResource : public CBaseTeamObjectiveResource
{
	DECLARE_CLASS( CTFObjectiveResource, CBaseTeamObjectiveResource );
public:
	DECLARE_SERVERCLASS();
	DECLARE_DATADESC();

	CTFObjectiveResource();
	~CTFObjectiveResource();

	virtual void Spawn( void );

	void SetMannVsMachineMaxWaveCount( int nCount ) { m_nMannVsMachineMaxWaveCount = nCount; }
	int GetMannVsMachineMaxWaveCount( void ) { return m_nMannVsMachineMaxWaveCount; }
	void SetMannVsMachineWaveCount( int nCount ) { m_nMannVsMachineWaveCount = nCount; }
	int GetMannVsMachineWaveCount( void ) { return m_nMannVsMachineWaveCount; }

	void SetMannVsMachineWaveEnemyCount( int nCount ) { m_nMannVsMachineWaveEnemyCount = nCount; }
	int	 GetMannVsMachineWaveEnemyCount( void ) { return m_nMannVsMachineWaveEnemyCount.Get(); }

	void AddMvMWorldMoney( int nCurrency ) { m_nMvMWorldMoney += nCurrency; }

	void SetMannVsMachineNextWaveTime( float flTime ) { m_flMannVsMachineNextWaveTime = flTime; }
	void SetMannVsMachineBetweenWaves( bool bVal ) { m_bMannVsMachineBetweenWaves = bVal; }
	bool GetMannVsMachineIsBetweenWaves( void ) { return m_bMannVsMachineBetweenWaves; }

	void SetMannVsMachineWaveClassCount( int nIndex, int nCount );
	void SetMannVsMachineWaveClassName( int nIndex, string_t iszClassIconName );
	void IncrementMannVsMachineWaveClassCount( string_t iszClassIconName, unsigned int iFlags );
	void DecrementMannVsMachineWaveClassCount( string_t iszClassIconName, unsigned int iFlags );
	void IncrementTeleporterCount();
	void DecrementTeleporterCount();
	int GetMannVsMachineWaveClassCount( int nIndex );
	void SetMannVsMachineWaveClassActive( string_t iszClassIconName, bool bActive = true );

	string_t GetMannVsMachineWaveClassName( int nIndex ) { return m_iszMannVsMachineWaveClassNames[ nIndex ]; }
	void ClearMannVsMachineWaveClassFlags( void );
	void AddMannVsMachineWaveClassFlags( int nIndex, unsigned int iFlags );
	unsigned int GetMannVsMachineWaveClassFlags( int nIndex ) { return m_nMannVsMachineWaveClassFlags[ nIndex ]; }

	void SetFlagCarrierUpgradeLevel( int nLevel ){ m_nFlagCarrierUpgradeLevel = nLevel; }
	int GetFlagCarrierUpgradeLevel( void ){ return m_nFlagCarrierUpgradeLevel; }
	void SetBaseMvMBombUpgradeTime( float nTime ){ m_flMvMBaseBombUpgradeTime = nTime; }
	float GetBaseMvMBombUpgradeTime( void ){ return m_flMvMBaseBombUpgradeTime; }
	void SetNextMvMBombUpgradeTime( float nTime ){ m_flMvMNextBombUpgradeTime = nTime; }
	float GetNextMvMBombUpgradeTime( void ) { return m_flMvMNextBombUpgradeTime; }
	
	void SetMannVsMachineChallengeIndex( int iIndex ) { m_iChallengeIndex = iIndex; }
	int	 GetMannVsMachineChallengeIndex( void ) { return m_iChallengeIndex; }
	void SetMvMPopfileName( string_t iszMvMPopfileName ) { m_iszMvMPopfileName = iszMvMPopfileName; }
	string_t GetMvMPopfileName( void ) const { return m_iszMvMPopfileName.Get(); }

	void SetMannVsMachineEventPopfileType( int nType ){ m_nMvMEventPopfileType.Set( nType ); }

	string_t GetTeleporterString() const { return m_teleporterString; }

private:
	CNetworkVar( int, m_nMannVsMachineMaxWaveCount );
	CNetworkVar( int, m_nMannVsMachineWaveCount );
	CNetworkVar( int, m_nMannVsMachineWaveEnemyCount );

	CNetworkVar( int, m_nMvMWorldMoney );

	CNetworkVar( float, m_flMannVsMachineNextWaveTime );
	CNetworkVar( bool, m_bMannVsMachineBetweenWaves );
	
	CNetworkArray( int, m_nMannVsMachineWaveClassCounts, MVM_CLASS_TYPES_PER_WAVE_MAX );
	CNetworkArray( int, m_nMannVsMachineWaveClassCounts2, MVM_CLASS_TYPES_PER_WAVE_MAX );
	CNetworkArray( string_t, m_iszMannVsMachineWaveClassNames, MVM_CLASS_TYPES_PER_WAVE_MAX );
	CNetworkArray( string_t, m_iszMannVsMachineWaveClassNames2, MVM_CLASS_TYPES_PER_WAVE_MAX );
	CNetworkArray( unsigned int, m_nMannVsMachineWaveClassFlags, MVM_CLASS_TYPES_PER_WAVE_MAX );
	CNetworkArray( unsigned int, m_nMannVsMachineWaveClassFlags2, MVM_CLASS_TYPES_PER_WAVE_MAX );
	CNetworkArray( bool, m_bMannVsMachineWaveClassActive, MVM_CLASS_TYPES_PER_WAVE_MAX );
	CNetworkArray( bool, m_bMannVsMachineWaveClassActive2, MVM_CLASS_TYPES_PER_WAVE_MAX );

	CNetworkVar( int, m_nFlagCarrierUpgradeLevel );
	CNetworkVar( float, m_flMvMBaseBombUpgradeTime );
	CNetworkVar( float, m_flMvMNextBombUpgradeTime );

	CNetworkVar( int, m_iChallengeIndex );
	CNetworkVar( string_t, m_iszMvMPopfileName ) ;
	CNetworkVar( int, m_nMvMEventPopfileType );

	string_t m_teleporterString;
};

inline CTFObjectiveResource *TFObjectiveResource()
{
	return static_cast< CTFObjectiveResource *>( g_pObjectiveResource );
}

#endif	// TF_OBJECTIVE_RESOURCE_H