//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Entity that propagates general data needed by clients for every player.
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "dod_objective_resource.h"
#include "shareddefs.h"
#include <coordsize.h>

// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"

// Datatable
IMPLEMENT_SERVERCLASS_ST_NOBASE(CDODObjectiveResource, DT_DODObjectiveResource)

	SendPropInt( SENDINFO(m_iNumControlPoints), 4, SPROP_UNSIGNED ),

	// data variables
	SendPropArray( SendPropVector( SENDINFO_ARRAY(m_vCPPositions), -1, SPROP_COORD), m_vCPPositions ),
	SendPropArray3( SENDINFO_ARRAY3(m_bCPIsVisible), SendPropInt( SENDINFO_ARRAY(m_bCPIsVisible), 1, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_iAlliesIcons), SendPropInt( SENDINFO_ARRAY(m_iAlliesIcons), 8, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_iAxisIcons), SendPropInt( SENDINFO_ARRAY(m_iAxisIcons), 8, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_iNeutralIcons), SendPropInt( SENDINFO_ARRAY(m_iNeutralIcons), 8, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_iTimerCapIcons), SendPropInt( SENDINFO_ARRAY(m_iTimerCapIcons), 8, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_iBombedIcons), SendPropInt( SENDINFO_ARRAY(m_iBombedIcons), 8, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_iAlliesReqCappers), SendPropInt( SENDINFO_ARRAY(m_iAlliesReqCappers), 4, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_iAxisReqCappers), SendPropInt( SENDINFO_ARRAY(m_iAxisReqCappers), 4, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_flAlliesCapTime), SendPropTime( SENDINFO_ARRAY(m_flAlliesCapTime) ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_flAxisCapTime), SendPropTime( SENDINFO_ARRAY(m_flAxisCapTime) ) ),

	SendPropArray3( SENDINFO_ARRAY3(m_bBombPlanted), SendPropInt( SENDINFO_ARRAY(m_bBombPlanted), 1, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_iBombsRequired), SendPropInt( SENDINFO_ARRAY(m_iBombsRequired), 2, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_iBombsRemaining), SendPropInt( SENDINFO_ARRAY(m_iBombsRemaining), 2, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_bBombBeingDefused), SendPropInt( SENDINFO_ARRAY(m_bBombBeingDefused), 1, SPROP_UNSIGNED ) ),

	// state variables
	SendPropArray3( SENDINFO_ARRAY3(m_iNumAllies), SendPropInt( SENDINFO_ARRAY(m_iNumAllies), 4, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_iNumAxis), SendPropInt( SENDINFO_ARRAY(m_iNumAxis), 4, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_iCappingTeam), SendPropInt( SENDINFO_ARRAY(m_iCappingTeam), 4, SPROP_UNSIGNED ) ),
	SendPropArray3( SENDINFO_ARRAY3(m_iOwner), SendPropInt( SENDINFO_ARRAY(m_iOwner), 4, SPROP_UNSIGNED ) ),

END_SEND_TABLE()


BEGIN_DATADESC( CDODObjectiveResource )
END_DATADESC()


LINK_ENTITY_TO_CLASS( dod_objective_resource, CDODObjectiveResource );

CDODObjectiveResource *g_pObjectiveResource;

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CDODObjectiveResource::Spawn( void )
{
	m_iNumControlPoints = 0;

	for ( int i=0; i < MAX_CONTROL_POINTS; i++ )
	{
		// data variables
		m_vCPPositions.Set( i, vec3_origin );
		m_bCPIsVisible.Set( i, true );
		m_iAlliesIcons.Set( i, 0 );
		m_iAxisIcons.Set( i, 0 );
		m_iNeutralIcons.Set( i, 0 );
		m_iTimerCapIcons.Set( i, 0 );
		m_iBombedIcons.Set( i, 0 );
		m_iAlliesReqCappers.Set( i, 0 );
		m_iAxisReqCappers.Set( i, 0 );
		m_flAlliesCapTime.Set( i, 0.0f );
		m_flAxisCapTime.Set( i, 0.0f );
		m_bBombPlanted.Set( i, 0 );
		m_iBombsRequired.Set( i, 0 );
		m_iBombsRemaining.Set( i, 0 );
		m_bBombBeingDefused.Set( i, 0 );

		// state variables
		m_iNumAllies.Set( i, 0 );
		m_iNumAxis.Set( i, 0 );
		m_iCappingTeam.Set( i, TEAM_UNASSIGNED );
		m_iOwner.Set( i, TEAM_UNASSIGNED );
	}

}

