summaryrefslogtreecommitdiff
path: root/game/server/NextBot/NextBotIntentionInterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/NextBot/NextBotIntentionInterface.cpp')
-rw-r--r--game/server/NextBot/NextBotIntentionInterface.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/game/server/NextBot/NextBotIntentionInterface.cpp b/game/server/NextBot/NextBotIntentionInterface.cpp
new file mode 100644
index 0000000..b775896
--- /dev/null
+++ b/game/server/NextBot/NextBotIntentionInterface.cpp
@@ -0,0 +1,91 @@
+// NextBotIntentionInterface.cpp
+// Interface for intentional thinking
+// Author: Michael Booth, November 2007
+//========= Copyright Valve Corporation, All rights reserved. ============//
+
+#include "cbase.h"
+
+#include "NextBotInterface.h"
+#include "NextBotIntentionInterface.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+
+//------------------------------------------------------------------------------------------------------------------------
+/**
+ * Given a subject, return the world space position we should aim at
+ */
+Vector IIntention::SelectTargetPoint( const INextBot *me, const CBaseCombatCharacter *subject ) const
+{
+ for ( INextBotEventResponder *sub = FirstContainedResponder(); sub; sub = NextContainedResponder( sub ) )
+ {
+ const IContextualQuery *query = dynamic_cast< const IContextualQuery * >( sub );
+ if ( query )
+ {
+ // return the response of the first responder that gives a definitive answer
+ Vector result = query->SelectTargetPoint( me, subject );
+ if ( result != vec3_origin )
+ {
+ return result;
+ }
+ }
+ }
+
+ // no answer, use a reasonable position
+ Vector threatMins, threatMaxs;
+ subject->CollisionProp()->WorldSpaceAABB( &threatMins, &threatMaxs );
+ Vector targetPoint = subject->GetAbsOrigin();
+ targetPoint.z += 0.7f * ( threatMaxs.z - threatMins.z );
+
+ return targetPoint;
+}
+
+
+//------------------------------------------------------------------------------------------------------------------------
+/**
+ * Given two threats, decide which one is more dangerous
+ */
+const CKnownEntity *IIntention::SelectMoreDangerousThreat( const INextBot *me, const CBaseCombatCharacter *subject, const CKnownEntity *threat1, const CKnownEntity *threat2 ) const
+{
+ if ( !threat1 || threat1->IsObsolete() )
+ {
+ if ( threat2 && !threat2->IsObsolete() )
+ return threat2;
+
+ return NULL;
+ }
+ else if ( !threat2 || threat2->IsObsolete() )
+ {
+ return threat1;
+ }
+
+ for ( INextBotEventResponder *sub = FirstContainedResponder(); sub; sub = NextContainedResponder( sub ) )
+ {
+ const IContextualQuery *query = dynamic_cast< const IContextualQuery * >( sub );
+ if ( query )
+ {
+ // return the response of the first responder that gives a definitive answer
+ const CKnownEntity *result = query->SelectMoreDangerousThreat( me, subject, threat1, threat2 );
+ if ( result )
+ {
+ return result;
+ }
+ }
+ }
+
+ // no specific decision was made - return closest threat as most dangerous
+ float range1 = ( subject->GetAbsOrigin() - threat1->GetLastKnownPosition() ).LengthSqr();
+ float range2 = ( subject->GetAbsOrigin() - threat2->GetLastKnownPosition() ).LengthSqr();
+
+ if ( range1 < range2 )
+ {
+ return threat1;
+ }
+
+ return threat2;
+}
+
+
+
+