diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/server/ai_default.cpp | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/server/ai_default.cpp')
| -rw-r--r-- | mp/src/game/server/ai_default.cpp | 2381 |
1 files changed, 2381 insertions, 0 deletions
diff --git a/mp/src/game/server/ai_default.cpp b/mp/src/game/server/ai_default.cpp new file mode 100644 index 00000000..08db490c --- /dev/null +++ b/mp/src/game/server/ai_default.cpp @@ -0,0 +1,2381 @@ +//========= 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"
+ ""
+ );
+
+
|