You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.4 KiB
139 lines
3.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
// Author: Michael S. Booth (mike@turtlerockstudios.com), 2003 |
|
|
|
#include "cbase.h" |
|
#include "cs_bot.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Move towards currently heard noise |
|
*/ |
|
void InvestigateNoiseState::AttendCurrentNoise( CCSBot *me ) |
|
{ |
|
if (!me->IsNoiseHeard() && me->GetNoisePosition()) |
|
return; |
|
|
|
// remember where the noise we heard was |
|
m_checkNoisePosition = *me->GetNoisePosition(); |
|
|
|
// tell our teammates (unless the noise is obvious, like gunfire) |
|
if (me->IsWellPastSafe() && me->HasNotSeenEnemyForLongTime() && me->GetNoisePriority() != PRIORITY_HIGH) |
|
me->GetChatter()->HeardNoise( *me->GetNoisePosition() ); |
|
|
|
// figure out how to get to the noise |
|
me->PrintIfWatched( "Attending to noise...\n" ); |
|
me->ComputePath( m_checkNoisePosition, FASTEST_ROUTE ); |
|
|
|
const float minAttendTime = 3.0f; |
|
const float maxAttendTime = 10.0f; |
|
m_minTimer.Start( RandomFloat( minAttendTime, maxAttendTime ) ); |
|
|
|
// consume the noise |
|
me->ForgetNoise(); |
|
} |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
void InvestigateNoiseState::OnEnter( CCSBot *me ) |
|
{ |
|
AttendCurrentNoise( me ); |
|
} |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* @todo Use TravelDistance instead of distance... |
|
*/ |
|
void InvestigateNoiseState::OnUpdate( CCSBot *me ) |
|
{ |
|
Vector myOrigin = GetCentroid( me ); |
|
|
|
// keep an ear out for closer noises... |
|
if (m_minTimer.IsElapsed()) |
|
{ |
|
const float nearbyRange = 500.0f; |
|
if (me->HeardInterestingNoise() && me->GetNoiseRange() < nearbyRange) |
|
{ |
|
// new sound is closer |
|
AttendCurrentNoise( me ); |
|
} |
|
} |
|
|
|
|
|
// if the pathfind fails, give up |
|
if (!me->HasPath()) |
|
{ |
|
me->Idle(); |
|
return; |
|
} |
|
|
|
// look around |
|
me->UpdateLookAround(); |
|
|
|
// get distance remaining on our path until we reach the source of the noise |
|
float range = me->GetPathDistanceRemaining(); |
|
|
|
if (me->IsUsingKnife()) |
|
{ |
|
if (me->IsHurrying()) |
|
me->Run(); |
|
else |
|
me->Walk(); |
|
} |
|
else |
|
{ |
|
const float closeToNoiseRange = 1500.0f; |
|
if (range < closeToNoiseRange) |
|
{ |
|
// if we dont have many friends left, or we are alone, and we are near noise source, sneak quietly |
|
if ((me->GetNearbyFriendCount() == 0 || me->GetFriendsRemaining() <= 2) && !me->IsHurrying()) |
|
{ |
|
me->Walk(); |
|
} |
|
else |
|
{ |
|
me->Run(); |
|
} |
|
} |
|
else |
|
{ |
|
me->Run(); |
|
} |
|
} |
|
|
|
|
|
// if we can see the noise position and we're close enough to it and looking at it, |
|
// we don't need to actually move there (it's checked enough) |
|
const float closeRange = 500.0f; |
|
if (range < closeRange) |
|
{ |
|
if (me->IsVisible( m_checkNoisePosition, CHECK_FOV )) |
|
{ |
|
// can see noise position |
|
me->PrintIfWatched( "Noise location is clear.\n" ); |
|
me->ForgetNoise(); |
|
me->Idle(); |
|
return; |
|
} |
|
} |
|
|
|
// move towards noise |
|
if (me->UpdatePathMovement() != CCSBot::PROGRESSING) |
|
{ |
|
me->Idle(); |
|
} |
|
} |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
void InvestigateNoiseState::OnExit( CCSBot *me ) |
|
{ |
|
// reset to run mode in case we were sneaking about |
|
me->Run(); |
|
}
|
|
|