//-----------------------------------------------------------------------------
// Purpose: The objective resource is always transmitted to clients
//-----------------------------------------------------------------------------
int CDODObjectiveResource::UpdateTransmitState()
{
	// ALWAYS transmit to all clients.
	return SetTransmitState( FL_EDICT_ALWAYS );
}

//-----------------------------------------------------------------------------
// Purpose: Round is starting, reset state
//-----------------------------------------------------------------------------
void CDODObjectiveResource::ResetControlPoints( void )
{
	for ( int i=0; i < MAX_CONTROL_POINTS; i++ )
	{
		m_iNumAllies.Set( i, 0 );
		m_iNumAxis.Set( i, 0 );
		m_iCappingTeam.Set( i, TEAM_UNASSIGNED );

		m_bBombPlanted.Set( i, 0 );
		m_bBombBeingDefused.Set( i, 0 );
	}
}

//-----------------------------------------------------------------------------
// Purpose: Data setting functions
//-----------------------------------------------------------------------------
void CDODObjectiveResource::SetNumControlPoints( int num )
{
	Assert( num <= MAX_CONTROL_POINTS );
	m_iNumControlPoints = num;
}

void CDODObjectiveResource::SetCPIcons( int index, int iAlliesIcon, int iAxisIcon, int iNeutralIcon, int iTimerCapIcon, int iBombedIcon )
{
	AssertValidIndex(index);
	m_iAlliesIcons.Set( index, iAlliesIcon);
	m_iAxisIcons.Set( index, iAxisIcon );
	m_iNeutralIcons.Set( index, iNeutralIcon );
	m_iTimerCapIcons.Set( index, iTimerCapIcon );
	m_iBombedIcons.Set( index, iBombedIcon );
}

void CDODObjectiveResource::SetCPPosition( int index, const Vector& vPosition )
{
	AssertValidIndex(index);
	m_vCPPositions.Set( index, vPosition );
}

void CDODObjectiveResource::SetCPVisible( int index, bool bVisible )
{
	AssertValidIndex(index);
	m_bCPIsVisible.Set( index, bVisible );
}

void CDODObjectiveResource::SetCPRequiredCappers( int index, int iReqAllies, int iReqAxis )
{
	AssertValidIndex(index);
	m_iAlliesReqCappers.Set( index, iReqAllies );
	m_iAxisReqCappers.Set( index, iReqAxis );
}

void CDODObjectiveResource::SetCPCapTime( int index, float flAlliesCapTime, float flAxisCapTime )
{
	AssertValidIndex(index);
	m_flAlliesCapTime.Set( index, flAlliesCapTime );
	m_flAxisCapTime.Set( index, flAxisCapTime );
}

//-----------------------------------------------------------------------------
// Purpose: Data setting functions
//-----------------------------------------------------------------------------
void CDODObjectiveResource::SetNumPlayers( int index, int team, int iNumPlayers )
{
	AssertValidIndex(index);

	switch( team )
	{
	case TEAM_ALLIES:
		m_iNumAllies.Set( index, iNumPlayers );
		break;

	case TEAM_AXIS:
		m_iNumAxis.Set( index, iNumPlayers );
		break;

	default:
		Assert( 0 );
		break;
	}
}

void CDODObjectiveResource::StartCap( int index, int team )
{
	AssertValidIndex(index);
	m_iCappingTeam.Set( index, team );
}

void CDODObjectiveResource::SetOwningTeam( int index, int team )
{
	AssertValidIndex(index);
	m_iOwner.Set( index, team );

	// clear the capper
	m_iCappingTeam.Set( index, TEAM_UNASSIGNED );
}

void CDODObjectiveResource::SetCappingTeam( int index, int team )
{
	AssertValidIndex(index);
	m_iCappingTeam.Set( index, team );
}

void CDODObjectiveResource::SetBombPlanted( int index, bool bPlanted )
{
	AssertValidIndex(index);
	m_bBombPlanted.Set( index, bPlanted );
}

void CDODObjectiveResource::SetBombBeingDefused( int index, bool bBeingDefused )
{
	AssertValidIndex(index);
	m_bBombBeingDefused.Set( index, bBeingDefused );
}

void CDODObjectiveResource::SetBombsRequired( int index, int iBombsRequired )
{
	AssertValidIndex(index);
	m_iBombsRequired.Set( index, iBombsRequired );
}

void CDODObjectiveResource::SetBombsRemaining( int index, int iBombsRemaining )
{
	AssertValidIndex(index);
	m_iBombsRemaining.Set( index, iBombsRemaining );
}