aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/server/AI_Criteria.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mp/src/game/server/AI_Criteria.cpp')
-rw-r--r--mp/src/game/server/AI_Criteria.cpp117
1 files changed, 51 insertions, 66 deletions
diff --git a/mp/src/game/server/AI_Criteria.cpp b/mp/src/game/server/AI_Criteria.cpp
index ff84decd..128e9d32 100644
--- a/mp/src/game/server/AI_Criteria.cpp
+++ b/mp/src/game/server/AI_Criteria.cpp
@@ -27,13 +27,8 @@ AI_CriteriaSet::AI_CriteriaSet() : m_Lookup( 0, 0, CritEntry_t::LessFunc )
//-----------------------------------------------------------------------------
AI_CriteriaSet::AI_CriteriaSet( const AI_CriteriaSet& src ) : m_Lookup( 0, 0, CritEntry_t::LessFunc )
{
- m_Lookup.Purge();
- for ( short i = src.m_Lookup.FirstInorder();
- i != src.m_Lookup.InvalidIndex();
- i = src.m_Lookup.NextInorder( i ) )
- {
- m_Lookup.Insert( src.m_Lookup[ i ] );
- }
+ // Use fast Copy CUtlRBTree CopyFrom. WARNING: It only handles POD.
+ m_Lookup.CopyFrom( src.m_Lookup );
}
//-----------------------------------------------------------------------------
@@ -162,7 +157,6 @@ void AI_CriteriaSet::Describe()
{
for ( short i = m_Lookup.FirstInorder(); i != m_Lookup.InvalidIndex(); i = m_Lookup.NextInorder( i ) )
{
-
CritEntry_t *entry = &m_Lookup[ i ];
if ( entry->weight != 1.0f )
@@ -199,9 +193,9 @@ AI_Response::AI_Response()
{
m_Type = RESPONSE_NONE;
m_szResponseName[0] = 0;
+ m_szMatchingRule[0] = 0;
+
m_pCriteria = NULL;
- m_szMatchingRule[0]=0;
- m_szContext = NULL;
m_bApplyContextToWorld = false;
}
@@ -209,13 +203,8 @@ AI_Response::AI_Response()
//-----------------------------------------------------------------------------
AI_Response::AI_Response( const AI_Response &from )
{
- Assert( (void*)(&m_Type) == (void*)this );
m_pCriteria = NULL;
- memcpy( this, &from, sizeof(*this) );
- m_pCriteria = NULL;
- m_szContext = NULL;
- SetContext( from.m_szContext );
- m_bApplyContextToWorld = from.m_bApplyContextToWorld;
+ *this = from;
}
//-----------------------------------------------------------------------------
@@ -224,20 +213,34 @@ AI_Response::AI_Response( const AI_Response &from )
AI_Response::~AI_Response()
{
delete m_pCriteria;
- delete[] m_szContext;
+ m_pCriteria = NULL;
}
//-----------------------------------------------------------------------------
AI_Response &AI_Response::operator=( const AI_Response &from )
{
Assert( (void*)(&m_Type) == (void*)this );
+
+ if (this == &from)
+ return *this;
+
+ m_Type = from.m_Type;
+
+ V_strcpy_safe( m_szResponseName, from.m_szResponseName );
+ V_strcpy_safe( m_szMatchingRule, from.m_szMatchingRule );
+
delete m_pCriteria;
m_pCriteria = NULL;
- memcpy( this, &from, sizeof(*this) );
- m_pCriteria = NULL;
- m_szContext = NULL;
- SetContext( from.m_szContext );
+
+ // Copy criteria.
+ if (from.m_pCriteria)
+ m_pCriteria = new AI_CriteriaSet(*from.m_pCriteria);
+
+ m_Params = from.m_Params;
+
+ m_szContext = from.m_szContext;
m_bApplyContextToWorld = from.m_bApplyContextToWorld;
+
return *this;
}
@@ -246,15 +249,22 @@ AI_Response &AI_Response::operator=( const AI_Response &from )
// Input : *response -
// *criteria -
//-----------------------------------------------------------------------------
-void AI_Response::Init( ResponseType_t type, const char *responseName, const AI_CriteriaSet& criteria, const AI_ResponseParams& responseparams, const char *ruleName, const char *applyContext, bool bApplyContextToWorld )
+void AI_Response::Init( ResponseType_t type, const char *responseName, const AI_CriteriaSet& criteria,
+ const AI_ResponseParams& responseparams, const char *ruleName, const char *applyContext,
+ bool bApplyContextToWorld )
{
m_Type = type;
- Q_strncpy( m_szResponseName, responseName, sizeof( m_szResponseName ) );
+
+ V_strcpy_safe( m_szResponseName, responseName );
+ V_strcpy_safe( m_szMatchingRule, ruleName ? ruleName : "NULL" );
+
// Copy underlying criteria
+ Assert( !m_pCriteria );
m_pCriteria = new AI_CriteriaSet( criteria );
- Q_strncpy( m_szMatchingRule, ruleName ? ruleName : "NULL", sizeof( m_szMatchingRule ) );
+
m_Params = responseparams;
- SetContext( applyContext );
+
+ m_szContext = applyContext;
m_bApplyContextToWorld = bApplyContextToWorld;
}
@@ -269,35 +279,29 @@ void AI_Response::Describe()
m_pCriteria->Describe();
}
if ( m_szMatchingRule[ 0 ] )
- {
DevMsg( "Matched rule '%s', ", m_szMatchingRule );
- }
- if ( m_szContext )
- {
- DevMsg( "Contexts to set '%s' on %s, ", m_szContext, m_bApplyContextToWorld ? "world" : "speaker" );
- }
+ if ( m_szContext.Length() )
+ DevMsg( "Contexts to set '%s' on %s, ", m_szContext.Get(), m_bApplyContextToWorld ? "world" : "speaker" );
- DevMsg( "response %s = '%s'\n", DescribeResponse( (ResponseType_t)m_Type ), m_szResponseName );
+ DevMsg( "response %s = '%s'\n", DescribeResponse( (ResponseType_t)m_Type ), m_szResponseName );
}
//-----------------------------------------------------------------------------
// Purpose:
-// Output : char const
//-----------------------------------------------------------------------------
-void AI_Response::GetName( char *buf, size_t buflen ) const
+const char * AI_Response::GetNamePtr() const
{
- Q_strncpy( buf, m_szResponseName, buflen );
+ return m_szResponseName;
}
-
//-----------------------------------------------------------------------------
// Purpose:
-// Output : char const
//-----------------------------------------------------------------------------
-void AI_Response::GetResponse( char *buf, size_t buflen ) const
+const char * AI_Response::GetResponsePtr() const
{
- GetName( buf, buflen );
+ return m_szResponseName;
}
+
//-----------------------------------------------------------------------------
// Purpose:
// Input : type -
@@ -313,25 +317,15 @@ const char *AI_Response::DescribeResponse( ResponseType_t type )
switch( type )
{
- default:
- {
- Assert( 0 );
- }
- // Fall through
- case RESPONSE_NONE:
- return "RESPONSE_NONE";
- case RESPONSE_SPEAK:
- return "RESPONSE_SPEAK";
- case RESPONSE_SENTENCE:
- return "RESPONSE_SENTENCE";
- case RESPONSE_SCENE:
- return "RESPONSE_SCENE";
- case RESPONSE_RESPONSE:
- return "RESPONSE_RESPONSE";
- case RESPONSE_PRINT:
- return "RESPONSE_PRINT";
+ case RESPONSE_NONE: return "RESPONSE_NONE";
+ case RESPONSE_SPEAK: return "RESPONSE_SPEAK";
+ case RESPONSE_SENTENCE: return "RESPONSE_SENTENCE";
+ case RESPONSE_SCENE: return "RESPONSE_SCENE";
+ case RESPONSE_RESPONSE: return "RESPONSE_RESPONSE";
+ case RESPONSE_PRINT: return "RESPONSE_PRINT";
}
+ Assert( 0 );
return "RESPONSE_NONE";
}
@@ -447,16 +441,7 @@ float AI_Response::GetPreDelay() const
//-----------------------------------------------------------------------------
void AI_Response::SetContext( const char *context )
{
- delete[] m_szContext;
- m_szContext = NULL;
-
- if ( context )
- {
- int len = Q_strlen( context );
- m_szContext = new char[ len + 1 ];
- Q_memcpy( m_szContext, context, len );
- m_szContext[ len ] = 0;
- }
+ m_szContext = context;
}
//-----------------------------------------------------------------------------