//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CRagdollProp::ModifyOrAppendCriteria( AI_CriteriaSet& set ) { BaseClass::ModifyOrAppendCriteria( set ); if ( m_strSourceClassName != NULL_STRING ) { set.RemoveCriteria( "classname" ); set.AppendCriteria( "classname", STRING(m_strSourceClassName) ); set.AppendCriteria( "ragdoll", "1" ); } }
void CNPC_HL1Barney::ModifyOrAppendCriteria( AI_CriteriaSet& criteriaSet ) { BaseClass::ModifyOrAppendCriteria( criteriaSet ); bool predisaster = FBitSet( m_spawnflags, SF_NPC_PREDISASTER ) ? true : false; criteriaSet.AppendCriteria( "disaster", predisaster ? "[disaster::pre]" : "[disaster::post]" ); }
void CAI_ExpresserHost_NPC_DoModifyOrAppendCriteria( CAI_BaseNPC *pSpeaker, AI_CriteriaSet& set ) { // Append current activity name const char *pActivityName = pSpeaker->GetActivityName( pSpeaker->GetActivity() ); if ( pActivityName ) { set.AppendCriteria( "activity", pActivityName ); } static const char *pStateNames[] = { "None", "Idle", "Alert", "Combat", "Scripted", "PlayDead", "Dead" }; if ( (int)pSpeaker->m_NPCState < ARRAYSIZE(pStateNames) ) { set.AppendCriteria( "npcstate", UTIL_VarArgs( "[NPCState::%s]", pStateNames[pSpeaker->m_NPCState] ) ); } if ( pSpeaker->GetEnemy() ) { set.AppendCriteria( "enemy", pSpeaker->GetEnemy()->GetClassname() ); set.AppendCriteria( "timesincecombat", "-1" ); } else { if ( pSpeaker->GetLastEnemyTime() == 0.0 ) set.AppendCriteria( "timesincecombat", "999999.0" ); else set.AppendCriteria( "timesincecombat", UTIL_VarArgs( "%f", gpGlobals->curtime - pSpeaker->GetLastEnemyTime() ) ); } set.AppendCriteria( "speed", UTIL_VarArgs( "%.3f", pSpeaker->GetSmoothedVelocity().Length() ) ); CBaseCombatWeapon *weapon = pSpeaker->GetActiveWeapon(); if ( weapon ) { set.AppendCriteria( "weapon", weapon->GetClassname() ); } else { set.AppendCriteria( "weapon", "none" ); } CBasePlayer *pPlayer = AI_GetSinglePlayer(); if ( pPlayer ) { Vector distance = pPlayer->GetAbsOrigin() - pSpeaker->GetAbsOrigin(); set.AppendCriteria( "distancetoplayer", UTIL_VarArgs( "%f", distance.Length() ) ); } else { set.AppendCriteria( "distancetoplayer", UTIL_VarArgs( "%i", MAX_COORD_RANGE ) ); } if ( pSpeaker->HasCondition( COND_SEE_PLAYER ) ) { set.AppendCriteria( "seeplayer", "1" ); } else { set.AppendCriteria( "seeplayer", "0" ); } if ( pPlayer && pPlayer->FInViewCone( pSpeaker ) && pPlayer->FVisible( pSpeaker ) ) { set.AppendCriteria( "seenbyplayer", "1" ); } else { set.AppendCriteria( "seenbyplayer", "0" ); } }
//----------------------------------------------------------------------------- // Purpose: Searches for a possible response // Input : concept - // NULL - // Output : AI_Response //----------------------------------------------------------------------------- AI_Response *CAI_Expresser::SpeakFindResponse( AIConcept_t concept, const char *modifiers /*= NULL*/ ) { IResponseSystem *rs = GetOuter()->GetResponseSystem(); if ( !rs ) { Assert( !"No response system installed for CAI_Expresser::GetOuter()!!!" ); return NULL; } AI_CriteriaSet set; // Always include the concept name set.AppendCriteria( "concept", concept, CONCEPT_WEIGHT ); // Always include any optional modifiers if ( modifiers != NULL ) { char copy_modifiers[ 255 ]; const char *pCopy; char key[ 128 ] = { 0 }; char value[ 128 ] = { 0 }; Q_strncpy( copy_modifiers, modifiers, sizeof( copy_modifiers ) ); pCopy = copy_modifiers; while( pCopy ) { pCopy = SplitContext( pCopy, key, sizeof( key ), value, sizeof( value ), NULL ); if( *key && *value ) { set.AppendCriteria( key, value, CONCEPT_WEIGHT ); } } } // Let our outer fill in most match criteria GetOuter()->ModifyOrAppendCriteria( set ); // Append local player criteria to set, but not if this is a player doing the talking if ( !GetOuter()->IsPlayer() ) { CBasePlayer *pPlayer = UTIL_PlayerByIndex( 1 ); if( pPlayer ) pPlayer->ModifyOrAppendPlayerCriteria( set ); } // Now that we have a criteria set, ask for a suitable response AI_Response *result = new AI_Response; Assert( result && "new AI_Response: Returned a NULL AI_Response!" ); bool found = rs->FindBestResponse( set, *result, this ); if ( rr_debugresponses.GetInt() == 3 ) { if ( ( GetOuter()->MyNPCPointer() && GetOuter()->m_debugOverlays & OVERLAY_NPC_SELECTED_BIT ) || GetOuter()->IsPlayer() ) { const char *pszName; if ( GetOuter()->IsPlayer() ) { pszName = ((CBasePlayer*)GetOuter())->GetPlayerName(); } else { pszName = GetOuter()->GetDebugName(); } if ( found ) { char response[ 256 ]; result->GetResponse( response, sizeof( response ) ); Warning( "RESPONSERULES: %s spoke '%s'. Found response '%s'.\n", pszName, concept, response ); } else { Warning( "RESPONSERULES: %s spoke '%s'. Found no matching response.\n", pszName, concept ); } } } if ( !found ) { //Assert( !"rs->FindBestResponse: Returned a NULL AI_Response!" ); delete result; return NULL; } char response[ 256 ]; result->GetResponse( response, sizeof( response ) ); if ( !response[0] ) { delete result; return NULL; } if ( result->GetOdds() < 100 && random->RandomInt( 1, 100 ) <= result->GetOdds() ) { delete result; return NULL; } return result; }