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.
2381 lines
61 KiB
2381 lines
61 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Default schedules. |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "ai_default.h" |
|
#include "soundent.h" |
|
#include "scripted.h" |
|
#include "ai_schedule.h" |
|
#include "ai_squad.h" |
|
#include "ai_senses.h" |
|
#include "ai_networkmanager.h" |
|
#include "stringregistry.h" |
|
#include "igamesystem.h" |
|
#include "ai_network.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
CAI_Schedule *CAI_BaseNPC::ScheduleInList( const char *pName, CAI_Schedule **pList, int listCount ) |
|
{ |
|
int i; |
|
|
|
if ( !pName ) |
|
{ |
|
DevMsg( "%s set to unnamed schedule!\n", GetClassname() ); |
|
return NULL; |
|
} |
|
|
|
|
|
for ( i = 0; i < listCount; i++ ) |
|
{ |
|
if ( !pList[i]->GetName() ) |
|
{ |
|
DevMsg( "Unnamed schedule!\n" ); |
|
continue; |
|
} |
|
if ( stricmp( pName, pList[i]->GetName() ) == 0 ) |
|
return pList[i]; |
|
} |
|
return NULL; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Given and schedule name, return the schedule ID |
|
//----------------------------------------------------------------------------- |
|
int CAI_BaseNPC::GetScheduleID(const char* schedName) |
|
{ |
|
return GetSchedulingSymbols()->ScheduleSymbolToId(schedName); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : |
|
// Output : |
|
//----------------------------------------------------------------------------- |
|
void CAI_BaseNPC::InitDefaultScheduleSR(void) |
|
{ |
|
#define ADD_DEF_SCHEDULE( name, localId ) idSpace.AddSchedule(name, localId, "CAI_BaseNPC" ) |
|
|
|
CAI_ClassScheduleIdSpace &idSpace = CAI_BaseNPC::AccessClassScheduleIdSpaceDirect(); |
|
|
|
ADD_DEF_SCHEDULE( "SCHED_NONE", SCHED_NONE); |
|
ADD_DEF_SCHEDULE( "SCHED_IDLE_STAND", SCHED_IDLE_STAND); |
|
ADD_DEF_SCHEDULE( "SCHED_IDLE_WALK", SCHED_IDLE_WALK); |
|
ADD_DEF_SCHEDULE( "SCHED_IDLE_WANDER", SCHED_IDLE_WANDER); |
|
ADD_DEF_SCHEDULE( "SCHED_WAKE_ANGRY", SCHED_WAKE_ANGRY); |
|
ADD_DEF_SCHEDULE( "SCHED_ALERT_FACE", SCHED_ALERT_FACE); |
|
ADD_DEF_SCHEDULE( "SCHED_ALERT_FACE_BESTSOUND", SCHED_ALERT_FACE_BESTSOUND); |
|
ADD_DEF_SCHEDULE( "SCHED_ALERT_REACT_TO_COMBAT_SOUND", SCHED_ALERT_REACT_TO_COMBAT_SOUND); |
|
ADD_DEF_SCHEDULE( "SCHED_ALERT_SCAN", SCHED_ALERT_SCAN); |
|
ADD_DEF_SCHEDULE( "SCHED_ALERT_STAND", SCHED_ALERT_STAND); |
|
ADD_DEF_SCHEDULE( "SCHED_ALERT_WALK", SCHED_ALERT_WALK); |
|
ADD_DEF_SCHEDULE( "SCHED_INVESTIGATE_SOUND", SCHED_INVESTIGATE_SOUND); |
|
ADD_DEF_SCHEDULE( "SCHED_COMBAT_FACE", SCHED_COMBAT_FACE); |
|
ADD_DEF_SCHEDULE( "SCHED_COMBAT_SWEEP", SCHED_COMBAT_SWEEP); |
|
ADD_DEF_SCHEDULE( "SCHED_FEAR_FACE", SCHED_FEAR_FACE); |
|
ADD_DEF_SCHEDULE( "SCHED_COMBAT_STAND", SCHED_COMBAT_STAND); |
|
ADD_DEF_SCHEDULE( "SCHED_COMBAT_WALK", SCHED_COMBAT_WALK); |
|
ADD_DEF_SCHEDULE( "SCHED_CHASE_ENEMY", SCHED_CHASE_ENEMY); |
|
ADD_DEF_SCHEDULE( "SCHED_CHASE_ENEMY_FAILED", SCHED_CHASE_ENEMY_FAILED); |
|
ADD_DEF_SCHEDULE( "SCHED_VICTORY_DANCE", SCHED_VICTORY_DANCE); |
|
ADD_DEF_SCHEDULE( "SCHED_TARGET_FACE", SCHED_TARGET_FACE); |
|
ADD_DEF_SCHEDULE( "SCHED_TARGET_CHASE", SCHED_TARGET_CHASE); |
|
ADD_DEF_SCHEDULE( "SCHED_SMALL_FLINCH", SCHED_SMALL_FLINCH); |
|
ADD_DEF_SCHEDULE( "SCHED_BIG_FLINCH", SCHED_BIG_FLINCH); |
|
ADD_DEF_SCHEDULE( "SCHED_BACK_AWAY_FROM_ENEMY", SCHED_BACK_AWAY_FROM_ENEMY); |
|
ADD_DEF_SCHEDULE( "SCHED_MOVE_AWAY_FROM_ENEMY", SCHED_MOVE_AWAY_FROM_ENEMY); |
|
ADD_DEF_SCHEDULE( "SCHED_BACK_AWAY_FROM_SAVE_POSITION", SCHED_BACK_AWAY_FROM_SAVE_POSITION); |
|
ADD_DEF_SCHEDULE( "SCHED_TAKE_COVER_FROM_ENEMY", SCHED_TAKE_COVER_FROM_ENEMY); |
|
ADD_DEF_SCHEDULE( "SCHED_TAKE_COVER_FROM_BEST_SOUND", SCHED_TAKE_COVER_FROM_BEST_SOUND); |
|
ADD_DEF_SCHEDULE( "SCHED_FLEE_FROM_BEST_SOUND", SCHED_FLEE_FROM_BEST_SOUND); |
|
ADD_DEF_SCHEDULE( "SCHED_TAKE_COVER_FROM_ORIGIN", SCHED_TAKE_COVER_FROM_ORIGIN); |
|
ADD_DEF_SCHEDULE( "SCHED_FAIL_TAKE_COVER", SCHED_FAIL_TAKE_COVER); |
|
ADD_DEF_SCHEDULE( "SCHED_RUN_FROM_ENEMY", SCHED_RUN_FROM_ENEMY); |
|
ADD_DEF_SCHEDULE( "SCHED_RUN_FROM_ENEMY_FALLBACK", SCHED_RUN_FROM_ENEMY_FALLBACK); |
|
ADD_DEF_SCHEDULE( "SCHED_MOVE_TO_WEAPON_RANGE", SCHED_MOVE_TO_WEAPON_RANGE); |
|
ADD_DEF_SCHEDULE( "SCHED_ESTABLISH_LINE_OF_FIRE", SCHED_ESTABLISH_LINE_OF_FIRE); |
|
ADD_DEF_SCHEDULE( "SCHED_SHOOT_ENEMY_COVER", SCHED_SHOOT_ENEMY_COVER); |
|
ADD_DEF_SCHEDULE( "SCHED_ESTABLISH_LINE_OF_FIRE_FALLBACK", SCHED_ESTABLISH_LINE_OF_FIRE_FALLBACK); |
|
ADD_DEF_SCHEDULE( "SCHED_PRE_FAIL_ESTABLISH_LINE_OF_FIRE", SCHED_PRE_FAIL_ESTABLISH_LINE_OF_FIRE); |
|
ADD_DEF_SCHEDULE( "SCHED_FAIL_ESTABLISH_LINE_OF_FIRE", SCHED_FAIL_ESTABLISH_LINE_OF_FIRE); |
|
ADD_DEF_SCHEDULE( "SCHED_COWER", SCHED_COWER); |
|
ADD_DEF_SCHEDULE( "SCHED_MELEE_ATTACK1", SCHED_MELEE_ATTACK1); |
|
ADD_DEF_SCHEDULE( "SCHED_MELEE_ATTACK2", SCHED_MELEE_ATTACK2); |
|
ADD_DEF_SCHEDULE( "SCHED_RANGE_ATTACK1", SCHED_RANGE_ATTACK1); |
|
ADD_DEF_SCHEDULE( "SCHED_RANGE_ATTACK2", SCHED_RANGE_ATTACK2); |
|
ADD_DEF_SCHEDULE( "SCHED_SPECIAL_ATTACK1", SCHED_SPECIAL_ATTACK1); |
|
ADD_DEF_SCHEDULE( "SCHED_SPECIAL_ATTACK2", SCHED_SPECIAL_ATTACK2); |
|
ADD_DEF_SCHEDULE( "SCHED_STANDOFF", SCHED_STANDOFF); |
|
ADD_DEF_SCHEDULE( "SCHED_ARM_WEAPON", SCHED_ARM_WEAPON); |
|
ADD_DEF_SCHEDULE( "SCHED_DISARM_WEAPON", SCHED_DISARM_WEAPON); |
|
ADD_DEF_SCHEDULE( "SCHED_HIDE_AND_RELOAD", SCHED_HIDE_AND_RELOAD); |
|
ADD_DEF_SCHEDULE( "SCHED_RELOAD", SCHED_RELOAD); |
|
ADD_DEF_SCHEDULE( "SCHED_AMBUSH", SCHED_AMBUSH); |
|
ADD_DEF_SCHEDULE( "SCHED_DIE", SCHED_DIE); |
|
ADD_DEF_SCHEDULE( "SCHED_DIE_RAGDOLL", SCHED_DIE_RAGDOLL); |
|
ADD_DEF_SCHEDULE( "SCHED_WAIT_FOR_SCRIPT", SCHED_WAIT_FOR_SCRIPT); |
|
ADD_DEF_SCHEDULE( "SCHED_AISCRIPT", SCHED_AISCRIPT); |
|
ADD_DEF_SCHEDULE( "SCHED_SCRIPTED_WALK", SCHED_SCRIPTED_WALK); |
|
ADD_DEF_SCHEDULE( "SCHED_SCRIPTED_RUN", SCHED_SCRIPTED_RUN); |
|
ADD_DEF_SCHEDULE( "SCHED_SCRIPTED_CUSTOM_MOVE", SCHED_SCRIPTED_CUSTOM_MOVE); |
|
ADD_DEF_SCHEDULE( "SCHED_SCRIPTED_WAIT", SCHED_SCRIPTED_WAIT); |
|
ADD_DEF_SCHEDULE( "SCHED_SCRIPTED_FACE", SCHED_SCRIPTED_FACE); |
|
ADD_DEF_SCHEDULE( "SCHED_SCENE_GENERIC", SCHED_SCENE_GENERIC); |
|
ADD_DEF_SCHEDULE( "SCHED_NEW_WEAPON", SCHED_NEW_WEAPON); |
|
ADD_DEF_SCHEDULE( "SCHED_NEW_WEAPON_CHEAT", SCHED_NEW_WEAPON_CHEAT); |
|
ADD_DEF_SCHEDULE( "SCHED_SWITCH_TO_PENDING_WEAPON", SCHED_SWITCH_TO_PENDING_WEAPON ); |
|
ADD_DEF_SCHEDULE( "SCHED_GET_HEALTHKIT", SCHED_GET_HEALTHKIT); |
|
ADD_DEF_SCHEDULE( "SCHED_MOVE_AWAY", SCHED_MOVE_AWAY); |
|
ADD_DEF_SCHEDULE( "SCHED_MOVE_AWAY_FAIL", SCHED_MOVE_AWAY_FAIL); |
|
ADD_DEF_SCHEDULE( "SCHED_MOVE_AWAY_END", SCHED_MOVE_AWAY_END); |
|
ADD_DEF_SCHEDULE( "SCHED_WAIT_FOR_SPEAK_FINISH", SCHED_WAIT_FOR_SPEAK_FINISH); |
|
ADD_DEF_SCHEDULE( "SCHED_FORCED_GO", SCHED_FORCED_GO); |
|
ADD_DEF_SCHEDULE( "SCHED_FORCED_GO_RUN", SCHED_FORCED_GO_RUN); |
|
ADD_DEF_SCHEDULE( "SCHED_PATROL_WALK", SCHED_PATROL_WALK); |
|
ADD_DEF_SCHEDULE( "SCHED_COMBAT_PATROL", SCHED_COMBAT_PATROL); |
|
ADD_DEF_SCHEDULE( "SCHED_PATROL_RUN", SCHED_PATROL_RUN); |
|
ADD_DEF_SCHEDULE( "SCHED_RUN_RANDOM", SCHED_RUN_RANDOM); |
|
ADD_DEF_SCHEDULE( "SCHED_FAIL", SCHED_FAIL); |
|
ADD_DEF_SCHEDULE( "SCHED_FAIL_NOSTOP", SCHED_FAIL_NOSTOP); |
|
ADD_DEF_SCHEDULE( "SCHED_FALL_TO_GROUND", SCHED_FALL_TO_GROUND); |
|
ADD_DEF_SCHEDULE( "SCHED_DROPSHIP_DUSTOFF", SCHED_DROPSHIP_DUSTOFF); |
|
ADD_DEF_SCHEDULE( "SCHED_NPC_FREEZE", SCHED_NPC_FREEZE); |
|
|
|
ADD_DEF_SCHEDULE( "SCHED_FLINCH_PHYSICS", SCHED_FLINCH_PHYSICS); |
|
|
|
ADD_DEF_SCHEDULE( "SCHED_RUN_FROM_ENEMY_MOB", SCHED_RUN_FROM_ENEMY_MOB ); |
|
|
|
ADD_DEF_SCHEDULE( "SCHED_DUCK_DODGE", SCHED_DUCK_DODGE ); |
|
|
|
ADD_DEF_SCHEDULE( "SCHED_INTERACTION_MOVE_TO_PARTNER", SCHED_INTERACTION_MOVE_TO_PARTNER ); |
|
ADD_DEF_SCHEDULE( "SCHED_INTERACTION_WAIT_FOR_PARTNER", SCHED_INTERACTION_WAIT_FOR_PARTNER ); |
|
|
|
ADD_DEF_SCHEDULE( "SCHED_SLEEP", SCHED_SLEEP ); |
|
} |
|
|
|
bool CAI_BaseNPC::LoadDefaultSchedules(void) |
|
{ |
|
// AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_NONE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_IDLE_STAND); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_IDLE_WALK); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_IDLE_WANDER); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_WAKE_ANGRY); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ALERT_FACE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ALERT_FACE_BESTSOUND); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ALERT_REACT_TO_COMBAT_SOUND); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ALERT_SCAN); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ALERT_STAND); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ALERT_WALK); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_INVESTIGATE_SOUND); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_COMBAT_FACE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_COMBAT_SWEEP); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_COMBAT_WALK); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FEAR_FACE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_COMBAT_STAND); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_CHASE_ENEMY); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_CHASE_ENEMY_FAILED); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_VICTORY_DANCE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_TARGET_FACE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_TARGET_CHASE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SMALL_FLINCH); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_BIG_FLINCH); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_BACK_AWAY_FROM_ENEMY); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MOVE_AWAY_FROM_ENEMY); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_BACK_AWAY_FROM_SAVE_POSITION); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_TAKE_COVER_FROM_ENEMY); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_TAKE_COVER_FROM_BEST_SOUND); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FLEE_FROM_BEST_SOUND); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_TAKE_COVER_FROM_ORIGIN); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FAIL_TAKE_COVER); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RUN_FROM_ENEMY); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RUN_FROM_ENEMY_FALLBACK); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MOVE_TO_WEAPON_RANGE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ESTABLISH_LINE_OF_FIRE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SHOOT_ENEMY_COVER); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ESTABLISH_LINE_OF_FIRE_FALLBACK); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_PRE_FAIL_ESTABLISH_LINE_OF_FIRE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FAIL_ESTABLISH_LINE_OF_FIRE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_COWER); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MELEE_ATTACK1); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MELEE_ATTACK2); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RANGE_ATTACK1); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RANGE_ATTACK2); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SPECIAL_ATTACK1); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SPECIAL_ATTACK2); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_STANDOFF); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ARM_WEAPON); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_DISARM_WEAPON); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_HIDE_AND_RELOAD); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RELOAD); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_AMBUSH); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_DIE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_DIE_RAGDOLL); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_WAIT_FOR_SCRIPT); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SCRIPTED_WALK); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SCRIPTED_RUN); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SCRIPTED_CUSTOM_MOVE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SCRIPTED_WAIT); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SCRIPTED_FACE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SCENE_GENERIC); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_NEW_WEAPON); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_NEW_WEAPON_CHEAT); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SWITCH_TO_PENDING_WEAPON); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_GET_HEALTHKIT); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MOVE_AWAY); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MOVE_AWAY_FAIL); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MOVE_AWAY_END); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_WAIT_FOR_SPEAK_FINISH); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FORCED_GO); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FORCED_GO_RUN); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_PATROL_WALK); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_COMBAT_PATROL); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_PATROL_RUN); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RUN_RANDOM); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FAIL); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FAIL_NOSTOP); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FALL_TO_GROUND); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_DROPSHIP_DUSTOFF); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FLINCH_PHYSICS); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RUN_FROM_ENEMY_MOB ); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_DUCK_DODGE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_NPC_FREEZE); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_INTERACTION_MOVE_TO_PARTNER); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_INTERACTION_WAIT_FOR_PARTNER); |
|
AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SLEEP ); |
|
|
|
return true; |
|
} |
|
|
|
int CAI_BaseNPC::TranslateSchedule( int scheduleType ) |
|
{ |
|
// FIXME: Where should this go now? |
|
#if 0 |
|
if (scheduleType >= LAST_SHARED_SCHEDULE) |
|
{ |
|
char errMsg[256]; |
|
Q_snprintf(errMsg,sizeof(errMsg),"ERROR: Subclass Schedule (%s) Hitting Base Class!\n",ScheduleName(scheduleType)); |
|
DevMsg( errMsg ); |
|
AddTimedOverlay( errMsg, 5); |
|
return SCHED_FAIL; |
|
} |
|
#endif |
|
|
|
switch( scheduleType ) |
|
{ |
|
// Hande some special cases |
|
case SCHED_AISCRIPT: |
|
{ |
|
Assert( m_hCine != NULL ); |
|
if ( !m_hCine ) |
|
{ |
|
DevWarning( 2, "Script failed for %s\n", GetClassname() ); |
|
CineCleanup(); |
|
return SCHED_IDLE_STAND; |
|
} |
|
// else |
|
// DevMsg( 2, "Starting script %s for %s\n", STRING( m_hCine->m_iszPlay ), GetClassname() ); |
|
|
|
switch ( m_hCine->m_fMoveTo ) |
|
{ |
|
case CINE_MOVETO_WAIT: |
|
case CINE_MOVETO_TELEPORT: |
|
{ |
|
return SCHED_SCRIPTED_WAIT; |
|
} |
|
|
|
case CINE_MOVETO_WALK: |
|
{ |
|
return SCHED_SCRIPTED_WALK; |
|
} |
|
|
|
case CINE_MOVETO_RUN: |
|
{ |
|
return SCHED_SCRIPTED_RUN; |
|
} |
|
|
|
case CINE_MOVETO_CUSTOM: |
|
{ |
|
return SCHED_SCRIPTED_CUSTOM_MOVE; |
|
} |
|
|
|
case CINE_MOVETO_WAIT_FACING: |
|
{ |
|
return SCHED_SCRIPTED_FACE; |
|
} |
|
} |
|
} |
|
break; |
|
|
|
case SCHED_IDLE_STAND: |
|
{ |
|
// FIXME: crows are set into IDLE_STAND as an failure schedule, not sure if ALERT_STAND or COMBAT_STAND is a better choice |
|
// Assert( m_NPCState == NPC_STATE_IDLE ); |
|
} |
|
break; |
|
case SCHED_IDLE_WANDER: |
|
{ |
|
// FIXME: citizen interaction only, no idea what the state is. |
|
// Assert( m_NPCState == NPC_STATE_IDLE ); |
|
} |
|
break; |
|
|
|
case SCHED_IDLE_WALK: |
|
{ |
|
switch( m_NPCState ) |
|
{ |
|
case NPC_STATE_ALERT: |
|
return SCHED_ALERT_WALK; |
|
case NPC_STATE_COMBAT: |
|
return SCHED_COMBAT_WALK; |
|
} |
|
} |
|
break; |
|
|
|
case SCHED_ALERT_FACE: |
|
{ |
|
// FIXME: default AI can pick this when in idle state |
|
// Assert( m_NPCState == NPC_STATE_ALERT ); |
|
} |
|
break; |
|
case SCHED_ALERT_SCAN: |
|
case SCHED_ALERT_STAND: |
|
{ |
|
// FIXME: rollermines use this when they're being held |
|
// Assert( m_NPCState == NPC_STATE_ALERT ); |
|
} |
|
break; |
|
case SCHED_ALERT_WALK: |
|
{ |
|
Assert( m_NPCState == NPC_STATE_ALERT ); |
|
} |
|
break; |
|
case SCHED_COMBAT_FACE: |
|
{ |
|
// FIXME: failure schedule for SCHED_PATROL which can be called when in alert |
|
// Assert( m_NPCState == NPC_STATE_COMBAT ); |
|
} |
|
break; |
|
case SCHED_COMBAT_STAND: |
|
{ |
|
// FIXME: never used? |
|
} |
|
break; |
|
case SCHED_COMBAT_WALK: |
|
{ |
|
Assert( m_NPCState == NPC_STATE_COMBAT ); |
|
} |
|
break; |
|
} |
|
|
|
return scheduleType; |
|
} |
|
|
|
//========================================================= |
|
// GetScheduleOfType - returns a pointer to one of the |
|
// NPC's available schedules of the indicated type. |
|
//========================================================= |
|
CAI_Schedule *CAI_BaseNPC::GetScheduleOfType( int scheduleType ) |
|
{ |
|
// allow the derived classes to pick an appropriate version of this schedule or override |
|
// base schedule types. |
|
AI_PROFILE_SCOPE_BEGIN(CAI_BaseNPC_TranslateSchedule); |
|
scheduleType = TranslateSchedule( scheduleType ); |
|
AI_PROFILE_SCOPE_END(); |
|
|
|
// Get a pointer to that schedule |
|
CAI_Schedule *schedule = GetSchedule(scheduleType); |
|
|
|
if (!schedule) |
|
{ |
|
DevMsg( "GetScheduleOfType(): No CASE for Schedule Type %d!\n", scheduleType ); |
|
return GetSchedule(SCHED_IDLE_STAND); |
|
} |
|
return schedule; |
|
} |
|
|
|
CAI_Schedule *CAI_BaseNPC::GetSchedule(int schedule) |
|
{ |
|
if (!GetClassScheduleIdSpace()->IsGlobalBaseSet()) |
|
{ |
|
Warning("ERROR: %s missing schedule!\n", GetSchedulingErrorName()); |
|
return g_AI_SchedulesManager.GetScheduleFromID(SCHED_IDLE_STAND); |
|
} |
|
if ( AI_IdIsLocal( schedule ) ) |
|
{ |
|
schedule = GetClassScheduleIdSpace()->ScheduleLocalToGlobal(schedule); |
|
} |
|
|
|
return g_AI_SchedulesManager.GetScheduleFromID( schedule ); |
|
} |
|
|
|
bool CAI_BaseNPC::IsCurSchedule( int schedId, bool fIdeal ) |
|
{ |
|
if ( !m_pSchedule ) |
|
return ( schedId == SCHED_NONE || schedId == AI_RemapToGlobal(SCHED_NONE) ); |
|
|
|
schedId = ( AI_IdIsLocal( schedId ) ) ? |
|
GetClassScheduleIdSpace()->ScheduleLocalToGlobal(schedId) : |
|
schedId; |
|
if ( fIdeal ) |
|
return ( schedId == m_IdealSchedule ); |
|
|
|
return ( m_pSchedule->GetId() == schedId ); |
|
} |
|
|
|
|
|
const char* CAI_BaseNPC::ConditionName(int conditionID) |
|
{ |
|
if ( AI_IdIsLocal( conditionID ) ) |
|
conditionID = GetClassScheduleIdSpace()->ConditionLocalToGlobal(conditionID); |
|
return GetSchedulingSymbols()->ConditionIdToSymbol(conditionID); |
|
} |
|
|
|
const char *CAI_BaseNPC::TaskName(int taskID) |
|
{ |
|
if ( AI_IdIsLocal( taskID ) ) |
|
taskID = GetClassScheduleIdSpace()->TaskLocalToGlobal(taskID); |
|
return GetSchedulingSymbols()->TaskIdToSymbol( taskID ); |
|
} |
|
|
|
|
|
|
|
// This hooks the main game systems callbacks to allow the AI system to manage memory |
|
class CAI_SystemHook : public CAutoGameSystem |
|
{ |
|
public: |
|
CAI_SystemHook( char const *name ) : CAutoGameSystem( name ) |
|
{ |
|
} |
|
|
|
// UNDONE: Schedule / strings stuff should probably happen once each GAME, not each level |
|
void LevelInitPreEntity() |
|
{ |
|
extern float g_AINextDisabledMessageTime; |
|
g_AINextDisabledMessageTime = 0; |
|
|
|
g_AI_SchedulesManager.CreateStringRegistries(); |
|
|
|
CAI_BaseNPC::gm_iNextThinkRebalanceTick = 0; |
|
} |
|
|
|
virtual void LevelInitPostEntity() |
|
{ |
|
g_AI_SensedObjectsManager.Init(); |
|
} |
|
|
|
void LevelShutdownPreEntity() |
|
{ |
|
CBaseCombatCharacter::ResetVisibilityCache(); |
|
} |
|
|
|
void LevelShutdownPostEntity( void ) |
|
{ |
|
g_AI_SensedObjectsManager.Term(); |
|
g_pAINetworkManager->DeleteAllAINetworks(); |
|
g_AI_SchedulesManager.DeleteAllSchedules(); |
|
g_AI_SquadManager.DeleteAllSquads(); |
|
g_AI_SchedulesManager.DestroyStringRegistries(); |
|
} |
|
}; |
|
|
|
|
|
static CAI_SystemHook g_AISystemHook( "CAI_SystemHook" ); |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
// Schedules |
|
// |
|
//----------------------------------------------------------------------------- |
|
|
|
//========================================================= |
|
// > Fail |
|
// This schedule itself can fail because the NPC may |
|
// be unable to finish the stop moving. If so, fall back |
|
// the a fail schedule that has no stop moving in it. |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_FAIL, |
|
|
|
" Tasks" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_FAIL_NOSTOP" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
" TASK_WAIT 1" |
|
" TASK_WAIT_PVS 0" |
|
"" |
|
" Interrupts" |
|
" COND_CAN_RANGE_ATTACK1 " |
|
" COND_CAN_RANGE_ATTACK2 " |
|
" COND_CAN_MELEE_ATTACK1 " |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_GIVE_WAY" |
|
); |
|
|
|
//========================================================= |
|
// > Fail without stop moving, which can fail. |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_FAIL_NOSTOP, |
|
|
|
" Tasks" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
" TASK_WAIT 1" |
|
" TASK_WAIT_PVS 0" |
|
"" |
|
" Interrupts" |
|
" COND_CAN_RANGE_ATTACK1 " |
|
" COND_CAN_RANGE_ATTACK2 " |
|
" COND_CAN_MELEE_ATTACK1 " |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_GIVE_WAY" |
|
); |
|
|
|
//=============================================== |
|
// > Idle_Stand |
|
//=============================================== |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_IDLE_STAND, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 1" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
" TASK_WAIT 5" |
|
" TASK_WAIT_PVS 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_FEAR" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_SMELL" |
|
" COND_PROVOKED" |
|
" COND_GIVE_WAY" |
|
" COND_HEAR_PLAYER" |
|
" COND_HEAR_DANGER" |
|
" COND_HEAR_COMBAT" |
|
" COND_HEAR_BULLET_IMPACT" |
|
" COND_IDLE_INTERRUPT" |
|
); |
|
|
|
//=============================================== |
|
// > Wait_For_Script |
|
//=============================================== |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_WAIT_FOR_SCRIPT, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_WAIT_INDEFINITE 0" |
|
"" |
|
" Interrupts" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
); |
|
|
|
//=============================================== |
|
// > IdleWalk |
|
//=============================================== |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_IDLE_WALK, |
|
|
|
" Tasks" |
|
" TASK_WALK_PATH 9999" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_WAIT_PVS 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_ENEMY" // in deference to scripted schedule where the enemy was slammed, thus no COND_NEW_ENEMY |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_SMELL" |
|
" COND_PROVOKED" |
|
" COND_HEAR_COMBAT" |
|
" COND_HEAR_BULLET_IMPACT" |
|
); |
|
|
|
//=============================================== |
|
// > NewWeapon |
|
//=============================================== |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_NEW_WEAPON, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_TOLERANCE_DISTANCE 5" |
|
" TASK_GET_PATH_TO_TARGET_WEAPON 0" |
|
// " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_NEW_WEAPON_CHEAT" |
|
" TASK_WEAPON_RUN_PATH 0" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_TARGET 0" |
|
" TASK_WEAPON_PICKUP 0" |
|
" TASK_WAIT 1"// Don't move before done standing up |
|
"" |
|
" Interrupts" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//=============================================== |
|
// Heavy-handed temporary fail case for SCHED_NEW_WEAPON |
|
// Just manufacture a weapon of the desired type. |
|
//=============================================== |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_NEW_WEAPON_CHEAT, |
|
|
|
" Tasks" |
|
" TASK_WEAPON_CREATE 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//=============================================== |
|
// > SCHED_SWITCH_TO_PENDING_WEAPON |
|
//=============================================== |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_SWITCH_TO_PENDING_WEAPON, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_PLAY_SEQUENCE ACTIVITY:ACT_DROP_WEAPON" |
|
" TASK_CREATE_PENDING_WEAPON 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//=============================================== |
|
//=============================================== |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_GET_HEALTHKIT, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_TOLERANCE_DISTANCE 5" |
|
" TASK_GET_PATH_TO_TARGET_WEAPON 0" |
|
" TASK_ITEM_RUN_PATH 0" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_TARGET 0" |
|
" TASK_ITEM_PICKUP 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//=============================================== |
|
// > RangeAttack1 |
|
//=============================================== |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_RANGE_ATTACK1, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_ENEMY 0" |
|
" TASK_ANNOUNCE_ATTACK 1" // 1 = primary attack |
|
" TASK_RANGE_ATTACK1 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_ENEMY_OCCLUDED" |
|
" COND_NO_PRIMARY_AMMO" |
|
" COND_HEAR_DANGER" |
|
" COND_WEAPON_BLOCKED_BY_FRIEND" |
|
" COND_WEAPON_SIGHT_OCCLUDED" |
|
); |
|
|
|
//=============================================== |
|
// > RangeAttack2 |
|
//=============================================== |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_RANGE_ATTACK2, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_ENEMY 0" |
|
" TASK_ANNOUNCE_ATTACK 2" // 2 = secondary attack |
|
" TASK_RANGE_ATTACK2 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_ENEMY_OCCLUDED" |
|
" COND_NO_SECONDARY_AMMO" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// > Ambush - monster stands in place and waits for a new |
|
// enemy or chance to attack an existing enemy. |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_AMBUSH, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
" TASK_WAIT_INDEFINITE 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_PROVOKED" |
|
); |
|
|
|
//========================================================= |
|
// > Idle_Stand schedule - !!!BUGBUG - if this schedule doesn't |
|
// complete on its own the monster's HintNode will not be |
|
// cleared and the rest of the monster's group will avoid |
|
// that node because they think the group member that was |
|
// previously interrupted is still using that node to active |
|
// idle. |
|
///========================================================= |
|
//AI_DEFINE_SCHEDULE |
|
// Idle_Stand |
|
// |
|
//Tasks |
|
// TASK_FIND_HINTNODE 0 |
|
// TASK_GET_PATH_TO_HINTNODE 0 |
|
// TASK_STORE_LASTPOSITION 0 |
|
// TASK_WALK_PATH 0 |
|
// TASK_WAIT_FOR_MOVEMENT 0 |
|
// TASK_FACE_HINTNODE 0 |
|
// TASK_PLAY_ACTIVE_IDLE 0 |
|
// TASK_GET_PATH_TO_LASTPOSITION 0 |
|
// TASK_WALK_PATH 0 |
|
// TASK_WAIT_FOR_MOVEMENT 0 |
|
// TASK_CLEAR_LASTPOSITION 0 |
|
// TASK_CLEAR_HINTNODE 0 |
|
|
|
|
|
//Interrupts |
|
// New_Enemy |
|
// Light_Damage |
|
// Heavy_Damage |
|
// Provoked |
|
// HEAR_COMBAT |
|
// HEAR_WORLD |
|
// HEAR_PLAYER |
|
// HEAR_DANGER |
|
// HEAR_BULLET_IMPACT |
|
|
|
|
|
//========================================================= |
|
// > WakeAngry |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_WAKE_ANGRY, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE " |
|
" TASK_SOUND_WAKE 0" |
|
" TASK_FACE_IDEAL 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE " |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > AlertFace |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_ALERT_FACE, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_IDEAL 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_FEAR" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_PROVOKED" |
|
); |
|
|
|
//========================================================= |
|
// > AlertFace best sound |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_ALERT_FACE_BESTSOUND, |
|
|
|
" Tasks" |
|
" TASK_STORE_BESTSOUND_REACTORIGIN_IN_SAVEPOSITION 0" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_SAVEPOSITION 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
" TASK_WAIT 1.5" |
|
" TASK_FACE_REASONABLE 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_FEAR" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_PROVOKED" |
|
); |
|
|
|
//========================================================= |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_ALERT_REACT_TO_COMBAT_SOUND, |
|
|
|
" Tasks" |
|
" TASK_SET_SCHEDULE SCHEDULE:SCHED_ALERT_FACE_BESTSOUND" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
|
|
//========================================================= |
|
// > Alert_Scan |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_ALERT_SCAN, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_WAIT 0.5" |
|
" TASK_TURN_LEFT 180" |
|
" TASK_WAIT 0.5" |
|
" TASK_TURN_LEFT 180" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
); |
|
|
|
//========================================================= |
|
// > AlertStand |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_ALERT_STAND, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_REASONABLE 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
" TASK_WAIT 20" |
|
" TASK_SUGGEST_STATE STATE:IDLE" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_ENEMY" |
|
" COND_SEE_FEAR" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_PROVOKED" |
|
" COND_SMELL" |
|
" COND_HEAR_COMBAT" // sound flags |
|
" COND_HEAR_WORLD" |
|
" COND_HEAR_PLAYER" |
|
" COND_HEAR_DANGER" |
|
" COND_HEAR_BULLET_IMPACT" |
|
" COND_IDLE_INTERRUPT" |
|
" COND_GIVE_WAY" |
|
); |
|
|
|
|
|
|
|
//========================================================= |
|
// > AlertWAlk |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_ALERT_WALK, |
|
|
|
" Tasks" |
|
" TASK_WALK_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_WAIT_PVS 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_ENEMY" |
|
" COND_SEE_FEAR" |
|
" COND_ENEMY_DEAD" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_HEAR_DANGER" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK2" |
|
); |
|
|
|
//========================================================= |
|
// > InvestigateSound |
|
// |
|
// sends a monster to the location of the |
|
// sound that was just heard to check things out. |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_INVESTIGATE_SOUND, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_STORE_LASTPOSITION 0" |
|
// " TASK_SET_TOLERANCE_DISTANCE 32" |
|
" TASK_GET_PATH_TO_BESTSOUND 0" |
|
" TASK_FACE_IDEAL 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_WAIT 5" |
|
" TASK_GET_PATH_TO_LASTPOSITION 0" |
|
" TASK_WALK_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_CLEAR_LASTPOSITION 0" |
|
" TASK_FACE_REASONABLE 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_FEAR" |
|
" COND_SEE_ENEMY" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// > CombatStand |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_COMBAT_STAND, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
" TASK_WAIT_INDEFINITE 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_SEE_ENEMY" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_IDLE_INTERRUPT" |
|
); |
|
|
|
//========================================================= |
|
// > CombatWAlk |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_COMBAT_WALK, |
|
|
|
" Tasks" |
|
" TASK_WALK_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_WAIT_PVS 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_HEAR_DANGER" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK2" |
|
); |
|
|
|
//========================================================= |
|
// > CombatFace |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_COMBAT_FACE, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
" TASK_FACE_ENEMY 0" |
|
"" |
|
" Interrupts" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
); |
|
|
|
//========================================================= |
|
// COMBAT_SWEEP |
|
// |
|
// Do a small sweep of the area |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_COMBAT_SWEEP, |
|
|
|
" Tasks" |
|
" TASK_TURN_LEFT 45" |
|
" TASK_WAIT 2" |
|
" TASK_TURN_RIGHT 45" |
|
" TASK_WAIT 2" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_ENEMY" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_HEAR_DANGER" |
|
" COND_HEAR_WORLD" |
|
); |
|
|
|
//========================================================= |
|
// > Standoff |
|
// |
|
// Used in combat when a monster is |
|
// hiding in cover or the enemy has moved out of sight. |
|
// Should we look around in this schedule? |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_STANDOFF, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" // Translated to cover |
|
" TASK_WAIT_FACE_ENEMY 2" |
|
"" |
|
" Interrupts" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_ENEMY_DEAD" |
|
" COND_NEW_ENEMY" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// > Arm weapon (draw gun) |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_ARM_WEAPON, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_IDEAL 0" |
|
" TASK_PLAY_SEQUENCE ACTIVITY:ACT_ARM" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > Disarm weapon (holster gun) |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_DISARM_WEAPON, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_IDEAL 0" |
|
" TASK_PLAY_SEQUENCE ACTIVITY:ACT_DISARM" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// SCHED_HIDE_AND_RELOAD |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_HIDE_AND_RELOAD, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_RELOAD" |
|
" TASK_FIND_COVER_FROM_ENEMY 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_REMEMBER MEMORY:INCOVER" |
|
" TASK_FACE_ENEMY 0" |
|
" TASK_SET_SCHEDULE SCHEDULE:SCHED_RELOAD" |
|
"" |
|
" Interrupts" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// > Reload |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_RELOAD, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_RELOAD 0" |
|
"" |
|
" Interrupts" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// > Melee_Attack1 |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_MELEE_ATTACK1, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_ENEMY 0" |
|
" TASK_ANNOUNCE_ATTACK 1" // 1 = primary attack |
|
" TASK_MELEE_ATTACK1 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_ENEMY_OCCLUDED" |
|
); |
|
|
|
//========================================================= |
|
// > Melee_Attack2 |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_MELEE_ATTACK2, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_ENEMY 0" |
|
" TASK_ANNOUNCE_ATTACK 2" // 2 = secondary attack |
|
" TASK_MELEE_ATTACK2 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_ENEMY_OCCLUDED" |
|
); |
|
|
|
//========================================================= |
|
// > SpecialAttack1 |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_SPECIAL_ATTACK1, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_ENEMY 0" |
|
" TASK_SPECIAL_ATTACK1 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_ENEMY_OCCLUDED" |
|
" COND_NO_PRIMARY_AMMO" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// > SpecialAttack2 |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_SPECIAL_ATTACK2, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_ENEMY 0" |
|
" TASK_SPECIAL_ATTACK2 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_ENEMY_OCCLUDED" |
|
" COND_NO_SECONDARY_AMMO" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// > ChaseEnemy |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_CHASE_ENEMY, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_CHASE_ENEMY_FAILED" |
|
// " TASK_SET_TOLERANCE_DISTANCE 24" |
|
" TASK_GET_CHASE_PATH_TO_ENEMY 300" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_FACE_ENEMY 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_ENEMY_UNREACHABLE" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_TOO_CLOSE_TO_ATTACK" |
|
" COND_TASK_FAILED" |
|
" COND_LOST_ENEMY" |
|
" COND_BETTER_WEAPON_AVAILABLE" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// > CombatFace |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_TARGET_FACE, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
" TASK_FACE_TARGET 0" |
|
"" |
|
" Interrupts" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
); |
|
|
|
//========================================================= |
|
// > ChaseEnemy |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_TARGET_CHASE, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
// " TASK_SET_TOLERANCE_DISTANCE 24" |
|
" TASK_GET_PATH_TO_TARGET 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_ENEMY_UNREACHABLE" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_TOO_CLOSE_TO_ATTACK" |
|
" COND_TASK_FAILED" |
|
" COND_LOST_ENEMY" |
|
" COND_BETTER_WEAPON_AVAILABLE" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// > ChaseEnemyFailed |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_CHASE_ENEMY_FAILED, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_WAIT 0.2" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_STANDOFF" |
|
// " TASK_SET_TOLERANCE_DISTANCE 24" |
|
" TASK_FIND_COVER_FROM_ENEMY 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_REMEMBER MEMORY:INCOVER" |
|
" TASK_FACE_ENEMY 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" // Translated to cover |
|
" TASK_WAIT 1" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_HEAR_DANGER" |
|
" COND_BETTER_WEAPON_AVAILABLE" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
); |
|
|
|
//========================================================= |
|
// > SCHED_BACK_AWAY_FROM_SAVE_POSITION |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_BACK_AWAY_FROM_SAVE_POSITION, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
// " TASK_SET_TOLERANCE_DISTANCE 24" |
|
" TASK_FIND_BACKAWAY_FROM_SAVEPOSITION 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > BackAwayFromEnemy |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_BACK_AWAY_FROM_ENEMY, |
|
|
|
" Tasks" |
|
// If I can't back away from the enemy try to get behind him |
|
" TASK_STOP_MOVING 0" |
|
// " TASK_SET_TOLERANCE_DISTANCE 24" |
|
" TASK_STORE_ENEMY_POSITION_IN_SAVEPOSITION 0" |
|
" TASK_FIND_BACKAWAY_FROM_SAVEPOSITION 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK2" |
|
); |
|
|
|
//========================================================= |
|
// > SmallFlinch |
|
// played when heavy damage is taken recently after taking damage |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_SMALL_FLINCH, |
|
|
|
" Tasks" |
|
" TASK_REMEMBER MEMORY:FLINCHED " |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SMALL_FLINCH 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > BigFlinch |
|
// played when heavy damage is taken for the first time in a while |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_BIG_FLINCH, |
|
|
|
" Tasks" |
|
" TASK_REMEMBER MEMORY:FLINCHED " |
|
" TASK_STOP_MOVING 0" |
|
" TASK_BIG_FLINCH 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > Freeze |
|
// |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_NPC_FREEZE, |
|
|
|
" Tasks" |
|
" TASK_FREEZE 0" |
|
|
|
" Interrupts" |
|
" COND_NPC_UNFREEZE" |
|
); |
|
|
|
//========================================================= |
|
// > Die |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_DIE, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0 " |
|
" TASK_SOUND_DIE 0 " |
|
" TASK_DIE 0 " |
|
"" |
|
" Interrupts" |
|
" COND_NO_CUSTOM_INTERRUPTS" |
|
); |
|
|
|
//========================================================= |
|
// > Die |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_DIE_RAGDOLL, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0 " |
|
" TASK_SOUND_DIE 0 " |
|
"" |
|
" Interrupts" |
|
" COND_NO_CUSTOM_INTERRUPTS" |
|
); |
|
|
|
|
|
//========================================================= |
|
// > VictoryDance |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_VICTORY_DANCE, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_PLAY_SEQUENCE ACTIVITY:ACT_VICTORY_DANCE" |
|
" TASK_WAIT 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > Error |
|
//========================================================= |
|
//AI_DEFINE_SCHEDULE |
|
// Error |
|
// |
|
//Tasks |
|
// TASK_STOP_MOVING 0 |
|
// TASK_WAIT_INDEFINITE 0 |
|
// |
|
//Interrupts |
|
|
|
//========================================================= |
|
// > ScriptedWalk |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_SCRIPTED_WALK, |
|
|
|
" Tasks" |
|
" TASK_PRE_SCRIPT 0" |
|
" TASK_SET_TOLERANCE_DISTANCE 2" |
|
" TASK_PUSH_SCRIPT_ARRIVAL_ACTIVITY 0" |
|
|
|
" TASK_SCRIPT_WALK_TO_TARGET 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_PLANT_ON_SCRIPT 0" |
|
" TASK_FACE_SCRIPT 0" |
|
" TASK_ENABLE_SCRIPT 0" |
|
" TASK_WAIT_FOR_SCRIPT 0" |
|
" TASK_PLAY_SCRIPT 0" |
|
" TASK_PLAY_SCRIPT_POST_IDLE 0" |
|
"" |
|
" Interrupts" |
|
" COND_LIGHT_DAMAGE " |
|
" COND_HEAVY_DAMAGE" |
|
); |
|
|
|
//========================================================= |
|
// > ScriptedRun |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_SCRIPTED_RUN, |
|
|
|
" Tasks" |
|
" TASK_PRE_SCRIPT 0" |
|
" TASK_SET_TOLERANCE_DISTANCE 2" |
|
" TASK_PUSH_SCRIPT_ARRIVAL_ACTIVITY 0" |
|
" TASK_SCRIPT_RUN_TO_TARGET 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_PLANT_ON_SCRIPT 0" |
|
" TASK_FACE_SCRIPT 0" |
|
" TASK_ENABLE_SCRIPT 0" |
|
" TASK_WAIT_FOR_SCRIPT 0" |
|
" TASK_PLAY_SCRIPT 0" |
|
" TASK_PLAY_SCRIPT_POST_IDLE 0" |
|
"" |
|
" Interrupts" |
|
" COND_LIGHT_DAMAGE " |
|
" COND_HEAVY_DAMAGE" |
|
); |
|
|
|
//========================================================= |
|
// > ScriptedMoveCustom |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_SCRIPTED_CUSTOM_MOVE, |
|
|
|
" Tasks" |
|
" TASK_PRE_SCRIPT 0" |
|
" TASK_SET_TOLERANCE_DISTANCE 2" |
|
" TASK_PUSH_SCRIPT_ARRIVAL_ACTIVITY 0" |
|
" TASK_SCRIPT_CUSTOM_MOVE_TO_TARGET 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_PLANT_ON_SCRIPT 0" |
|
" TASK_FACE_SCRIPT 0" |
|
" TASK_ENABLE_SCRIPT 0" |
|
" TASK_WAIT_FOR_SCRIPT 0" |
|
" TASK_PLAY_SCRIPT 0" |
|
" TASK_PLAY_SCRIPT_POST_IDLE 0" |
|
"" |
|
" Interrupts" |
|
" COND_LIGHT_DAMAGE " |
|
" COND_HEAVY_DAMAGE" |
|
); |
|
|
|
//========================================================= |
|
// > ScriptedWait |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_SCRIPTED_WAIT, |
|
|
|
" Tasks" |
|
" TASK_PRE_SCRIPT 0" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_ENABLE_SCRIPT 0" |
|
" TASK_WAIT_FOR_SCRIPT 0" |
|
" TASK_PLAY_SCRIPT 0" |
|
" TASK_PLAY_SCRIPT_POST_IDLE 0" |
|
"" |
|
" Interrupts" |
|
" COND_LIGHT_DAMAGE " |
|
" COND_HEAVY_DAMAGE" |
|
); |
|
|
|
//========================================================= |
|
// > ScriptedFace |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_SCRIPTED_FACE, |
|
|
|
" Tasks" |
|
" TASK_PRE_SCRIPT 0" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_SCRIPT 0" |
|
" TASK_ENABLE_SCRIPT 0" |
|
" TASK_WAIT_FOR_SCRIPT 0" |
|
" TASK_PLAY_SCRIPT 0" |
|
" TASK_PLAY_SCRIPT_POST_IDLE 0" |
|
"" |
|
" Interrupts" |
|
" COND_LIGHT_DAMAGE " |
|
" COND_HEAVY_DAMAGE" |
|
); |
|
|
|
|
|
|
|
//========================================================= |
|
// > SCENE_FACE_TARGET |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_SCENE_GENERIC, |
|
|
|
" Tasks" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_SCENE_GENERIC" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
" TASK_PLAY_SCENE 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_SCHEDULE SCHEDULE:SCHED_SCENE_GENERIC" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > Cower |
|
// |
|
// This is what is usually done when attempts |
|
// to escape danger fail. |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_COWER, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_PLAY_SEQUENCE ACTIVITY:ACT_COWER" |
|
" TASK_WAIT_UNTIL_NO_DANGER_SOUND 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > TakeCoverFromOrigin |
|
// |
|
// move away from where you're currently standing. |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_TAKE_COVER_FROM_ORIGIN, |
|
|
|
" Tasks" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_FAIL_TAKE_COVER" |
|
" TASK_STOP_MOVING 0" |
|
// " TASK_SET_TOLERANCE_DISTANCE 24" |
|
" TASK_FIND_COVER_FROM_ORIGIN 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_REMEMBER MEMORY:INCOVER" |
|
" TASK_TURN_LEFT 179" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" // Translated to cover |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
); |
|
|
|
//========================================================= |
|
// > TakeCoverFromBestSound |
|
// |
|
// hide from the loudest sound source |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_TAKE_COVER_FROM_BEST_SOUND, |
|
|
|
" Tasks" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_FLEE_FROM_BEST_SOUND" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_STORE_BESTSOUND_REACTORIGIN_IN_SAVEPOSITION 0" |
|
" TASK_FIND_COVER_FROM_BEST_SOUND 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_REMEMBER MEMORY:INCOVER" |
|
" TASK_FACE_SAVEPOSITION 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" // Translated to cover |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
); |
|
|
|
|
|
//========================================================= |
|
// |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_FLEE_FROM_BEST_SOUND, |
|
|
|
" Tasks" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_COWER" |
|
" TASK_STORE_BESTSOUND_REACTORIGIN_IN_SAVEPOSITION 0" |
|
" TASK_GET_PATH_AWAY_FROM_BEST_SOUND 600" |
|
" TASK_RUN_PATH_FLEE 100" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_SAVEPOSITION 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
); |
|
|
|
|
|
//========================================================= |
|
// > TakeCoverFromEnemy |
|
// |
|
// Take cover from enemy! |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_TAKE_COVER_FROM_ENEMY, |
|
|
|
" Tasks" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_FAIL_TAKE_COVER" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_WAIT 0.2" |
|
// " TASK_SET_TOLERANCE_DISTANCE 24" |
|
" TASK_FIND_COVER_FROM_ENEMY 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_REMEMBER MEMORY:INCOVER" |
|
" TASK_FACE_ENEMY 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" // Translated to cover |
|
" TASK_WAIT 1" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// FAIL_TAKE_COVER |
|
// |
|
// Default case. Overridden by subclasses for behavior |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_FAIL_TAKE_COVER, |
|
|
|
" Tasks " |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
); |
|
|
|
//========================================================= |
|
// > RunFromEnemy |
|
// |
|
// Run to cover, but don't turn to face enemy and upon |
|
// fail run around randomly |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_RUN_FROM_ENEMY, |
|
|
|
" Tasks" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_RUN_FROM_ENEMY_FALLBACK" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FIND_COVER_FROM_ENEMY 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
); |
|
|
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_RUN_FROM_ENEMY_FALLBACK, |
|
|
|
" Tasks" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_RUN_RANDOM" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_STORE_ENEMY_POSITION_IN_SAVEPOSITION 0" |
|
" TASK_FIND_BACKAWAY_FROM_SAVEPOSITION 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
); |
|
|
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_RUN_FROM_ENEMY_MOB, |
|
|
|
" Tasks" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_RUN_RANDOM" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_STORE_ENEMY_POSITION_IN_SAVEPOSITION 0" |
|
" TASK_FIND_BACKAWAY_FROM_SAVEPOSITION 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
"" |
|
" Interrupts" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// > Fear_Face |
|
// |
|
// Face an enemy that I'm scared of, until I see it. Used |
|
// after I run to cover from a feared enemy |
|
// UNDONE: Add a special ACT_IDLE_FEAR |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_FEAR_FACE, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
" TASK_FACE_ENEMY 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_SEE_ENEMY" |
|
); |
|
|
|
//========================================================= |
|
// > Forced_Go (Used for debug only) |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_FORCED_GO, |
|
|
|
" Tasks" |
|
" TASK_SET_TOLERANCE_DISTANCE 48" |
|
" TASK_SET_ROUTE_SEARCH_TIME 3" // Spend 3 seconds trying to build a path if stuck |
|
" TASK_GET_PATH_TO_LASTPOSITION 0" |
|
" TASK_WALK_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > Forced_Go (Used for debug only) |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_FORCED_GO_RUN, |
|
|
|
" Tasks" |
|
" TASK_SET_TOLERANCE_DISTANCE 48" |
|
" TASK_SET_ROUTE_SEARCH_TIME 3" // Spend 3 seconds trying to build a path if stuck |
|
" TASK_GET_PATH_TO_LASTPOSITION 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// SCHED_MOVE_TO_WEAPON_RANGE |
|
// |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_MOVE_TO_WEAPON_RANGE, |
|
|
|
" Tasks " |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_CHASE_ENEMY" |
|
" TASK_GET_PATH_TO_RANGE_ENEMY_LKP_LOS 0" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_SET_SCHEDULE SCHEDULE:SCHED_COMBAT_FACE" |
|
"" |
|
" Interrupts " |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_LOST_ENEMY" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// ESTABLISH_LINE_OF_FIRE |
|
// |
|
// Go to a location from which I can shoot my enemy |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_ESTABLISH_LINE_OF_FIRE, |
|
|
|
" Tasks " |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_ESTABLISH_LINE_OF_FIRE_FALLBACK" |
|
" TASK_GET_PATH_TO_ENEMY_LOS 0" |
|
" TASK_SPEAK_SENTENCE 1" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_SET_SCHEDULE SCHEDULE:SCHED_COMBAT_FACE" |
|
"" |
|
" Interrupts " |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_LOST_ENEMY" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Shoot at my enemy in order to destroy the breakable cover object |
|
// that they are hiding behind. This will naturally destroy the cover object. |
|
//----------------------------------------------------------------------------- |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_SHOOT_ENEMY_COVER, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_ENEMY 0" |
|
" TASK_WAIT 0.5" |
|
" TASK_RANGE_ATTACK1 0" |
|
"" |
|
" Interrupts" |
|
" COND_ENEMY_DEAD" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_NO_PRIMARY_AMMO" |
|
" COND_HEAR_DANGER" |
|
" COND_WEAPON_BLOCKED_BY_FRIEND" |
|
); |
|
|
|
|
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_ESTABLISH_LINE_OF_FIRE_FALLBACK, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_PRE_FAIL_ESTABLISH_LINE_OF_FIRE" |
|
" TASK_GET_CHASE_PATH_TO_ENEMY 300" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_FACE_ENEMY 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_ENEMY_UNREACHABLE" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_TOO_CLOSE_TO_ATTACK" |
|
" COND_TASK_FAILED" |
|
" COND_LOST_ENEMY" |
|
" COND_BETTER_WEAPON_AVAILABLE" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_PRE_FAIL_ESTABLISH_LINE_OF_FIRE, |
|
|
|
" Tasks" |
|
" TASK_FACE_ENEMY 0" |
|
" TASK_FACE_REASONABLE 0" |
|
" TASK_IGNORE_OLD_ENEMIES 0" |
|
" TASK_SET_SCHEDULE SCHEDULE:SCHED_FAIL_ESTABLISH_LINE_OF_FIRE" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK2" |
|
); |
|
|
|
//========================================================= |
|
// FAIL_ESTABLISH_LINE_OF_FIRE |
|
// |
|
// Default case. Overridden by subclasses for behavior |
|
|
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_FAIL_ESTABLISH_LINE_OF_FIRE, |
|
|
|
" Tasks " |
|
"" |
|
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" |
|
"" |
|
" Interrupts " |
|
" COND_NEW_ENEMY" |
|
" COND_ENEMY_DEAD" |
|
" COND_LOST_ENEMY" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_HEAR_DANGER" |
|
); |
|
|
|
//========================================================= |
|
// > PATROL_RUN |
|
// |
|
// Run around randomly until we detect an enemy |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_PATROL_RUN, |
|
|
|
" Tasks" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_COMBAT_FACE" |
|
// " TASK_SET_TOLERANCE_DISTANCE 48" |
|
" TASK_SET_ROUTE_SEARCH_TIME 5" // Spend 5 seconds trying to build a path if stuck |
|
" TASK_GET_PATH_TO_RANDOM_NODE 200" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
"" |
|
" Interrupts" |
|
" COND_CAN_RANGE_ATTACK1 " |
|
" COND_CAN_RANGE_ATTACK2 " |
|
" COND_CAN_MELEE_ATTACK1 " |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_GIVE_WAY" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_ENEMY" |
|
" COND_SEE_FEAR" |
|
" COND_HEAR_COMBAT" |
|
" COND_HEAR_DANGER" |
|
" COND_HEAR_PLAYER" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_SMELL" |
|
" COND_PROVOKED" |
|
); |
|
|
|
//========================================================= |
|
// > IDLE_WANDER |
|
// |
|
// Walk around randomly |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_IDLE_WANDER, |
|
|
|
" Tasks" |
|
// " TASK_SET_TOLERANCE_DISTANCE 48" |
|
" TASK_SET_ROUTE_SEARCH_TIME 5" // Spend 5 seconds trying to build a path if stuck |
|
" TASK_GET_PATH_TO_RANDOM_NODE 200" |
|
" TASK_WALK_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_WAIT_PVS 0" |
|
"" |
|
" Interrupts" |
|
" COND_GIVE_WAY" |
|
" COND_HEAR_COMBAT" |
|
" COND_HEAR_DANGER" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_ENEMY" |
|
" COND_SEE_FEAR" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_IDLE_INTERRUPT" |
|
); |
|
|
|
//========================================================= |
|
// > PATROL_WALK |
|
// |
|
// Walk around randomly until we detect an enemy |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_PATROL_WALK, |
|
|
|
" Tasks" |
|
// " TASK_SET_TOLERANCE_DISTANCE 48" |
|
" TASK_SET_ROUTE_SEARCH_TIME 5" // Spend 5 seconds trying to build a path if stuck |
|
" TASK_GET_PATH_TO_RANDOM_NODE 200" |
|
" TASK_WALK_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
"" |
|
" Interrupts" |
|
" COND_CAN_RANGE_ATTACK1 " |
|
" COND_CAN_RANGE_ATTACK2 " |
|
" COND_CAN_MELEE_ATTACK1 " |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_GIVE_WAY" |
|
" COND_HEAR_COMBAT" |
|
" COND_HEAR_DANGER" |
|
" COND_HEAR_PLAYER" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_ENEMY" |
|
" COND_SEE_FEAR" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_SMELL" |
|
" COND_PROVOKED" |
|
); |
|
|
|
//========================================================= |
|
// > COMBAT_PATROL |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_COMBAT_PATROL, |
|
|
|
" Tasks" |
|
" TASK_SET_ROUTE_SEARCH_TIME 5" // Spend 5 seconds trying to build a path if stuck |
|
" TASK_GET_PATH_TO_RANDOM_NODE 200" |
|
" TASK_WALK_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
"" |
|
" Interrupts" |
|
" COND_CAN_RANGE_ATTACK1 " |
|
" COND_CAN_RANGE_ATTACK2 " |
|
" COND_CAN_MELEE_ATTACK1 " |
|
" COND_CAN_MELEE_ATTACK2" |
|
" COND_GIVE_WAY" |
|
" COND_HEAR_DANGER" |
|
" COND_NEW_ENEMY" |
|
); |
|
|
|
//========================================================= |
|
// > RUN_RANDOM |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_RUN_RANDOM, |
|
|
|
" Tasks" |
|
// " TASK_SET_TOLERANCE_DISTANCE 48" |
|
" TASK_SET_ROUTE_SEARCH_TIME 1" // Spend 1 seconds trying to build a path if stuck |
|
" TASK_GET_PATH_TO_RANDOM_NODE 500" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > FALL_TO_GROUND |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_FALL_TO_GROUND, |
|
|
|
" Tasks" |
|
" TASK_FALL_TO_GROUND 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > SCHED_DROPSHIP_DUSTOFF |
|
// After leaving the dropship, dustoff to your specified point |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_DROPSHIP_DUSTOFF, |
|
|
|
" Tasks" |
|
" TASK_WALK_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_WAIT_PVS 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// Flinch to protect self from incoming physics object |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_FLINCH_PHYSICS, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_PLAY_SEQUENCE ACTIVITY:ACT_FLINCH_PHYSICS" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > SCHED_MOVE_AWAY |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_MOVE_AWAY_FROM_ENEMY, |
|
|
|
" Tasks" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_MOVE_AWAY_FAIL" |
|
" TASK_FACE_ENEMY 0" |
|
" TASK_MOVE_AWAY_PATH 120" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_SET_SCHEDULE SCHEDULE:SCHED_MOVE_AWAY_END" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_CAN_RANGE_ATTACK1" |
|
" COND_CAN_RANGE_ATTACK2" |
|
" COND_CAN_MELEE_ATTACK1" |
|
" COND_CAN_MELEE_ATTACK2" |
|
); |
|
|
|
//========================================================= |
|
// > SCHED_MOVE_AWAY |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_MOVE_AWAY, |
|
|
|
" Tasks" |
|
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_MOVE_AWAY_FAIL" |
|
" TASK_MOVE_AWAY_PATH 120" |
|
" TASK_RUN_PATH 0" |
|
" TASK_WAIT_FOR_MOVEMENT 0" |
|
" TASK_SET_SCHEDULE SCHEDULE:SCHED_MOVE_AWAY_END" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > SCHED_MOVE_AWAY_FAIL |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_MOVE_AWAY_FAIL, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
"" |
|
" Interrupts" |
|
); |
|
|
|
//========================================================= |
|
// > SCHED_MOVE_AWAY_END (allows derived class to translate to appropriate behavior) |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_MOVE_AWAY_END, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_FACE_REASONABLE 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_ENEMY" |
|
" COND_SEE_FEAR" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_PROVOKED" |
|
" COND_SMELL" |
|
" COND_HEAR_COMBAT" // sound flags |
|
" COND_HEAR_WORLD" |
|
" COND_HEAR_PLAYER" |
|
" COND_HEAR_DANGER" |
|
" COND_HEAR_BULLET_IMPACT" |
|
" COND_IDLE_INTERRUPT" |
|
); |
|
|
|
|
|
//========================================================= |
|
// > SCHED_WAIT_FOR_SPEAK_FINISH |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_WAIT_FOR_SPEAK_FINISH, |
|
|
|
" Tasks" |
|
" TASK_WAIT_FOR_SPEAK_FINISH 0" |
|
"" |
|
" Interrupts" |
|
" COND_NEW_ENEMY" |
|
" COND_SEE_FEAR" |
|
" COND_LIGHT_DAMAGE" |
|
" COND_HEAVY_DAMAGE" |
|
" COND_SMELL" |
|
" COND_PROVOKED" |
|
" COND_GIVE_WAY" |
|
" COND_HEAR_DANGER" |
|
" COND_HEAR_COMBAT" |
|
" COND_HEAR_BULLET_IMPACT" |
|
|
|
); |
|
|
|
//========================================================= |
|
// > SCHED_DUCK_DODGE |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_DUCK_DODGE, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_PLAY_SEQUENCE ACTIVITY:ACT_DUCK_DODGE" |
|
" TASK_DEFER_DODGE 30" |
|
"" |
|
" Interrupts" |
|
"" |
|
); |
|
|
|
//========================================================= |
|
// > SCHED_INTERACTION_MOVE_TO_PARTNER |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_INTERACTION_MOVE_TO_PARTNER, |
|
|
|
" Tasks" |
|
" TASK_GET_PATH_TO_INTERACTION_PARTNER 0" |
|
" TASK_FACE_TARGET 0" |
|
" TASK_WAIT 1" |
|
"" |
|
" Interrupts" |
|
" COND_NO_CUSTOM_INTERRUPTS" |
|
); |
|
|
|
//========================================================= |
|
// > SCHED_INTERACTION_WAIT_FOR_PARTNER |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_INTERACTION_WAIT_FOR_PARTNER, |
|
|
|
" Tasks" |
|
" TASK_FACE_TARGET 0" |
|
" TASK_WAIT 1" |
|
"" |
|
" Interrupts" |
|
" COND_NO_CUSTOM_INTERRUPTS" |
|
); |
|
|
|
//========================================================= |
|
// > SCHED_SLEEP |
|
//========================================================= |
|
AI_DEFINE_SCHEDULE |
|
( |
|
SCHED_SLEEP, |
|
|
|
" Tasks" |
|
" TASK_STOP_MOVING 0" |
|
" TASK_WAIT 0.2" |
|
"" |
|
" Interrupts" |
|
"" |
|
); |
|
|
|
|
|
|