//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

// Author: Michael S. Booth (mike@turtlerockstudios.com), 2003

#include "cbase.h"
#include "cs_gamerules.h"
#include "KeyValues.h"

#include "cs_bot.h"

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

//--------------------------------------------------------------------------------------------------------------
void CCSBot::OnBombPickedUp( IGameEvent *event )
{
	if ( !IsAlive() )
		return;

	// don't react to our own events
	CBasePlayer *player = UTIL_PlayerByUserId( event->GetInt( "userid" ) );
	if ( player == this )
		return;

	if (GetTeamNumber() == TEAM_CT && player)
	{
		// check if we're close enough to hear it
		const float bombPickupHearRangeSq = 1000.0f * 1000.0f;
		Vector myOrigin = GetCentroid( this );

		if ((myOrigin - player->GetAbsOrigin()).LengthSqr() < bombPickupHearRangeSq)
		{
			GetChatter()->TheyPickedUpTheBomb();
			GetGameState()->UpdateBomber( player->GetAbsOrigin() );
		}
	}
}


//--------------------------------------------------------------------------------------------------------------
void CCSBot::OnBombPlanted( IGameEvent *event )
{
	m_gameState.OnBombPlanted( event );

	if ( !IsAlive() )
		return;

	// don't react to our own events
	CBasePlayer *player = UTIL_PlayerByUserId( event->GetInt( "userid" ) );
	if ( player == this )
		return;

	// if we're a TEAM_CT, forget what we're doing and go after the bomb
	if (GetTeamNumber() == TEAM_CT)
	{
		Idle();
	}

	// if we are following someone, stop following
	if (IsFollowing())
	{
		StopFollowing();
		Idle();
	}
}


//--------------------------------------------------------------------------------------------------------------
void CCSBot::OnBombBeep( IGameEvent *event )
{
	if ( !IsAlive() )
		return;

	// don't react to our own events
	CBasePlayer *player = UTIL_PlayerByUserId( event->GetInt( "userid" ) );
	if ( player == this )
		return;

	CBaseEntity *entity = UTIL_EntityByIndex( event->GetInt( "entindex" ) );
	Vector myOrigin = GetCentroid( this );

	// if we don't know where the bomb is, but heard it beep, we've discovered it
	if (GetGameState()->IsPlantedBombLocationKnown() == false && entity)
	{
		// check if we're close enough to hear it
		const float bombBeepHearRangeSq = 1500.0f * 1500.0f;
		if ((myOrigin - entity->GetAbsOrigin()).LengthSqr() < bombBeepHearRangeSq)
		{
			// radio the news to our team
			if (GetTeamNumber() == TEAM_CT && GetGameState()->GetPlantedBombsite() == CSGameState::UNKNOWN)
			{
				const CCSBotManager::Zone *zone = TheCSBots()->GetZone( entity->GetAbsOrigin() );
				if (zone)
					GetChatter()->FoundPlantedBomb( zone->m_index );
			}

			// remember where the bomb is
			GetGameState()->UpdatePlantedBomb( entity->GetAbsOrigin() );
		}
	}
}


//--------------------------------------------------------------------------------------------------------------
void CCSBot::OnBombDefuseBegin( IGameEvent *event )
{
}


//--------------------------------------------------------------------------------------------------------------
void CCSBot::OnBombDefused( IGameEvent *event )
{
	m_gameState.OnBombDefused( event );

	if ( !IsAlive() )
		return;

	// don't react to our own events
	CBasePlayer *player = UTIL_PlayerByUserId( event->GetInt( "userid" ) );
	if ( player == this )
		return;

	if (GetTeamNumber() == TEAM_CT)
	{
		if (TheCSBots()->GetBombTimeLeft() < 2.0f)
			GetChatter()->Say( "BarelyDefused" );
	}
}


//--------------------------------------------------------------------------------------------------------------
void CCSBot::OnBombDefuseAbort( IGameEvent *event )
{
	if ( !IsAlive() )
		return;

	// don't react to our own events
	CBasePlayer *player = UTIL_PlayerByUserId( event->GetInt( "userid" ) );
	if ( player == this )
		return;

	PrintIfWatched( "BOMB DEFUSE ABORTED\n" );
}


//--------------------------------------------------------------------------------------------------------------
void CCSBot::OnBombExploded( IGameEvent *event )
{
	m_gameState.OnBombExploded( event );
}