Team Fortress 2 Source Code as on 22/4/2020
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

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose: Default schedules.
  4. //
  5. //=============================================================================//
  6. #include "cbase.h"
  7. #include "ai_default.h"
  8. #include "soundent.h"
  9. #include "scripted.h"
  10. #include "ai_schedule.h"
  11. #include "ai_squad.h"
  12. #include "ai_senses.h"
  13. #include "ai_networkmanager.h"
  14. #include "stringregistry.h"
  15. #include "igamesystem.h"
  16. #include "ai_network.h"
  17. // memdbgon must be the last include file in a .cpp file!!!
  18. #include "tier0/memdbgon.h"
  19. CAI_Schedule *CAI_BaseNPC::ScheduleInList( const char *pName, CAI_Schedule **pList, int listCount )
  20. {
  21. int i;
  22. if ( !pName )
  23. {
  24. DevMsg( "%s set to unnamed schedule!\n", GetClassname() );
  25. return NULL;
  26. }
  27. for ( i = 0; i < listCount; i++ )
  28. {
  29. if ( !pList[i]->GetName() )
  30. {
  31. DevMsg( "Unnamed schedule!\n" );
  32. continue;
  33. }
  34. if ( stricmp( pName, pList[i]->GetName() ) == 0 )
  35. return pList[i];
  36. }
  37. return NULL;
  38. }
  39. //-----------------------------------------------------------------------------
  40. // Purpose: Given and schedule name, return the schedule ID
  41. //-----------------------------------------------------------------------------
  42. int CAI_BaseNPC::GetScheduleID(const char* schedName)
  43. {
  44. return GetSchedulingSymbols()->ScheduleSymbolToId(schedName);
  45. }
  46. //-----------------------------------------------------------------------------
  47. // Purpose:
  48. // Input :
  49. // Output :
  50. //-----------------------------------------------------------------------------
  51. void CAI_BaseNPC::InitDefaultScheduleSR(void)
  52. {
  53. #define ADD_DEF_SCHEDULE( name, localId ) idSpace.AddSchedule(name, localId, "CAI_BaseNPC" )
  54. CAI_ClassScheduleIdSpace &idSpace = CAI_BaseNPC::AccessClassScheduleIdSpaceDirect();
  55. ADD_DEF_SCHEDULE( "SCHED_NONE", SCHED_NONE);
  56. ADD_DEF_SCHEDULE( "SCHED_IDLE_STAND", SCHED_IDLE_STAND);
  57. ADD_DEF_SCHEDULE( "SCHED_IDLE_WALK", SCHED_IDLE_WALK);
  58. ADD_DEF_SCHEDULE( "SCHED_IDLE_WANDER", SCHED_IDLE_WANDER);
  59. ADD_DEF_SCHEDULE( "SCHED_WAKE_ANGRY", SCHED_WAKE_ANGRY);
  60. ADD_DEF_SCHEDULE( "SCHED_ALERT_FACE", SCHED_ALERT_FACE);
  61. ADD_DEF_SCHEDULE( "SCHED_ALERT_FACE_BESTSOUND", SCHED_ALERT_FACE_BESTSOUND);
  62. ADD_DEF_SCHEDULE( "SCHED_ALERT_REACT_TO_COMBAT_SOUND", SCHED_ALERT_REACT_TO_COMBAT_SOUND);
  63. ADD_DEF_SCHEDULE( "SCHED_ALERT_SCAN", SCHED_ALERT_SCAN);
  64. ADD_DEF_SCHEDULE( "SCHED_ALERT_STAND", SCHED_ALERT_STAND);
  65. ADD_DEF_SCHEDULE( "SCHED_ALERT_WALK", SCHED_ALERT_WALK);
  66. ADD_DEF_SCHEDULE( "SCHED_INVESTIGATE_SOUND", SCHED_INVESTIGATE_SOUND);
  67. ADD_DEF_SCHEDULE( "SCHED_COMBAT_FACE", SCHED_COMBAT_FACE);
  68. ADD_DEF_SCHEDULE( "SCHED_COMBAT_SWEEP", SCHED_COMBAT_SWEEP);
  69. ADD_DEF_SCHEDULE( "SCHED_FEAR_FACE", SCHED_FEAR_FACE);
  70. ADD_DEF_SCHEDULE( "SCHED_COMBAT_STAND", SCHED_COMBAT_STAND);
  71. ADD_DEF_SCHEDULE( "SCHED_COMBAT_WALK", SCHED_COMBAT_WALK);
  72. ADD_DEF_SCHEDULE( "SCHED_CHASE_ENEMY", SCHED_CHASE_ENEMY);
  73. ADD_DEF_SCHEDULE( "SCHED_CHASE_ENEMY_FAILED", SCHED_CHASE_ENEMY_FAILED);
  74. ADD_DEF_SCHEDULE( "SCHED_VICTORY_DANCE", SCHED_VICTORY_DANCE);
  75. ADD_DEF_SCHEDULE( "SCHED_TARGET_FACE", SCHED_TARGET_FACE);
  76. ADD_DEF_SCHEDULE( "SCHED_TARGET_CHASE", SCHED_TARGET_CHASE);
  77. ADD_DEF_SCHEDULE( "SCHED_SMALL_FLINCH", SCHED_SMALL_FLINCH);
  78. ADD_DEF_SCHEDULE( "SCHED_BIG_FLINCH", SCHED_BIG_FLINCH);
  79. ADD_DEF_SCHEDULE( "SCHED_BACK_AWAY_FROM_ENEMY", SCHED_BACK_AWAY_FROM_ENEMY);
  80. ADD_DEF_SCHEDULE( "SCHED_MOVE_AWAY_FROM_ENEMY", SCHED_MOVE_AWAY_FROM_ENEMY);
  81. ADD_DEF_SCHEDULE( "SCHED_BACK_AWAY_FROM_SAVE_POSITION", SCHED_BACK_AWAY_FROM_SAVE_POSITION);
  82. ADD_DEF_SCHEDULE( "SCHED_TAKE_COVER_FROM_ENEMY", SCHED_TAKE_COVER_FROM_ENEMY);
  83. ADD_DEF_SCHEDULE( "SCHED_TAKE_COVER_FROM_BEST_SOUND", SCHED_TAKE_COVER_FROM_BEST_SOUND);
  84. ADD_DEF_SCHEDULE( "SCHED_FLEE_FROM_BEST_SOUND", SCHED_FLEE_FROM_BEST_SOUND);
  85. ADD_DEF_SCHEDULE( "SCHED_TAKE_COVER_FROM_ORIGIN", SCHED_TAKE_COVER_FROM_ORIGIN);
  86. ADD_DEF_SCHEDULE( "SCHED_FAIL_TAKE_COVER", SCHED_FAIL_TAKE_COVER);
  87. ADD_DEF_SCHEDULE( "SCHED_RUN_FROM_ENEMY", SCHED_RUN_FROM_ENEMY);
  88. ADD_DEF_SCHEDULE( "SCHED_RUN_FROM_ENEMY_FALLBACK", SCHED_RUN_FROM_ENEMY_FALLBACK);
  89. ADD_DEF_SCHEDULE( "SCHED_MOVE_TO_WEAPON_RANGE", SCHED_MOVE_TO_WEAPON_RANGE);
  90. ADD_DEF_SCHEDULE( "SCHED_ESTABLISH_LINE_OF_FIRE", SCHED_ESTABLISH_LINE_OF_FIRE);
  91. ADD_DEF_SCHEDULE( "SCHED_SHOOT_ENEMY_COVER", SCHED_SHOOT_ENEMY_COVER);
  92. ADD_DEF_SCHEDULE( "SCHED_ESTABLISH_LINE_OF_FIRE_FALLBACK", SCHED_ESTABLISH_LINE_OF_FIRE_FALLBACK);
  93. ADD_DEF_SCHEDULE( "SCHED_PRE_FAIL_ESTABLISH_LINE_OF_FIRE", SCHED_PRE_FAIL_ESTABLISH_LINE_OF_FIRE);
  94. ADD_DEF_SCHEDULE( "SCHED_FAIL_ESTABLISH_LINE_OF_FIRE", SCHED_FAIL_ESTABLISH_LINE_OF_FIRE);
  95. ADD_DEF_SCHEDULE( "SCHED_COWER", SCHED_COWER);
  96. ADD_DEF_SCHEDULE( "SCHED_MELEE_ATTACK1", SCHED_MELEE_ATTACK1);
  97. ADD_DEF_SCHEDULE( "SCHED_MELEE_ATTACK2", SCHED_MELEE_ATTACK2);
  98. ADD_DEF_SCHEDULE( "SCHED_RANGE_ATTACK1", SCHED_RANGE_ATTACK1);
  99. ADD_DEF_SCHEDULE( "SCHED_RANGE_ATTACK2", SCHED_RANGE_ATTACK2);
  100. ADD_DEF_SCHEDULE( "SCHED_SPECIAL_ATTACK1", SCHED_SPECIAL_ATTACK1);
  101. ADD_DEF_SCHEDULE( "SCHED_SPECIAL_ATTACK2", SCHED_SPECIAL_ATTACK2);
  102. ADD_DEF_SCHEDULE( "SCHED_STANDOFF", SCHED_STANDOFF);
  103. ADD_DEF_SCHEDULE( "SCHED_ARM_WEAPON", SCHED_ARM_WEAPON);
  104. ADD_DEF_SCHEDULE( "SCHED_DISARM_WEAPON", SCHED_DISARM_WEAPON);
  105. ADD_DEF_SCHEDULE( "SCHED_HIDE_AND_RELOAD", SCHED_HIDE_AND_RELOAD);
  106. ADD_DEF_SCHEDULE( "SCHED_RELOAD", SCHED_RELOAD);
  107. ADD_DEF_SCHEDULE( "SCHED_AMBUSH", SCHED_AMBUSH);
  108. ADD_DEF_SCHEDULE( "SCHED_DIE", SCHED_DIE);
  109. ADD_DEF_SCHEDULE( "SCHED_DIE_RAGDOLL", SCHED_DIE_RAGDOLL);
  110. ADD_DEF_SCHEDULE( "SCHED_WAIT_FOR_SCRIPT", SCHED_WAIT_FOR_SCRIPT);
  111. ADD_DEF_SCHEDULE( "SCHED_AISCRIPT", SCHED_AISCRIPT);
  112. ADD_DEF_SCHEDULE( "SCHED_SCRIPTED_WALK", SCHED_SCRIPTED_WALK);
  113. ADD_DEF_SCHEDULE( "SCHED_SCRIPTED_RUN", SCHED_SCRIPTED_RUN);
  114. ADD_DEF_SCHEDULE( "SCHED_SCRIPTED_CUSTOM_MOVE", SCHED_SCRIPTED_CUSTOM_MOVE);
  115. ADD_DEF_SCHEDULE( "SCHED_SCRIPTED_WAIT", SCHED_SCRIPTED_WAIT);
  116. ADD_DEF_SCHEDULE( "SCHED_SCRIPTED_FACE", SCHED_SCRIPTED_FACE);
  117. ADD_DEF_SCHEDULE( "SCHED_SCENE_GENERIC", SCHED_SCENE_GENERIC);
  118. ADD_DEF_SCHEDULE( "SCHED_NEW_WEAPON", SCHED_NEW_WEAPON);
  119. ADD_DEF_SCHEDULE( "SCHED_NEW_WEAPON_CHEAT", SCHED_NEW_WEAPON_CHEAT);
  120. ADD_DEF_SCHEDULE( "SCHED_SWITCH_TO_PENDING_WEAPON", SCHED_SWITCH_TO_PENDING_WEAPON );
  121. ADD_DEF_SCHEDULE( "SCHED_GET_HEALTHKIT", SCHED_GET_HEALTHKIT);
  122. ADD_DEF_SCHEDULE( "SCHED_MOVE_AWAY", SCHED_MOVE_AWAY);
  123. ADD_DEF_SCHEDULE( "SCHED_MOVE_AWAY_FAIL", SCHED_MOVE_AWAY_FAIL);
  124. ADD_DEF_SCHEDULE( "SCHED_MOVE_AWAY_END", SCHED_MOVE_AWAY_END);
  125. ADD_DEF_SCHEDULE( "SCHED_WAIT_FOR_SPEAK_FINISH", SCHED_WAIT_FOR_SPEAK_FINISH);
  126. ADD_DEF_SCHEDULE( "SCHED_FORCED_GO", SCHED_FORCED_GO);
  127. ADD_DEF_SCHEDULE( "SCHED_FORCED_GO_RUN", SCHED_FORCED_GO_RUN);
  128. ADD_DEF_SCHEDULE( "SCHED_PATROL_WALK", SCHED_PATROL_WALK);
  129. ADD_DEF_SCHEDULE( "SCHED_COMBAT_PATROL", SCHED_COMBAT_PATROL);
  130. ADD_DEF_SCHEDULE( "SCHED_PATROL_RUN", SCHED_PATROL_RUN);
  131. ADD_DEF_SCHEDULE( "SCHED_RUN_RANDOM", SCHED_RUN_RANDOM);
  132. ADD_DEF_SCHEDULE( "SCHED_FAIL", SCHED_FAIL);
  133. ADD_DEF_SCHEDULE( "SCHED_FAIL_NOSTOP", SCHED_FAIL_NOSTOP);
  134. ADD_DEF_SCHEDULE( "SCHED_FALL_TO_GROUND", SCHED_FALL_TO_GROUND);
  135. ADD_DEF_SCHEDULE( "SCHED_DROPSHIP_DUSTOFF", SCHED_DROPSHIP_DUSTOFF);
  136. ADD_DEF_SCHEDULE( "SCHED_NPC_FREEZE", SCHED_NPC_FREEZE);
  137. ADD_DEF_SCHEDULE( "SCHED_FLINCH_PHYSICS", SCHED_FLINCH_PHYSICS);
  138. ADD_DEF_SCHEDULE( "SCHED_RUN_FROM_ENEMY_MOB", SCHED_RUN_FROM_ENEMY_MOB );
  139. ADD_DEF_SCHEDULE( "SCHED_DUCK_DODGE", SCHED_DUCK_DODGE );
  140. ADD_DEF_SCHEDULE( "SCHED_INTERACTION_MOVE_TO_PARTNER", SCHED_INTERACTION_MOVE_TO_PARTNER );
  141. ADD_DEF_SCHEDULE( "SCHED_INTERACTION_WAIT_FOR_PARTNER", SCHED_INTERACTION_WAIT_FOR_PARTNER );
  142. ADD_DEF_SCHEDULE( "SCHED_SLEEP", SCHED_SLEEP );
  143. }
  144. bool CAI_BaseNPC::LoadDefaultSchedules(void)
  145. {
  146. // AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_NONE);
  147. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_IDLE_STAND);
  148. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_IDLE_WALK);
  149. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_IDLE_WANDER);
  150. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_WAKE_ANGRY);
  151. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ALERT_FACE);
  152. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ALERT_FACE_BESTSOUND);
  153. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ALERT_REACT_TO_COMBAT_SOUND);
  154. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ALERT_SCAN);
  155. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ALERT_STAND);
  156. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ALERT_WALK);
  157. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_INVESTIGATE_SOUND);
  158. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_COMBAT_FACE);
  159. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_COMBAT_SWEEP);
  160. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_COMBAT_WALK);
  161. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FEAR_FACE);
  162. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_COMBAT_STAND);
  163. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_CHASE_ENEMY);
  164. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_CHASE_ENEMY_FAILED);
  165. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_VICTORY_DANCE);
  166. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_TARGET_FACE);
  167. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_TARGET_CHASE);
  168. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SMALL_FLINCH);
  169. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_BIG_FLINCH);
  170. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_BACK_AWAY_FROM_ENEMY);
  171. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MOVE_AWAY_FROM_ENEMY);
  172. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_BACK_AWAY_FROM_SAVE_POSITION);
  173. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_TAKE_COVER_FROM_ENEMY);
  174. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_TAKE_COVER_FROM_BEST_SOUND);
  175. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FLEE_FROM_BEST_SOUND);
  176. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_TAKE_COVER_FROM_ORIGIN);
  177. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FAIL_TAKE_COVER);
  178. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RUN_FROM_ENEMY);
  179. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RUN_FROM_ENEMY_FALLBACK);
  180. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MOVE_TO_WEAPON_RANGE);
  181. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ESTABLISH_LINE_OF_FIRE);
  182. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SHOOT_ENEMY_COVER);
  183. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ESTABLISH_LINE_OF_FIRE_FALLBACK);
  184. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_PRE_FAIL_ESTABLISH_LINE_OF_FIRE);
  185. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FAIL_ESTABLISH_LINE_OF_FIRE);
  186. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_COWER);
  187. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MELEE_ATTACK1);
  188. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MELEE_ATTACK2);
  189. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RANGE_ATTACK1);
  190. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RANGE_ATTACK2);
  191. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SPECIAL_ATTACK1);
  192. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SPECIAL_ATTACK2);
  193. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_STANDOFF);
  194. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_ARM_WEAPON);
  195. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_DISARM_WEAPON);
  196. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_HIDE_AND_RELOAD);
  197. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RELOAD);
  198. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_AMBUSH);
  199. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_DIE);
  200. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_DIE_RAGDOLL);
  201. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_WAIT_FOR_SCRIPT);
  202. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SCRIPTED_WALK);
  203. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SCRIPTED_RUN);
  204. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SCRIPTED_CUSTOM_MOVE);
  205. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SCRIPTED_WAIT);
  206. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SCRIPTED_FACE);
  207. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SCENE_GENERIC);
  208. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_NEW_WEAPON);
  209. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_NEW_WEAPON_CHEAT);
  210. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SWITCH_TO_PENDING_WEAPON);
  211. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_GET_HEALTHKIT);
  212. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MOVE_AWAY);
  213. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MOVE_AWAY_FAIL);
  214. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_MOVE_AWAY_END);
  215. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_WAIT_FOR_SPEAK_FINISH);
  216. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FORCED_GO);
  217. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FORCED_GO_RUN);
  218. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_PATROL_WALK);
  219. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_COMBAT_PATROL);
  220. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_PATROL_RUN);
  221. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RUN_RANDOM);
  222. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FAIL);
  223. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FAIL_NOSTOP);
  224. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FALL_TO_GROUND);
  225. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_DROPSHIP_DUSTOFF);
  226. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_FLINCH_PHYSICS);
  227. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_RUN_FROM_ENEMY_MOB );
  228. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_DUCK_DODGE);
  229. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_NPC_FREEZE);
  230. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_INTERACTION_MOVE_TO_PARTNER);
  231. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_INTERACTION_WAIT_FOR_PARTNER);
  232. AI_LOAD_DEF_SCHEDULE( CAI_BaseNPC, SCHED_SLEEP );
  233. return true;
  234. }
  235. int CAI_BaseNPC::TranslateSchedule( int scheduleType )
  236. {
  237. // FIXME: Where should this go now?
  238. #if 0
  239. if (scheduleType >= LAST_SHARED_SCHEDULE)
  240. {
  241. char errMsg[256];
  242. Q_snprintf(errMsg,sizeof(errMsg),"ERROR: Subclass Schedule (%s) Hitting Base Class!\n",ScheduleName(scheduleType));
  243. DevMsg( errMsg );
  244. AddTimedOverlay( errMsg, 5);
  245. return SCHED_FAIL;
  246. }
  247. #endif
  248. switch( scheduleType )
  249. {
  250. // Hande some special cases
  251. case SCHED_AISCRIPT:
  252. {
  253. Assert( m_hCine != NULL );
  254. if ( !m_hCine )
  255. {
  256. DevWarning( 2, "Script failed for %s\n", GetClassname() );
  257. CineCleanup();
  258. return SCHED_IDLE_STAND;
  259. }
  260. // else
  261. // DevMsg( 2, "Starting script %s for %s\n", STRING( m_hCine->m_iszPlay ), GetClassname() );
  262. switch ( m_hCine->m_fMoveTo )
  263. {
  264. case CINE_MOVETO_WAIT:
  265. case CINE_MOVETO_TELEPORT:
  266. {
  267. return SCHED_SCRIPTED_WAIT;
  268. }
  269. case CINE_MOVETO_WALK:
  270. {
  271. return SCHED_SCRIPTED_WALK;
  272. }
  273. case CINE_MOVETO_RUN:
  274. {
  275. return SCHED_SCRIPTED_RUN;
  276. }
  277. case CINE_MOVETO_CUSTOM:
  278. {
  279. return SCHED_SCRIPTED_CUSTOM_MOVE;
  280. }
  281. case CINE_MOVETO_WAIT_FACING:
  282. {
  283. return SCHED_SCRIPTED_FACE;
  284. }
  285. }
  286. }
  287. break;
  288. case SCHED_IDLE_STAND:
  289. {
  290. // FIXME: crows are set into IDLE_STAND as an failure schedule, not sure if ALERT_STAND or COMBAT_STAND is a better choice
  291. // Assert( m_NPCState == NPC_STATE_IDLE );
  292. }
  293. break;
  294. case SCHED_IDLE_WANDER:
  295. {
  296. // FIXME: citizen interaction only, no idea what the state is.
  297. // Assert( m_NPCState == NPC_STATE_IDLE );
  298. }
  299. break;
  300. case SCHED_IDLE_WALK:
  301. {
  302. switch( m_NPCState )
  303. {
  304. case NPC_STATE_ALERT:
  305. return SCHED_ALERT_WALK;
  306. case NPC_STATE_COMBAT:
  307. return SCHED_COMBAT_WALK;
  308. }
  309. }
  310. break;
  311. case SCHED_ALERT_FACE:
  312. {
  313. // FIXME: default AI can pick this when in idle state
  314. // Assert( m_NPCState == NPC_STATE_ALERT );
  315. }
  316. break;
  317. case SCHED_ALERT_SCAN:
  318. case SCHED_ALERT_STAND:
  319. {
  320. // FIXME: rollermines use this when they're being held
  321. // Assert( m_NPCState == NPC_STATE_ALERT );
  322. }
  323. break;
  324. case SCHED_ALERT_WALK:
  325. {
  326. Assert( m_NPCState == NPC_STATE_ALERT );
  327. }
  328. break;
  329. case SCHED_COMBAT_FACE:
  330. {
  331. // FIXME: failure schedule for SCHED_PATROL which can be called when in alert
  332. // Assert( m_NPCState == NPC_STATE_COMBAT );
  333. }
  334. break;
  335. case SCHED_COMBAT_STAND:
  336. {
  337. // FIXME: never used?
  338. }
  339. break;
  340. case SCHED_COMBAT_WALK:
  341. {
  342. Assert( m_NPCState == NPC_STATE_COMBAT );
  343. }
  344. break;
  345. }
  346. return scheduleType;
  347. }
  348. //=========================================================
  349. // GetScheduleOfType - returns a pointer to one of the
  350. // NPC's available schedules of the indicated type.
  351. //=========================================================
  352. CAI_Schedule *CAI_BaseNPC::GetScheduleOfType( int scheduleType )
  353. {
  354. // allow the derived classes to pick an appropriate version of this schedule or override
  355. // base schedule types.
  356. AI_PROFILE_SCOPE_BEGIN(CAI_BaseNPC_TranslateSchedule);
  357. scheduleType = TranslateSchedule( scheduleType );
  358. AI_PROFILE_SCOPE_END();
  359. // Get a pointer to that schedule
  360. CAI_Schedule *schedule = GetSchedule(scheduleType);
  361. if (!schedule)
  362. {
  363. DevMsg( "GetScheduleOfType(): No CASE for Schedule Type %d!\n", scheduleType );
  364. return GetSchedule(SCHED_IDLE_STAND);
  365. }
  366. return schedule;
  367. }
  368. CAI_Schedule *CAI_BaseNPC::GetSchedule(int schedule)
  369. {
  370. if (!GetClassScheduleIdSpace()->IsGlobalBaseSet())
  371. {
  372. Warning("ERROR: %s missing schedule!\n", GetSchedulingErrorName());
  373. return g_AI_SchedulesManager.GetScheduleFromID(SCHED_IDLE_STAND);
  374. }
  375. if ( AI_IdIsLocal( schedule ) )
  376. {
  377. schedule = GetClassScheduleIdSpace()->ScheduleLocalToGlobal(schedule);
  378. }
  379. return g_AI_SchedulesManager.GetScheduleFromID( schedule );
  380. }
  381. bool CAI_BaseNPC::IsCurSchedule( int schedId, bool fIdeal )
  382. {
  383. if ( !m_pSchedule )
  384. return ( schedId == SCHED_NONE || schedId == AI_RemapToGlobal(SCHED_NONE) );
  385. schedId = ( AI_IdIsLocal( schedId ) ) ?
  386. GetClassScheduleIdSpace()->ScheduleLocalToGlobal(schedId) :
  387. schedId;
  388. if ( fIdeal )
  389. return ( schedId == m_IdealSchedule );
  390. return ( m_pSchedule->GetId() == schedId );
  391. }
  392. const char* CAI_BaseNPC::ConditionName(int conditionID)
  393. {
  394. if ( AI_IdIsLocal( conditionID ) )
  395. conditionID = GetClassScheduleIdSpace()->ConditionLocalToGlobal(conditionID);
  396. return GetSchedulingSymbols()->ConditionIdToSymbol(conditionID);
  397. }
  398. const char *CAI_BaseNPC::TaskName(int taskID)
  399. {
  400. if ( AI_IdIsLocal( taskID ) )
  401. taskID = GetClassScheduleIdSpace()->TaskLocalToGlobal(taskID);
  402. return GetSchedulingSymbols()->TaskIdToSymbol( taskID );
  403. }
  404. // This hooks the main game systems callbacks to allow the AI system to manage memory
  405. class CAI_SystemHook : public CAutoGameSystem
  406. {
  407. public:
  408. CAI_SystemHook( char const *name ) : CAutoGameSystem( name )
  409. {
  410. }
  411. // UNDONE: Schedule / strings stuff should probably happen once each GAME, not each level
  412. void LevelInitPreEntity()
  413. {
  414. extern float g_AINextDisabledMessageTime;
  415. g_AINextDisabledMessageTime = 0;
  416. g_AI_SchedulesManager.CreateStringRegistries();
  417. CAI_BaseNPC::gm_iNextThinkRebalanceTick = 0;
  418. }
  419. virtual void LevelInitPostEntity()
  420. {
  421. g_AI_SensedObjectsManager.Init();
  422. }
  423. void LevelShutdownPreEntity()
  424. {
  425. CBaseCombatCharacter::ResetVisibilityCache();
  426. }
  427. void LevelShutdownPostEntity( void )
  428. {
  429. g_AI_SensedObjectsManager.Term();
  430. g_pAINetworkManager->DeleteAllAINetworks();
  431. g_AI_SchedulesManager.DeleteAllSchedules();
  432. g_AI_SquadManager.DeleteAllSquads();
  433. g_AI_SchedulesManager.DestroyStringRegistries();
  434. }
  435. };
  436. static CAI_SystemHook g_AISystemHook( "CAI_SystemHook" );
  437. //-----------------------------------------------------------------------------
  438. //
  439. // Schedules
  440. //
  441. //-----------------------------------------------------------------------------
  442. //=========================================================
  443. // > Fail
  444. // This schedule itself can fail because the NPC may
  445. // be unable to finish the stop moving. If so, fall back
  446. // the a fail schedule that has no stop moving in it.
  447. //=========================================================
  448. AI_DEFINE_SCHEDULE
  449. (
  450. SCHED_FAIL,
  451. " Tasks"
  452. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_FAIL_NOSTOP"
  453. " TASK_STOP_MOVING 0"
  454. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  455. " TASK_WAIT 1"
  456. " TASK_WAIT_PVS 0"
  457. ""
  458. " Interrupts"
  459. " COND_CAN_RANGE_ATTACK1 "
  460. " COND_CAN_RANGE_ATTACK2 "
  461. " COND_CAN_MELEE_ATTACK1 "
  462. " COND_CAN_MELEE_ATTACK2"
  463. " COND_GIVE_WAY"
  464. );
  465. //=========================================================
  466. // > Fail without stop moving, which can fail.
  467. //=========================================================
  468. AI_DEFINE_SCHEDULE
  469. (
  470. SCHED_FAIL_NOSTOP,
  471. " Tasks"
  472. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  473. " TASK_WAIT 1"
  474. " TASK_WAIT_PVS 0"
  475. ""
  476. " Interrupts"
  477. " COND_CAN_RANGE_ATTACK1 "
  478. " COND_CAN_RANGE_ATTACK2 "
  479. " COND_CAN_MELEE_ATTACK1 "
  480. " COND_CAN_MELEE_ATTACK2"
  481. " COND_GIVE_WAY"
  482. );
  483. //===============================================
  484. // > Idle_Stand
  485. //===============================================
  486. AI_DEFINE_SCHEDULE
  487. (
  488. SCHED_IDLE_STAND,
  489. " Tasks"
  490. " TASK_STOP_MOVING 1"
  491. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  492. " TASK_WAIT 5"
  493. " TASK_WAIT_PVS 0"
  494. ""
  495. " Interrupts"
  496. " COND_NEW_ENEMY"
  497. " COND_SEE_FEAR"
  498. " COND_LIGHT_DAMAGE"
  499. " COND_HEAVY_DAMAGE"
  500. " COND_SMELL"
  501. " COND_PROVOKED"
  502. " COND_GIVE_WAY"
  503. " COND_HEAR_PLAYER"
  504. " COND_HEAR_DANGER"
  505. " COND_HEAR_COMBAT"
  506. " COND_HEAR_BULLET_IMPACT"
  507. " COND_IDLE_INTERRUPT"
  508. );
  509. //===============================================
  510. // > Wait_For_Script
  511. //===============================================
  512. AI_DEFINE_SCHEDULE
  513. (
  514. SCHED_WAIT_FOR_SCRIPT,
  515. " Tasks"
  516. " TASK_STOP_MOVING 0"
  517. " TASK_WAIT_INDEFINITE 0"
  518. ""
  519. " Interrupts"
  520. " COND_LIGHT_DAMAGE"
  521. " COND_HEAVY_DAMAGE"
  522. );
  523. //===============================================
  524. // > IdleWalk
  525. //===============================================
  526. AI_DEFINE_SCHEDULE
  527. (
  528. SCHED_IDLE_WALK,
  529. " Tasks"
  530. " TASK_WALK_PATH 9999"
  531. " TASK_WAIT_FOR_MOVEMENT 0"
  532. " TASK_WAIT_PVS 0"
  533. ""
  534. " Interrupts"
  535. " COND_NEW_ENEMY"
  536. " COND_SEE_ENEMY" // in deference to scripted schedule where the enemy was slammed, thus no COND_NEW_ENEMY
  537. " COND_LIGHT_DAMAGE"
  538. " COND_HEAVY_DAMAGE"
  539. " COND_SMELL"
  540. " COND_PROVOKED"
  541. " COND_HEAR_COMBAT"
  542. " COND_HEAR_BULLET_IMPACT"
  543. );
  544. //===============================================
  545. // > NewWeapon
  546. //===============================================
  547. AI_DEFINE_SCHEDULE
  548. (
  549. SCHED_NEW_WEAPON,
  550. " Tasks"
  551. " TASK_STOP_MOVING 0"
  552. " TASK_SET_TOLERANCE_DISTANCE 5"
  553. " TASK_GET_PATH_TO_TARGET_WEAPON 0"
  554. // " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_NEW_WEAPON_CHEAT"
  555. " TASK_WEAPON_RUN_PATH 0"
  556. " TASK_STOP_MOVING 0"
  557. " TASK_FACE_TARGET 0"
  558. " TASK_WEAPON_PICKUP 0"
  559. " TASK_WAIT 1"// Don't move before done standing up
  560. ""
  561. " Interrupts"
  562. " COND_HEAR_DANGER"
  563. );
  564. //===============================================
  565. // Heavy-handed temporary fail case for SCHED_NEW_WEAPON
  566. // Just manufacture a weapon of the desired type.
  567. //===============================================
  568. AI_DEFINE_SCHEDULE
  569. (
  570. SCHED_NEW_WEAPON_CHEAT,
  571. " Tasks"
  572. " TASK_WEAPON_CREATE 0"
  573. ""
  574. " Interrupts"
  575. );
  576. //===============================================
  577. // > SCHED_SWITCH_TO_PENDING_WEAPON
  578. //===============================================
  579. AI_DEFINE_SCHEDULE
  580. (
  581. SCHED_SWITCH_TO_PENDING_WEAPON,
  582. " Tasks"
  583. " TASK_STOP_MOVING 0"
  584. " TASK_PLAY_SEQUENCE ACTIVITY:ACT_DROP_WEAPON"
  585. " TASK_CREATE_PENDING_WEAPON 0"
  586. ""
  587. " Interrupts"
  588. );
  589. //===============================================
  590. //===============================================
  591. AI_DEFINE_SCHEDULE
  592. (
  593. SCHED_GET_HEALTHKIT,
  594. " Tasks"
  595. " TASK_STOP_MOVING 0"
  596. " TASK_SET_TOLERANCE_DISTANCE 5"
  597. " TASK_GET_PATH_TO_TARGET_WEAPON 0"
  598. " TASK_ITEM_RUN_PATH 0"
  599. " TASK_STOP_MOVING 0"
  600. " TASK_FACE_TARGET 0"
  601. " TASK_ITEM_PICKUP 0"
  602. ""
  603. " Interrupts"
  604. );
  605. //===============================================
  606. // > RangeAttack1
  607. //===============================================
  608. AI_DEFINE_SCHEDULE
  609. (
  610. SCHED_RANGE_ATTACK1,
  611. " Tasks"
  612. " TASK_STOP_MOVING 0"
  613. " TASK_FACE_ENEMY 0"
  614. " TASK_ANNOUNCE_ATTACK 1" // 1 = primary attack
  615. " TASK_RANGE_ATTACK1 0"
  616. ""
  617. " Interrupts"
  618. " COND_NEW_ENEMY"
  619. " COND_ENEMY_DEAD"
  620. " COND_LIGHT_DAMAGE"
  621. " COND_HEAVY_DAMAGE"
  622. " COND_ENEMY_OCCLUDED"
  623. " COND_NO_PRIMARY_AMMO"
  624. " COND_HEAR_DANGER"
  625. " COND_WEAPON_BLOCKED_BY_FRIEND"
  626. " COND_WEAPON_SIGHT_OCCLUDED"
  627. );
  628. //===============================================
  629. // > RangeAttack2
  630. //===============================================
  631. AI_DEFINE_SCHEDULE
  632. (
  633. SCHED_RANGE_ATTACK2,
  634. " Tasks"
  635. " TASK_STOP_MOVING 0"
  636. " TASK_FACE_ENEMY 0"
  637. " TASK_ANNOUNCE_ATTACK 2" // 2 = secondary attack
  638. " TASK_RANGE_ATTACK2 0"
  639. ""
  640. " Interrupts"
  641. " COND_NEW_ENEMY"
  642. " COND_ENEMY_DEAD"
  643. " COND_LIGHT_DAMAGE"
  644. " COND_HEAVY_DAMAGE"
  645. " COND_ENEMY_OCCLUDED"
  646. " COND_NO_SECONDARY_AMMO"
  647. " COND_HEAR_DANGER"
  648. );
  649. //=========================================================
  650. // > Ambush - monster stands in place and waits for a new
  651. // enemy or chance to attack an existing enemy.
  652. //=========================================================
  653. AI_DEFINE_SCHEDULE
  654. (
  655. SCHED_AMBUSH,
  656. " Tasks"
  657. " TASK_STOP_MOVING 0"
  658. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  659. " TASK_WAIT_INDEFINITE 0"
  660. ""
  661. " Interrupts"
  662. " COND_NEW_ENEMY"
  663. " COND_LIGHT_DAMAGE"
  664. " COND_HEAVY_DAMAGE"
  665. " COND_PROVOKED"
  666. );
  667. //=========================================================
  668. // > Idle_Stand schedule - !!!BUGBUG - if this schedule doesn't
  669. // complete on its own the monster's HintNode will not be
  670. // cleared and the rest of the monster's group will avoid
  671. // that node because they think the group member that was
  672. // previously interrupted is still using that node to active
  673. // idle.
  674. ///=========================================================
  675. //AI_DEFINE_SCHEDULE
  676. // Idle_Stand
  677. //
  678. //Tasks
  679. // TASK_FIND_HINTNODE 0
  680. // TASK_GET_PATH_TO_HINTNODE 0
  681. // TASK_STORE_LASTPOSITION 0
  682. // TASK_WALK_PATH 0
  683. // TASK_WAIT_FOR_MOVEMENT 0
  684. // TASK_FACE_HINTNODE 0
  685. // TASK_PLAY_ACTIVE_IDLE 0
  686. // TASK_GET_PATH_TO_LASTPOSITION 0
  687. // TASK_WALK_PATH 0
  688. // TASK_WAIT_FOR_MOVEMENT 0
  689. // TASK_CLEAR_LASTPOSITION 0
  690. // TASK_CLEAR_HINTNODE 0
  691. //Interrupts
  692. // New_Enemy
  693. // Light_Damage
  694. // Heavy_Damage
  695. // Provoked
  696. // HEAR_COMBAT
  697. // HEAR_WORLD
  698. // HEAR_PLAYER
  699. // HEAR_DANGER
  700. // HEAR_BULLET_IMPACT
  701. //=========================================================
  702. // > WakeAngry
  703. //=========================================================
  704. AI_DEFINE_SCHEDULE
  705. (
  706. SCHED_WAKE_ANGRY,
  707. " Tasks"
  708. " TASK_STOP_MOVING 0"
  709. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE "
  710. " TASK_SOUND_WAKE 0"
  711. " TASK_FACE_IDEAL 0"
  712. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE "
  713. ""
  714. " Interrupts"
  715. );
  716. //=========================================================
  717. // > AlertFace
  718. //=========================================================
  719. AI_DEFINE_SCHEDULE
  720. (
  721. SCHED_ALERT_FACE,
  722. " Tasks"
  723. " TASK_STOP_MOVING 0"
  724. " TASK_FACE_IDEAL 0"
  725. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  726. ""
  727. " Interrupts"
  728. " COND_NEW_ENEMY"
  729. " COND_SEE_FEAR"
  730. " COND_LIGHT_DAMAGE"
  731. " COND_HEAVY_DAMAGE"
  732. " COND_PROVOKED"
  733. );
  734. //=========================================================
  735. // > AlertFace best sound
  736. //=========================================================
  737. AI_DEFINE_SCHEDULE
  738. (
  739. SCHED_ALERT_FACE_BESTSOUND,
  740. " Tasks"
  741. " TASK_STORE_BESTSOUND_REACTORIGIN_IN_SAVEPOSITION 0"
  742. " TASK_STOP_MOVING 0"
  743. " TASK_FACE_SAVEPOSITION 0"
  744. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  745. " TASK_WAIT 1.5"
  746. " TASK_FACE_REASONABLE 0"
  747. ""
  748. " Interrupts"
  749. " COND_NEW_ENEMY"
  750. " COND_SEE_FEAR"
  751. " COND_LIGHT_DAMAGE"
  752. " COND_HEAVY_DAMAGE"
  753. " COND_PROVOKED"
  754. );
  755. //=========================================================
  756. //=========================================================
  757. AI_DEFINE_SCHEDULE
  758. (
  759. SCHED_ALERT_REACT_TO_COMBAT_SOUND,
  760. " Tasks"
  761. " TASK_SET_SCHEDULE SCHEDULE:SCHED_ALERT_FACE_BESTSOUND"
  762. ""
  763. " Interrupts"
  764. );
  765. //=========================================================
  766. // > Alert_Scan
  767. //=========================================================
  768. AI_DEFINE_SCHEDULE
  769. (
  770. SCHED_ALERT_SCAN,
  771. " Tasks"
  772. " TASK_STOP_MOVING 0"
  773. " TASK_WAIT 0.5"
  774. " TASK_TURN_LEFT 180"
  775. " TASK_WAIT 0.5"
  776. " TASK_TURN_LEFT 180"
  777. ""
  778. " Interrupts"
  779. " COND_NEW_ENEMY"
  780. );
  781. //=========================================================
  782. // > AlertStand
  783. //=========================================================
  784. AI_DEFINE_SCHEDULE
  785. (
  786. SCHED_ALERT_STAND,
  787. " Tasks"
  788. " TASK_STOP_MOVING 0"
  789. " TASK_FACE_REASONABLE 0"
  790. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  791. " TASK_WAIT 20"
  792. " TASK_SUGGEST_STATE STATE:IDLE"
  793. ""
  794. " Interrupts"
  795. " COND_NEW_ENEMY"
  796. " COND_SEE_ENEMY"
  797. " COND_SEE_FEAR"
  798. " COND_LIGHT_DAMAGE"
  799. " COND_HEAVY_DAMAGE"
  800. " COND_PROVOKED"
  801. " COND_SMELL"
  802. " COND_HEAR_COMBAT" // sound flags
  803. " COND_HEAR_WORLD"
  804. " COND_HEAR_PLAYER"
  805. " COND_HEAR_DANGER"
  806. " COND_HEAR_BULLET_IMPACT"
  807. " COND_IDLE_INTERRUPT"
  808. " COND_GIVE_WAY"
  809. );
  810. //=========================================================
  811. // > AlertWAlk
  812. //=========================================================
  813. AI_DEFINE_SCHEDULE
  814. (
  815. SCHED_ALERT_WALK,
  816. " Tasks"
  817. " TASK_WALK_PATH 0"
  818. " TASK_WAIT_FOR_MOVEMENT 0"
  819. " TASK_WAIT_PVS 0"
  820. ""
  821. " Interrupts"
  822. " COND_NEW_ENEMY"
  823. " COND_SEE_ENEMY"
  824. " COND_SEE_FEAR"
  825. " COND_ENEMY_DEAD"
  826. " COND_LIGHT_DAMAGE"
  827. " COND_HEAVY_DAMAGE"
  828. " COND_HEAR_DANGER"
  829. " COND_CAN_RANGE_ATTACK1"
  830. " COND_CAN_RANGE_ATTACK2"
  831. " COND_CAN_MELEE_ATTACK1"
  832. " COND_CAN_MELEE_ATTACK2"
  833. );
  834. //=========================================================
  835. // > InvestigateSound
  836. //
  837. // sends a monster to the location of the
  838. // sound that was just heard to check things out.
  839. //=========================================================
  840. AI_DEFINE_SCHEDULE
  841. (
  842. SCHED_INVESTIGATE_SOUND,
  843. " Tasks"
  844. " TASK_STOP_MOVING 0"
  845. " TASK_STORE_LASTPOSITION 0"
  846. // " TASK_SET_TOLERANCE_DISTANCE 32"
  847. " TASK_GET_PATH_TO_BESTSOUND 0"
  848. " TASK_FACE_IDEAL 0"
  849. " TASK_RUN_PATH 0"
  850. " TASK_WAIT_FOR_MOVEMENT 0"
  851. " TASK_STOP_MOVING 0"
  852. " TASK_WAIT 5"
  853. " TASK_GET_PATH_TO_LASTPOSITION 0"
  854. " TASK_WALK_PATH 0"
  855. " TASK_WAIT_FOR_MOVEMENT 0"
  856. " TASK_STOP_MOVING 0"
  857. " TASK_CLEAR_LASTPOSITION 0"
  858. " TASK_FACE_REASONABLE 0"
  859. ""
  860. " Interrupts"
  861. " COND_NEW_ENEMY"
  862. " COND_SEE_FEAR"
  863. " COND_SEE_ENEMY"
  864. " COND_LIGHT_DAMAGE"
  865. " COND_HEAVY_DAMAGE"
  866. " COND_HEAR_DANGER"
  867. );
  868. //=========================================================
  869. // > CombatStand
  870. //=========================================================
  871. AI_DEFINE_SCHEDULE
  872. (
  873. SCHED_COMBAT_STAND,
  874. " Tasks"
  875. " TASK_STOP_MOVING 0"
  876. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  877. " TASK_WAIT_INDEFINITE 0"
  878. ""
  879. " Interrupts"
  880. " COND_NEW_ENEMY"
  881. " COND_ENEMY_DEAD"
  882. " COND_LIGHT_DAMAGE"
  883. " COND_HEAVY_DAMAGE"
  884. " COND_SEE_ENEMY"
  885. " COND_CAN_RANGE_ATTACK1"
  886. " COND_CAN_RANGE_ATTACK2"
  887. " COND_CAN_MELEE_ATTACK1"
  888. " COND_CAN_MELEE_ATTACK2"
  889. " COND_IDLE_INTERRUPT"
  890. );
  891. //=========================================================
  892. // > CombatWAlk
  893. //=========================================================
  894. AI_DEFINE_SCHEDULE
  895. (
  896. SCHED_COMBAT_WALK,
  897. " Tasks"
  898. " TASK_WALK_PATH 0"
  899. " TASK_WAIT_FOR_MOVEMENT 0"
  900. " TASK_WAIT_PVS 0"
  901. ""
  902. " Interrupts"
  903. " COND_NEW_ENEMY"
  904. " COND_ENEMY_DEAD"
  905. " COND_LIGHT_DAMAGE"
  906. " COND_HEAVY_DAMAGE"
  907. " COND_HEAR_DANGER"
  908. " COND_CAN_RANGE_ATTACK1"
  909. " COND_CAN_RANGE_ATTACK2"
  910. " COND_CAN_MELEE_ATTACK1"
  911. " COND_CAN_MELEE_ATTACK2"
  912. );
  913. //=========================================================
  914. // > CombatFace
  915. //=========================================================
  916. AI_DEFINE_SCHEDULE
  917. (
  918. SCHED_COMBAT_FACE,
  919. " Tasks"
  920. " TASK_STOP_MOVING 0"
  921. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  922. " TASK_FACE_ENEMY 0"
  923. ""
  924. " Interrupts"
  925. " COND_CAN_RANGE_ATTACK1"
  926. " COND_CAN_RANGE_ATTACK2"
  927. " COND_CAN_MELEE_ATTACK1"
  928. " COND_CAN_MELEE_ATTACK2"
  929. " COND_NEW_ENEMY"
  930. " COND_ENEMY_DEAD"
  931. );
  932. //=========================================================
  933. // COMBAT_SWEEP
  934. //
  935. // Do a small sweep of the area
  936. //=========================================================
  937. AI_DEFINE_SCHEDULE
  938. (
  939. SCHED_COMBAT_SWEEP,
  940. " Tasks"
  941. " TASK_TURN_LEFT 45"
  942. " TASK_WAIT 2"
  943. " TASK_TURN_RIGHT 45"
  944. " TASK_WAIT 2"
  945. ""
  946. " Interrupts"
  947. " COND_NEW_ENEMY"
  948. " COND_SEE_ENEMY"
  949. " COND_LIGHT_DAMAGE"
  950. " COND_HEAVY_DAMAGE"
  951. " COND_CAN_RANGE_ATTACK1"
  952. " COND_CAN_RANGE_ATTACK2"
  953. " COND_HEAR_DANGER"
  954. " COND_HEAR_WORLD"
  955. );
  956. //=========================================================
  957. // > Standoff
  958. //
  959. // Used in combat when a monster is
  960. // hiding in cover or the enemy has moved out of sight.
  961. // Should we look around in this schedule?
  962. //=========================================================
  963. AI_DEFINE_SCHEDULE
  964. (
  965. SCHED_STANDOFF,
  966. " Tasks"
  967. " TASK_STOP_MOVING 0"
  968. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" // Translated to cover
  969. " TASK_WAIT_FACE_ENEMY 2"
  970. ""
  971. " Interrupts"
  972. " COND_CAN_RANGE_ATTACK1"
  973. " COND_CAN_RANGE_ATTACK2"
  974. " COND_CAN_MELEE_ATTACK1"
  975. " COND_CAN_MELEE_ATTACK2"
  976. " COND_ENEMY_DEAD"
  977. " COND_NEW_ENEMY"
  978. " COND_HEAR_DANGER"
  979. );
  980. //=========================================================
  981. // > Arm weapon (draw gun)
  982. //=========================================================
  983. AI_DEFINE_SCHEDULE
  984. (
  985. SCHED_ARM_WEAPON,
  986. " Tasks"
  987. " TASK_STOP_MOVING 0"
  988. " TASK_FACE_IDEAL 0"
  989. " TASK_PLAY_SEQUENCE ACTIVITY:ACT_ARM"
  990. ""
  991. " Interrupts"
  992. );
  993. //=========================================================
  994. // > Disarm weapon (holster gun)
  995. //=========================================================
  996. AI_DEFINE_SCHEDULE
  997. (
  998. SCHED_DISARM_WEAPON,
  999. " Tasks"
  1000. " TASK_STOP_MOVING 0"
  1001. " TASK_FACE_IDEAL 0"
  1002. " TASK_PLAY_SEQUENCE ACTIVITY:ACT_DISARM"
  1003. ""
  1004. " Interrupts"
  1005. );
  1006. //=========================================================
  1007. // SCHED_HIDE_AND_RELOAD
  1008. //=========================================================
  1009. AI_DEFINE_SCHEDULE
  1010. (
  1011. SCHED_HIDE_AND_RELOAD,
  1012. " Tasks"
  1013. " TASK_STOP_MOVING 0"
  1014. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_RELOAD"
  1015. " TASK_FIND_COVER_FROM_ENEMY 0"
  1016. " TASK_RUN_PATH 0"
  1017. " TASK_WAIT_FOR_MOVEMENT 0"
  1018. " TASK_REMEMBER MEMORY:INCOVER"
  1019. " TASK_FACE_ENEMY 0"
  1020. " TASK_SET_SCHEDULE SCHEDULE:SCHED_RELOAD"
  1021. ""
  1022. " Interrupts"
  1023. " COND_HEAR_DANGER"
  1024. );
  1025. //=========================================================
  1026. // > Reload
  1027. //=========================================================
  1028. AI_DEFINE_SCHEDULE
  1029. (
  1030. SCHED_RELOAD,
  1031. " Tasks"
  1032. " TASK_STOP_MOVING 0"
  1033. " TASK_RELOAD 0"
  1034. ""
  1035. " Interrupts"
  1036. " COND_HEAR_DANGER"
  1037. );
  1038. //=========================================================
  1039. // > Melee_Attack1
  1040. //=========================================================
  1041. AI_DEFINE_SCHEDULE
  1042. (
  1043. SCHED_MELEE_ATTACK1,
  1044. " Tasks"
  1045. " TASK_STOP_MOVING 0"
  1046. " TASK_FACE_ENEMY 0"
  1047. " TASK_ANNOUNCE_ATTACK 1" // 1 = primary attack
  1048. " TASK_MELEE_ATTACK1 0"
  1049. ""
  1050. " Interrupts"
  1051. " COND_NEW_ENEMY"
  1052. " COND_ENEMY_DEAD"
  1053. " COND_LIGHT_DAMAGE"
  1054. " COND_HEAVY_DAMAGE"
  1055. " COND_ENEMY_OCCLUDED"
  1056. );
  1057. //=========================================================
  1058. // > Melee_Attack2
  1059. //=========================================================
  1060. AI_DEFINE_SCHEDULE
  1061. (
  1062. SCHED_MELEE_ATTACK2,
  1063. " Tasks"
  1064. " TASK_STOP_MOVING 0"
  1065. " TASK_FACE_ENEMY 0"
  1066. " TASK_ANNOUNCE_ATTACK 2" // 2 = secondary attack
  1067. " TASK_MELEE_ATTACK2 0"
  1068. ""
  1069. " Interrupts"
  1070. " COND_NEW_ENEMY"
  1071. " COND_ENEMY_DEAD"
  1072. " COND_LIGHT_DAMAGE"
  1073. " COND_HEAVY_DAMAGE"
  1074. " COND_ENEMY_OCCLUDED"
  1075. );
  1076. //=========================================================
  1077. // > SpecialAttack1
  1078. //=========================================================
  1079. AI_DEFINE_SCHEDULE
  1080. (
  1081. SCHED_SPECIAL_ATTACK1,
  1082. " Tasks"
  1083. " TASK_STOP_MOVING 0"
  1084. " TASK_FACE_ENEMY 0"
  1085. " TASK_SPECIAL_ATTACK1 0"
  1086. ""
  1087. " Interrupts"
  1088. " COND_NEW_ENEMY"
  1089. " COND_ENEMY_DEAD"
  1090. " COND_LIGHT_DAMAGE"
  1091. " COND_HEAVY_DAMAGE"
  1092. " COND_ENEMY_OCCLUDED"
  1093. " COND_NO_PRIMARY_AMMO"
  1094. " COND_HEAR_DANGER"
  1095. );
  1096. //=========================================================
  1097. // > SpecialAttack2
  1098. //=========================================================
  1099. AI_DEFINE_SCHEDULE
  1100. (
  1101. SCHED_SPECIAL_ATTACK2,
  1102. " Tasks"
  1103. " TASK_STOP_MOVING 0"
  1104. " TASK_FACE_ENEMY 0"
  1105. " TASK_SPECIAL_ATTACK2 0"
  1106. ""
  1107. " Interrupts"
  1108. " COND_NEW_ENEMY"
  1109. " COND_ENEMY_DEAD"
  1110. " COND_LIGHT_DAMAGE"
  1111. " COND_HEAVY_DAMAGE"
  1112. " COND_ENEMY_OCCLUDED"
  1113. " COND_NO_SECONDARY_AMMO"
  1114. " COND_HEAR_DANGER"
  1115. );
  1116. //=========================================================
  1117. // > ChaseEnemy
  1118. //=========================================================
  1119. AI_DEFINE_SCHEDULE
  1120. (
  1121. SCHED_CHASE_ENEMY,
  1122. " Tasks"
  1123. " TASK_STOP_MOVING 0"
  1124. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_CHASE_ENEMY_FAILED"
  1125. // " TASK_SET_TOLERANCE_DISTANCE 24"
  1126. " TASK_GET_CHASE_PATH_TO_ENEMY 300"
  1127. " TASK_RUN_PATH 0"
  1128. " TASK_WAIT_FOR_MOVEMENT 0"
  1129. " TASK_FACE_ENEMY 0"
  1130. ""
  1131. " Interrupts"
  1132. " COND_NEW_ENEMY"
  1133. " COND_ENEMY_DEAD"
  1134. " COND_ENEMY_UNREACHABLE"
  1135. " COND_CAN_RANGE_ATTACK1"
  1136. " COND_CAN_MELEE_ATTACK1"
  1137. " COND_CAN_RANGE_ATTACK2"
  1138. " COND_CAN_MELEE_ATTACK2"
  1139. " COND_TOO_CLOSE_TO_ATTACK"
  1140. " COND_TASK_FAILED"
  1141. " COND_LOST_ENEMY"
  1142. " COND_BETTER_WEAPON_AVAILABLE"
  1143. " COND_HEAR_DANGER"
  1144. );
  1145. //=========================================================
  1146. // > CombatFace
  1147. //=========================================================
  1148. AI_DEFINE_SCHEDULE
  1149. (
  1150. SCHED_TARGET_FACE,
  1151. " Tasks"
  1152. " TASK_STOP_MOVING 0"
  1153. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  1154. " TASK_FACE_TARGET 0"
  1155. ""
  1156. " Interrupts"
  1157. " COND_CAN_RANGE_ATTACK1"
  1158. " COND_CAN_RANGE_ATTACK2"
  1159. " COND_CAN_MELEE_ATTACK1"
  1160. " COND_CAN_MELEE_ATTACK2"
  1161. " COND_NEW_ENEMY"
  1162. " COND_ENEMY_DEAD"
  1163. );
  1164. //=========================================================
  1165. // > ChaseEnemy
  1166. //=========================================================
  1167. AI_DEFINE_SCHEDULE
  1168. (
  1169. SCHED_TARGET_CHASE,
  1170. " Tasks"
  1171. " TASK_STOP_MOVING 0"
  1172. // " TASK_SET_TOLERANCE_DISTANCE 24"
  1173. " TASK_GET_PATH_TO_TARGET 0"
  1174. " TASK_RUN_PATH 0"
  1175. " TASK_WAIT_FOR_MOVEMENT 0"
  1176. ""
  1177. " Interrupts"
  1178. " COND_NEW_ENEMY"
  1179. " COND_ENEMY_DEAD"
  1180. " COND_ENEMY_UNREACHABLE"
  1181. " COND_CAN_RANGE_ATTACK1"
  1182. " COND_CAN_MELEE_ATTACK1"
  1183. " COND_CAN_RANGE_ATTACK2"
  1184. " COND_CAN_MELEE_ATTACK2"
  1185. " COND_TOO_CLOSE_TO_ATTACK"
  1186. " COND_TASK_FAILED"
  1187. " COND_LOST_ENEMY"
  1188. " COND_BETTER_WEAPON_AVAILABLE"
  1189. " COND_HEAR_DANGER"
  1190. );
  1191. //=========================================================
  1192. // > ChaseEnemyFailed
  1193. //=========================================================
  1194. AI_DEFINE_SCHEDULE
  1195. (
  1196. SCHED_CHASE_ENEMY_FAILED,
  1197. " Tasks"
  1198. " TASK_STOP_MOVING 0"
  1199. " TASK_WAIT 0.2"
  1200. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_STANDOFF"
  1201. // " TASK_SET_TOLERANCE_DISTANCE 24"
  1202. " TASK_FIND_COVER_FROM_ENEMY 0"
  1203. " TASK_RUN_PATH 0"
  1204. " TASK_WAIT_FOR_MOVEMENT 0"
  1205. " TASK_REMEMBER MEMORY:INCOVER"
  1206. " TASK_FACE_ENEMY 0"
  1207. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" // Translated to cover
  1208. " TASK_WAIT 1"
  1209. ""
  1210. " Interrupts"
  1211. " COND_NEW_ENEMY"
  1212. " COND_ENEMY_DEAD"
  1213. " COND_CAN_RANGE_ATTACK1"
  1214. " COND_CAN_MELEE_ATTACK1"
  1215. " COND_CAN_RANGE_ATTACK2"
  1216. " COND_CAN_MELEE_ATTACK2"
  1217. " COND_HEAR_DANGER"
  1218. " COND_BETTER_WEAPON_AVAILABLE"
  1219. " COND_LIGHT_DAMAGE"
  1220. " COND_HEAVY_DAMAGE"
  1221. );
  1222. //=========================================================
  1223. // > SCHED_BACK_AWAY_FROM_SAVE_POSITION
  1224. //=========================================================
  1225. AI_DEFINE_SCHEDULE
  1226. (
  1227. SCHED_BACK_AWAY_FROM_SAVE_POSITION,
  1228. " Tasks"
  1229. " TASK_STOP_MOVING 0"
  1230. // " TASK_SET_TOLERANCE_DISTANCE 24"
  1231. " TASK_FIND_BACKAWAY_FROM_SAVEPOSITION 0"
  1232. " TASK_RUN_PATH 0"
  1233. " TASK_WAIT_FOR_MOVEMENT 0"
  1234. ""
  1235. " Interrupts"
  1236. );
  1237. //=========================================================
  1238. // > BackAwayFromEnemy
  1239. //=========================================================
  1240. AI_DEFINE_SCHEDULE
  1241. (
  1242. SCHED_BACK_AWAY_FROM_ENEMY,
  1243. " Tasks"
  1244. // If I can't back away from the enemy try to get behind him
  1245. " TASK_STOP_MOVING 0"
  1246. // " TASK_SET_TOLERANCE_DISTANCE 24"
  1247. " TASK_STORE_ENEMY_POSITION_IN_SAVEPOSITION 0"
  1248. " TASK_FIND_BACKAWAY_FROM_SAVEPOSITION 0"
  1249. " TASK_RUN_PATH 0"
  1250. " TASK_WAIT_FOR_MOVEMENT 0"
  1251. ""
  1252. " Interrupts"
  1253. " COND_NEW_ENEMY"
  1254. " COND_CAN_RANGE_ATTACK1"
  1255. " COND_CAN_RANGE_ATTACK2"
  1256. " COND_CAN_MELEE_ATTACK1"
  1257. " COND_CAN_MELEE_ATTACK2"
  1258. );
  1259. //=========================================================
  1260. // > SmallFlinch
  1261. // played when heavy damage is taken recently after taking damage
  1262. //=========================================================
  1263. AI_DEFINE_SCHEDULE
  1264. (
  1265. SCHED_SMALL_FLINCH,
  1266. " Tasks"
  1267. " TASK_REMEMBER MEMORY:FLINCHED "
  1268. " TASK_STOP_MOVING 0"
  1269. " TASK_SMALL_FLINCH 0"
  1270. ""
  1271. " Interrupts"
  1272. );
  1273. //=========================================================
  1274. // > BigFlinch
  1275. // played when heavy damage is taken for the first time in a while
  1276. //=========================================================
  1277. AI_DEFINE_SCHEDULE
  1278. (
  1279. SCHED_BIG_FLINCH,
  1280. " Tasks"
  1281. " TASK_REMEMBER MEMORY:FLINCHED "
  1282. " TASK_STOP_MOVING 0"
  1283. " TASK_BIG_FLINCH 0"
  1284. ""
  1285. " Interrupts"
  1286. );
  1287. //=========================================================
  1288. // > Freeze
  1289. //
  1290. //=========================================================
  1291. AI_DEFINE_SCHEDULE
  1292. (
  1293. SCHED_NPC_FREEZE,
  1294. " Tasks"
  1295. " TASK_FREEZE 0"
  1296. " Interrupts"
  1297. " COND_NPC_UNFREEZE"
  1298. );
  1299. //=========================================================
  1300. // > Die
  1301. //=========================================================
  1302. AI_DEFINE_SCHEDULE
  1303. (
  1304. SCHED_DIE,
  1305. " Tasks"
  1306. " TASK_STOP_MOVING 0 "
  1307. " TASK_SOUND_DIE 0 "
  1308. " TASK_DIE 0 "
  1309. ""
  1310. " Interrupts"
  1311. " COND_NO_CUSTOM_INTERRUPTS"
  1312. );
  1313. //=========================================================
  1314. // > Die
  1315. //=========================================================
  1316. AI_DEFINE_SCHEDULE
  1317. (
  1318. SCHED_DIE_RAGDOLL,
  1319. " Tasks"
  1320. " TASK_STOP_MOVING 0 "
  1321. " TASK_SOUND_DIE 0 "
  1322. ""
  1323. " Interrupts"
  1324. " COND_NO_CUSTOM_INTERRUPTS"
  1325. );
  1326. //=========================================================
  1327. // > VictoryDance
  1328. //=========================================================
  1329. AI_DEFINE_SCHEDULE
  1330. (
  1331. SCHED_VICTORY_DANCE,
  1332. " Tasks"
  1333. " TASK_STOP_MOVING 0"
  1334. " TASK_PLAY_SEQUENCE ACTIVITY:ACT_VICTORY_DANCE"
  1335. " TASK_WAIT 0"
  1336. ""
  1337. " Interrupts"
  1338. );
  1339. //=========================================================
  1340. // > Error
  1341. //=========================================================
  1342. //AI_DEFINE_SCHEDULE
  1343. // Error
  1344. //
  1345. //Tasks
  1346. // TASK_STOP_MOVING 0
  1347. // TASK_WAIT_INDEFINITE 0
  1348. //
  1349. //Interrupts
  1350. //=========================================================
  1351. // > ScriptedWalk
  1352. //=========================================================
  1353. AI_DEFINE_SCHEDULE
  1354. (
  1355. SCHED_SCRIPTED_WALK,
  1356. " Tasks"
  1357. " TASK_PRE_SCRIPT 0"
  1358. " TASK_SET_TOLERANCE_DISTANCE 2"
  1359. " TASK_PUSH_SCRIPT_ARRIVAL_ACTIVITY 0"
  1360. " TASK_SCRIPT_WALK_TO_TARGET 0"
  1361. " TASK_WAIT_FOR_MOVEMENT 0"
  1362. " TASK_PLANT_ON_SCRIPT 0"
  1363. " TASK_FACE_SCRIPT 0"
  1364. " TASK_ENABLE_SCRIPT 0"
  1365. " TASK_WAIT_FOR_SCRIPT 0"
  1366. " TASK_PLAY_SCRIPT 0"
  1367. " TASK_PLAY_SCRIPT_POST_IDLE 0"
  1368. ""
  1369. " Interrupts"
  1370. " COND_LIGHT_DAMAGE "
  1371. " COND_HEAVY_DAMAGE"
  1372. );
  1373. //=========================================================
  1374. // > ScriptedRun
  1375. //=========================================================
  1376. AI_DEFINE_SCHEDULE
  1377. (
  1378. SCHED_SCRIPTED_RUN,
  1379. " Tasks"
  1380. " TASK_PRE_SCRIPT 0"
  1381. " TASK_SET_TOLERANCE_DISTANCE 2"
  1382. " TASK_PUSH_SCRIPT_ARRIVAL_ACTIVITY 0"
  1383. " TASK_SCRIPT_RUN_TO_TARGET 0"
  1384. " TASK_WAIT_FOR_MOVEMENT 0"
  1385. " TASK_PLANT_ON_SCRIPT 0"
  1386. " TASK_FACE_SCRIPT 0"
  1387. " TASK_ENABLE_SCRIPT 0"
  1388. " TASK_WAIT_FOR_SCRIPT 0"
  1389. " TASK_PLAY_SCRIPT 0"
  1390. " TASK_PLAY_SCRIPT_POST_IDLE 0"
  1391. ""
  1392. " Interrupts"
  1393. " COND_LIGHT_DAMAGE "
  1394. " COND_HEAVY_DAMAGE"
  1395. );
  1396. //=========================================================
  1397. // > ScriptedMoveCustom
  1398. //=========================================================
  1399. AI_DEFINE_SCHEDULE
  1400. (
  1401. SCHED_SCRIPTED_CUSTOM_MOVE,
  1402. " Tasks"
  1403. " TASK_PRE_SCRIPT 0"
  1404. " TASK_SET_TOLERANCE_DISTANCE 2"
  1405. " TASK_PUSH_SCRIPT_ARRIVAL_ACTIVITY 0"
  1406. " TASK_SCRIPT_CUSTOM_MOVE_TO_TARGET 0"
  1407. " TASK_WAIT_FOR_MOVEMENT 0"
  1408. " TASK_PLANT_ON_SCRIPT 0"
  1409. " TASK_FACE_SCRIPT 0"
  1410. " TASK_ENABLE_SCRIPT 0"
  1411. " TASK_WAIT_FOR_SCRIPT 0"
  1412. " TASK_PLAY_SCRIPT 0"
  1413. " TASK_PLAY_SCRIPT_POST_IDLE 0"
  1414. ""
  1415. " Interrupts"
  1416. " COND_LIGHT_DAMAGE "
  1417. " COND_HEAVY_DAMAGE"
  1418. );
  1419. //=========================================================
  1420. // > ScriptedWait
  1421. //=========================================================
  1422. AI_DEFINE_SCHEDULE
  1423. (
  1424. SCHED_SCRIPTED_WAIT,
  1425. " Tasks"
  1426. " TASK_PRE_SCRIPT 0"
  1427. " TASK_STOP_MOVING 0"
  1428. " TASK_ENABLE_SCRIPT 0"
  1429. " TASK_WAIT_FOR_SCRIPT 0"
  1430. " TASK_PLAY_SCRIPT 0"
  1431. " TASK_PLAY_SCRIPT_POST_IDLE 0"
  1432. ""
  1433. " Interrupts"
  1434. " COND_LIGHT_DAMAGE "
  1435. " COND_HEAVY_DAMAGE"
  1436. );
  1437. //=========================================================
  1438. // > ScriptedFace
  1439. //=========================================================
  1440. AI_DEFINE_SCHEDULE
  1441. (
  1442. SCHED_SCRIPTED_FACE,
  1443. " Tasks"
  1444. " TASK_PRE_SCRIPT 0"
  1445. " TASK_STOP_MOVING 0"
  1446. " TASK_FACE_SCRIPT 0"
  1447. " TASK_ENABLE_SCRIPT 0"
  1448. " TASK_WAIT_FOR_SCRIPT 0"
  1449. " TASK_PLAY_SCRIPT 0"
  1450. " TASK_PLAY_SCRIPT_POST_IDLE 0"
  1451. ""
  1452. " Interrupts"
  1453. " COND_LIGHT_DAMAGE "
  1454. " COND_HEAVY_DAMAGE"
  1455. );
  1456. //=========================================================
  1457. // > SCENE_FACE_TARGET
  1458. //=========================================================
  1459. AI_DEFINE_SCHEDULE
  1460. (
  1461. SCHED_SCENE_GENERIC,
  1462. " Tasks"
  1463. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_SCENE_GENERIC"
  1464. " TASK_STOP_MOVING 0"
  1465. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  1466. " TASK_PLAY_SCENE 0"
  1467. " TASK_WAIT_FOR_MOVEMENT 0"
  1468. " TASK_STOP_MOVING 0"
  1469. " TASK_SET_SCHEDULE SCHEDULE:SCHED_SCENE_GENERIC"
  1470. ""
  1471. " Interrupts"
  1472. );
  1473. //=========================================================
  1474. // > Cower
  1475. //
  1476. // This is what is usually done when attempts
  1477. // to escape danger fail.
  1478. //=========================================================
  1479. AI_DEFINE_SCHEDULE
  1480. (
  1481. SCHED_COWER,
  1482. " Tasks"
  1483. " TASK_STOP_MOVING 0"
  1484. " TASK_PLAY_SEQUENCE ACTIVITY:ACT_COWER"
  1485. " TASK_WAIT_UNTIL_NO_DANGER_SOUND 0"
  1486. ""
  1487. " Interrupts"
  1488. );
  1489. //=========================================================
  1490. // > TakeCoverFromOrigin
  1491. //
  1492. // move away from where you're currently standing.
  1493. //=========================================================
  1494. AI_DEFINE_SCHEDULE
  1495. (
  1496. SCHED_TAKE_COVER_FROM_ORIGIN,
  1497. " Tasks"
  1498. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_FAIL_TAKE_COVER"
  1499. " TASK_STOP_MOVING 0"
  1500. // " TASK_SET_TOLERANCE_DISTANCE 24"
  1501. " TASK_FIND_COVER_FROM_ORIGIN 0"
  1502. " TASK_RUN_PATH 0"
  1503. " TASK_WAIT_FOR_MOVEMENT 0"
  1504. " TASK_REMEMBER MEMORY:INCOVER"
  1505. " TASK_TURN_LEFT 179"
  1506. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" // Translated to cover
  1507. ""
  1508. " Interrupts"
  1509. " COND_NEW_ENEMY"
  1510. );
  1511. //=========================================================
  1512. // > TakeCoverFromBestSound
  1513. //
  1514. // hide from the loudest sound source
  1515. //=========================================================
  1516. AI_DEFINE_SCHEDULE
  1517. (
  1518. SCHED_TAKE_COVER_FROM_BEST_SOUND,
  1519. " Tasks"
  1520. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_FLEE_FROM_BEST_SOUND"
  1521. " TASK_STOP_MOVING 0"
  1522. " TASK_STORE_BESTSOUND_REACTORIGIN_IN_SAVEPOSITION 0"
  1523. " TASK_FIND_COVER_FROM_BEST_SOUND 0"
  1524. " TASK_RUN_PATH 0"
  1525. " TASK_WAIT_FOR_MOVEMENT 0"
  1526. " TASK_REMEMBER MEMORY:INCOVER"
  1527. " TASK_FACE_SAVEPOSITION 0"
  1528. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" // Translated to cover
  1529. ""
  1530. " Interrupts"
  1531. " COND_NEW_ENEMY"
  1532. );
  1533. //=========================================================
  1534. //
  1535. //=========================================================
  1536. AI_DEFINE_SCHEDULE
  1537. (
  1538. SCHED_FLEE_FROM_BEST_SOUND,
  1539. " Tasks"
  1540. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_COWER"
  1541. " TASK_STORE_BESTSOUND_REACTORIGIN_IN_SAVEPOSITION 0"
  1542. " TASK_GET_PATH_AWAY_FROM_BEST_SOUND 600"
  1543. " TASK_RUN_PATH_FLEE 100"
  1544. " TASK_STOP_MOVING 0"
  1545. " TASK_FACE_SAVEPOSITION 0"
  1546. ""
  1547. " Interrupts"
  1548. " COND_NEW_ENEMY"
  1549. );
  1550. //=========================================================
  1551. // > TakeCoverFromEnemy
  1552. //
  1553. // Take cover from enemy!
  1554. //=========================================================
  1555. AI_DEFINE_SCHEDULE
  1556. (
  1557. SCHED_TAKE_COVER_FROM_ENEMY,
  1558. " Tasks"
  1559. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_FAIL_TAKE_COVER"
  1560. " TASK_STOP_MOVING 0"
  1561. " TASK_WAIT 0.2"
  1562. // " TASK_SET_TOLERANCE_DISTANCE 24"
  1563. " TASK_FIND_COVER_FROM_ENEMY 0"
  1564. " TASK_RUN_PATH 0"
  1565. " TASK_WAIT_FOR_MOVEMENT 0"
  1566. " TASK_REMEMBER MEMORY:INCOVER"
  1567. " TASK_FACE_ENEMY 0"
  1568. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE" // Translated to cover
  1569. " TASK_WAIT 1"
  1570. ""
  1571. " Interrupts"
  1572. " COND_NEW_ENEMY"
  1573. " COND_HEAR_DANGER"
  1574. );
  1575. //=========================================================
  1576. // FAIL_TAKE_COVER
  1577. //
  1578. // Default case. Overridden by subclasses for behavior
  1579. //=========================================================
  1580. AI_DEFINE_SCHEDULE
  1581. (
  1582. SCHED_FAIL_TAKE_COVER,
  1583. " Tasks "
  1584. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  1585. ""
  1586. " Interrupts"
  1587. " COND_NEW_ENEMY"
  1588. );
  1589. //=========================================================
  1590. // > RunFromEnemy
  1591. //
  1592. // Run to cover, but don't turn to face enemy and upon
  1593. // fail run around randomly
  1594. //=========================================================
  1595. AI_DEFINE_SCHEDULE
  1596. (
  1597. SCHED_RUN_FROM_ENEMY,
  1598. " Tasks"
  1599. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_RUN_FROM_ENEMY_FALLBACK"
  1600. " TASK_STOP_MOVING 0"
  1601. " TASK_FIND_COVER_FROM_ENEMY 0"
  1602. " TASK_RUN_PATH 0"
  1603. " TASK_WAIT_FOR_MOVEMENT 0"
  1604. ""
  1605. " Interrupts"
  1606. " COND_NEW_ENEMY"
  1607. " COND_ENEMY_DEAD"
  1608. );
  1609. AI_DEFINE_SCHEDULE
  1610. (
  1611. SCHED_RUN_FROM_ENEMY_FALLBACK,
  1612. " Tasks"
  1613. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_RUN_RANDOM"
  1614. " TASK_STOP_MOVING 0"
  1615. " TASK_STORE_ENEMY_POSITION_IN_SAVEPOSITION 0"
  1616. " TASK_FIND_BACKAWAY_FROM_SAVEPOSITION 0"
  1617. " TASK_RUN_PATH 0"
  1618. " TASK_WAIT_FOR_MOVEMENT 0"
  1619. ""
  1620. " Interrupts"
  1621. " COND_NEW_ENEMY"
  1622. " COND_ENEMY_DEAD"
  1623. );
  1624. AI_DEFINE_SCHEDULE
  1625. (
  1626. SCHED_RUN_FROM_ENEMY_MOB,
  1627. " Tasks"
  1628. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_RUN_RANDOM"
  1629. " TASK_STOP_MOVING 0"
  1630. " TASK_STORE_ENEMY_POSITION_IN_SAVEPOSITION 0"
  1631. " TASK_FIND_BACKAWAY_FROM_SAVEPOSITION 0"
  1632. " TASK_RUN_PATH 0"
  1633. " TASK_WAIT_FOR_MOVEMENT 0"
  1634. ""
  1635. " Interrupts"
  1636. " COND_HEAR_DANGER"
  1637. );
  1638. //=========================================================
  1639. // > Fear_Face
  1640. //
  1641. // Face an enemy that I'm scared of, until I see it. Used
  1642. // after I run to cover from a feared enemy
  1643. // UNDONE: Add a special ACT_IDLE_FEAR
  1644. //=========================================================
  1645. AI_DEFINE_SCHEDULE
  1646. (
  1647. SCHED_FEAR_FACE,
  1648. " Tasks"
  1649. " TASK_STOP_MOVING 0"
  1650. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  1651. " TASK_FACE_ENEMY 0"
  1652. ""
  1653. " Interrupts"
  1654. " COND_NEW_ENEMY"
  1655. " COND_ENEMY_DEAD"
  1656. " COND_SEE_ENEMY"
  1657. );
  1658. //=========================================================
  1659. // > Forced_Go (Used for debug only)
  1660. //=========================================================
  1661. AI_DEFINE_SCHEDULE
  1662. (
  1663. SCHED_FORCED_GO,
  1664. " Tasks"
  1665. " TASK_SET_TOLERANCE_DISTANCE 48"
  1666. " TASK_SET_ROUTE_SEARCH_TIME 3" // Spend 3 seconds trying to build a path if stuck
  1667. " TASK_GET_PATH_TO_LASTPOSITION 0"
  1668. " TASK_WALK_PATH 0"
  1669. " TASK_WAIT_FOR_MOVEMENT 0"
  1670. ""
  1671. " Interrupts"
  1672. );
  1673. //=========================================================
  1674. // > Forced_Go (Used for debug only)
  1675. //=========================================================
  1676. AI_DEFINE_SCHEDULE
  1677. (
  1678. SCHED_FORCED_GO_RUN,
  1679. " Tasks"
  1680. " TASK_SET_TOLERANCE_DISTANCE 48"
  1681. " TASK_SET_ROUTE_SEARCH_TIME 3" // Spend 3 seconds trying to build a path if stuck
  1682. " TASK_GET_PATH_TO_LASTPOSITION 0"
  1683. " TASK_RUN_PATH 0"
  1684. " TASK_WAIT_FOR_MOVEMENT 0"
  1685. ""
  1686. " Interrupts"
  1687. );
  1688. //=========================================================
  1689. // SCHED_MOVE_TO_WEAPON_RANGE
  1690. //
  1691. //=========================================================
  1692. AI_DEFINE_SCHEDULE
  1693. (
  1694. SCHED_MOVE_TO_WEAPON_RANGE,
  1695. " Tasks "
  1696. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_CHASE_ENEMY"
  1697. " TASK_GET_PATH_TO_RANGE_ENEMY_LKP_LOS 0"
  1698. " TASK_RUN_PATH 0"
  1699. " TASK_WAIT_FOR_MOVEMENT 0"
  1700. " TASK_SET_SCHEDULE SCHEDULE:SCHED_COMBAT_FACE"
  1701. ""
  1702. " Interrupts "
  1703. " COND_NEW_ENEMY"
  1704. " COND_ENEMY_DEAD"
  1705. " COND_LOST_ENEMY"
  1706. " COND_CAN_RANGE_ATTACK1"
  1707. " COND_CAN_MELEE_ATTACK1"
  1708. " COND_CAN_RANGE_ATTACK2"
  1709. " COND_CAN_MELEE_ATTACK2"
  1710. " COND_HEAR_DANGER"
  1711. );
  1712. //=========================================================
  1713. // ESTABLISH_LINE_OF_FIRE
  1714. //
  1715. // Go to a location from which I can shoot my enemy
  1716. //=========================================================
  1717. AI_DEFINE_SCHEDULE
  1718. (
  1719. SCHED_ESTABLISH_LINE_OF_FIRE,
  1720. " Tasks "
  1721. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_ESTABLISH_LINE_OF_FIRE_FALLBACK"
  1722. " TASK_GET_PATH_TO_ENEMY_LOS 0"
  1723. " TASK_SPEAK_SENTENCE 1"
  1724. " TASK_RUN_PATH 0"
  1725. " TASK_WAIT_FOR_MOVEMENT 0"
  1726. " TASK_SET_SCHEDULE SCHEDULE:SCHED_COMBAT_FACE"
  1727. ""
  1728. " Interrupts "
  1729. " COND_NEW_ENEMY"
  1730. " COND_ENEMY_DEAD"
  1731. " COND_LOST_ENEMY"
  1732. " COND_CAN_RANGE_ATTACK1"
  1733. " COND_CAN_MELEE_ATTACK1"
  1734. " COND_CAN_RANGE_ATTACK2"
  1735. " COND_CAN_MELEE_ATTACK2"
  1736. " COND_HEAR_DANGER"
  1737. );
  1738. //-----------------------------------------------------------------------------
  1739. // Shoot at my enemy in order to destroy the breakable cover object
  1740. // that they are hiding behind. This will naturally destroy the cover object.
  1741. //-----------------------------------------------------------------------------
  1742. AI_DEFINE_SCHEDULE
  1743. (
  1744. SCHED_SHOOT_ENEMY_COVER,
  1745. " Tasks"
  1746. " TASK_STOP_MOVING 0"
  1747. " TASK_FACE_ENEMY 0"
  1748. " TASK_WAIT 0.5"
  1749. " TASK_RANGE_ATTACK1 0"
  1750. ""
  1751. " Interrupts"
  1752. " COND_ENEMY_DEAD"
  1753. " COND_LIGHT_DAMAGE"
  1754. " COND_HEAVY_DAMAGE"
  1755. " COND_NO_PRIMARY_AMMO"
  1756. " COND_HEAR_DANGER"
  1757. " COND_WEAPON_BLOCKED_BY_FRIEND"
  1758. );
  1759. //=========================================================
  1760. AI_DEFINE_SCHEDULE
  1761. (
  1762. SCHED_ESTABLISH_LINE_OF_FIRE_FALLBACK,
  1763. " Tasks"
  1764. " TASK_STOP_MOVING 0"
  1765. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_PRE_FAIL_ESTABLISH_LINE_OF_FIRE"
  1766. " TASK_GET_CHASE_PATH_TO_ENEMY 300"
  1767. " TASK_RUN_PATH 0"
  1768. " TASK_WAIT_FOR_MOVEMENT 0"
  1769. " TASK_FACE_ENEMY 0"
  1770. ""
  1771. " Interrupts"
  1772. " COND_NEW_ENEMY"
  1773. " COND_ENEMY_DEAD"
  1774. " COND_ENEMY_UNREACHABLE"
  1775. " COND_CAN_RANGE_ATTACK1"
  1776. " COND_CAN_MELEE_ATTACK1"
  1777. " COND_CAN_RANGE_ATTACK2"
  1778. " COND_CAN_MELEE_ATTACK2"
  1779. " COND_TOO_CLOSE_TO_ATTACK"
  1780. " COND_TASK_FAILED"
  1781. " COND_LOST_ENEMY"
  1782. " COND_BETTER_WEAPON_AVAILABLE"
  1783. " COND_HEAR_DANGER"
  1784. );
  1785. //=========================================================
  1786. AI_DEFINE_SCHEDULE
  1787. (
  1788. SCHED_PRE_FAIL_ESTABLISH_LINE_OF_FIRE,
  1789. " Tasks"
  1790. " TASK_FACE_ENEMY 0"
  1791. " TASK_FACE_REASONABLE 0"
  1792. " TASK_IGNORE_OLD_ENEMIES 0"
  1793. " TASK_SET_SCHEDULE SCHEDULE:SCHED_FAIL_ESTABLISH_LINE_OF_FIRE"
  1794. ""
  1795. " Interrupts"
  1796. " COND_NEW_ENEMY"
  1797. " COND_ENEMY_DEAD"
  1798. " COND_CAN_RANGE_ATTACK1"
  1799. " COND_CAN_MELEE_ATTACK1"
  1800. " COND_CAN_RANGE_ATTACK2"
  1801. " COND_CAN_MELEE_ATTACK2"
  1802. );
  1803. //=========================================================
  1804. // FAIL_ESTABLISH_LINE_OF_FIRE
  1805. //
  1806. // Default case. Overridden by subclasses for behavior
  1807. AI_DEFINE_SCHEDULE
  1808. (
  1809. SCHED_FAIL_ESTABLISH_LINE_OF_FIRE,
  1810. " Tasks "
  1811. ""
  1812. " TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
  1813. ""
  1814. " Interrupts "
  1815. " COND_NEW_ENEMY"
  1816. " COND_ENEMY_DEAD"
  1817. " COND_LOST_ENEMY"
  1818. " COND_CAN_RANGE_ATTACK1"
  1819. " COND_CAN_MELEE_ATTACK1"
  1820. " COND_CAN_RANGE_ATTACK2"
  1821. " COND_CAN_MELEE_ATTACK2"
  1822. " COND_HEAR_DANGER"
  1823. );
  1824. //=========================================================
  1825. // > PATROL_RUN
  1826. //
  1827. // Run around randomly until we detect an enemy
  1828. //=========================================================
  1829. AI_DEFINE_SCHEDULE
  1830. (
  1831. SCHED_PATROL_RUN,
  1832. " Tasks"
  1833. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_COMBAT_FACE"
  1834. // " TASK_SET_TOLERANCE_DISTANCE 48"
  1835. " TASK_SET_ROUTE_SEARCH_TIME 5" // Spend 5 seconds trying to build a path if stuck
  1836. " TASK_GET_PATH_TO_RANDOM_NODE 200"
  1837. " TASK_RUN_PATH 0"
  1838. " TASK_WAIT_FOR_MOVEMENT 0"
  1839. ""
  1840. " Interrupts"
  1841. " COND_CAN_RANGE_ATTACK1 "
  1842. " COND_CAN_RANGE_ATTACK2 "
  1843. " COND_CAN_MELEE_ATTACK1 "
  1844. " COND_CAN_MELEE_ATTACK2"
  1845. " COND_GIVE_WAY"
  1846. " COND_NEW_ENEMY"
  1847. " COND_SEE_ENEMY"
  1848. " COND_SEE_FEAR"
  1849. " COND_HEAR_COMBAT"
  1850. " COND_HEAR_DANGER"
  1851. " COND_HEAR_PLAYER"
  1852. " COND_LIGHT_DAMAGE"
  1853. " COND_HEAVY_DAMAGE"
  1854. " COND_SMELL"
  1855. " COND_PROVOKED"
  1856. );
  1857. //=========================================================
  1858. // > IDLE_WANDER
  1859. //
  1860. // Walk around randomly
  1861. //=========================================================
  1862. AI_DEFINE_SCHEDULE
  1863. (
  1864. SCHED_IDLE_WANDER,
  1865. " Tasks"
  1866. // " TASK_SET_TOLERANCE_DISTANCE 48"
  1867. " TASK_SET_ROUTE_SEARCH_TIME 5" // Spend 5 seconds trying to build a path if stuck
  1868. " TASK_GET_PATH_TO_RANDOM_NODE 200"
  1869. " TASK_WALK_PATH 0"
  1870. " TASK_WAIT_FOR_MOVEMENT 0"
  1871. " TASK_WAIT_PVS 0"
  1872. ""
  1873. " Interrupts"
  1874. " COND_GIVE_WAY"
  1875. " COND_HEAR_COMBAT"
  1876. " COND_HEAR_DANGER"
  1877. " COND_NEW_ENEMY"
  1878. " COND_SEE_ENEMY"
  1879. " COND_SEE_FEAR"
  1880. " COND_LIGHT_DAMAGE"
  1881. " COND_HEAVY_DAMAGE"
  1882. " COND_IDLE_INTERRUPT"
  1883. );
  1884. //=========================================================
  1885. // > PATROL_WALK
  1886. //
  1887. // Walk around randomly until we detect an enemy
  1888. //=========================================================
  1889. AI_DEFINE_SCHEDULE
  1890. (
  1891. SCHED_PATROL_WALK,
  1892. " Tasks"
  1893. // " TASK_SET_TOLERANCE_DISTANCE 48"
  1894. " TASK_SET_ROUTE_SEARCH_TIME 5" // Spend 5 seconds trying to build a path if stuck
  1895. " TASK_GET_PATH_TO_RANDOM_NODE 200"
  1896. " TASK_WALK_PATH 0"
  1897. " TASK_WAIT_FOR_MOVEMENT 0"
  1898. ""
  1899. " Interrupts"
  1900. " COND_CAN_RANGE_ATTACK1 "
  1901. " COND_CAN_RANGE_ATTACK2 "
  1902. " COND_CAN_MELEE_ATTACK1 "
  1903. " COND_CAN_MELEE_ATTACK2"
  1904. " COND_GIVE_WAY"
  1905. " COND_HEAR_COMBAT"
  1906. " COND_HEAR_DANGER"
  1907. " COND_HEAR_PLAYER"
  1908. " COND_NEW_ENEMY"
  1909. " COND_SEE_ENEMY"
  1910. " COND_SEE_FEAR"
  1911. " COND_LIGHT_DAMAGE"
  1912. " COND_HEAVY_DAMAGE"
  1913. " COND_SMELL"
  1914. " COND_PROVOKED"
  1915. );
  1916. //=========================================================
  1917. // > COMBAT_PATROL
  1918. //=========================================================
  1919. AI_DEFINE_SCHEDULE
  1920. (
  1921. SCHED_COMBAT_PATROL,
  1922. " Tasks"
  1923. " TASK_SET_ROUTE_SEARCH_TIME 5" // Spend 5 seconds trying to build a path if stuck
  1924. " TASK_GET_PATH_TO_RANDOM_NODE 200"
  1925. " TASK_WALK_PATH 0"
  1926. " TASK_WAIT_FOR_MOVEMENT 0"
  1927. ""
  1928. " Interrupts"
  1929. " COND_CAN_RANGE_ATTACK1 "
  1930. " COND_CAN_RANGE_ATTACK2 "
  1931. " COND_CAN_MELEE_ATTACK1 "
  1932. " COND_CAN_MELEE_ATTACK2"
  1933. " COND_GIVE_WAY"
  1934. " COND_HEAR_DANGER"
  1935. " COND_NEW_ENEMY"
  1936. );
  1937. //=========================================================
  1938. // > RUN_RANDOM
  1939. //=========================================================
  1940. AI_DEFINE_SCHEDULE
  1941. (
  1942. SCHED_RUN_RANDOM,
  1943. " Tasks"
  1944. // " TASK_SET_TOLERANCE_DISTANCE 48"
  1945. " TASK_SET_ROUTE_SEARCH_TIME 1" // Spend 1 seconds trying to build a path if stuck
  1946. " TASK_GET_PATH_TO_RANDOM_NODE 500"
  1947. " TASK_RUN_PATH 0"
  1948. " TASK_WAIT_FOR_MOVEMENT 0"
  1949. ""
  1950. " Interrupts"
  1951. );
  1952. //=========================================================
  1953. // > FALL_TO_GROUND
  1954. //=========================================================
  1955. AI_DEFINE_SCHEDULE
  1956. (
  1957. SCHED_FALL_TO_GROUND,
  1958. " Tasks"
  1959. " TASK_FALL_TO_GROUND 0"
  1960. ""
  1961. " Interrupts"
  1962. );
  1963. //=========================================================
  1964. // > SCHED_DROPSHIP_DUSTOFF
  1965. // After leaving the dropship, dustoff to your specified point
  1966. //=========================================================
  1967. AI_DEFINE_SCHEDULE
  1968. (
  1969. SCHED_DROPSHIP_DUSTOFF,
  1970. " Tasks"
  1971. " TASK_WALK_PATH 0"
  1972. " TASK_WAIT_FOR_MOVEMENT 0"
  1973. " TASK_WAIT_PVS 0"
  1974. ""
  1975. " Interrupts"
  1976. );
  1977. //=========================================================
  1978. // Flinch to protect self from incoming physics object
  1979. //=========================================================
  1980. AI_DEFINE_SCHEDULE
  1981. (
  1982. SCHED_FLINCH_PHYSICS,
  1983. " Tasks"
  1984. " TASK_STOP_MOVING 0"
  1985. " TASK_PLAY_SEQUENCE ACTIVITY:ACT_FLINCH_PHYSICS"
  1986. ""
  1987. " Interrupts"
  1988. );
  1989. //=========================================================
  1990. // > SCHED_MOVE_AWAY
  1991. //=========================================================
  1992. AI_DEFINE_SCHEDULE
  1993. (
  1994. SCHED_MOVE_AWAY_FROM_ENEMY,
  1995. " Tasks"
  1996. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_MOVE_AWAY_FAIL"
  1997. " TASK_FACE_ENEMY 0"
  1998. " TASK_MOVE_AWAY_PATH 120"
  1999. " TASK_RUN_PATH 0"
  2000. " TASK_WAIT_FOR_MOVEMENT 0"
  2001. " TASK_SET_SCHEDULE SCHEDULE:SCHED_MOVE_AWAY_END"
  2002. ""
  2003. " Interrupts"
  2004. " COND_NEW_ENEMY"
  2005. " COND_CAN_RANGE_ATTACK1"
  2006. " COND_CAN_RANGE_ATTACK2"
  2007. " COND_CAN_MELEE_ATTACK1"
  2008. " COND_CAN_MELEE_ATTACK2"
  2009. );
  2010. //=========================================================
  2011. // > SCHED_MOVE_AWAY
  2012. //=========================================================
  2013. AI_DEFINE_SCHEDULE
  2014. (
  2015. SCHED_MOVE_AWAY,
  2016. " Tasks"
  2017. " TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_MOVE_AWAY_FAIL"
  2018. " TASK_MOVE_AWAY_PATH 120"
  2019. " TASK_RUN_PATH 0"
  2020. " TASK_WAIT_FOR_MOVEMENT 0"
  2021. " TASK_SET_SCHEDULE SCHEDULE:SCHED_MOVE_AWAY_END"
  2022. ""
  2023. " Interrupts"
  2024. );
  2025. //=========================================================
  2026. // > SCHED_MOVE_AWAY_FAIL
  2027. //=========================================================
  2028. AI_DEFINE_SCHEDULE
  2029. (
  2030. SCHED_MOVE_AWAY_FAIL,
  2031. " Tasks"
  2032. " TASK_STOP_MOVING 0"
  2033. ""
  2034. " Interrupts"
  2035. );
  2036. //=========================================================
  2037. // > SCHED_MOVE_AWAY_END (allows derived class to translate to appropriate behavior)
  2038. //=========================================================
  2039. AI_DEFINE_SCHEDULE
  2040. (
  2041. SCHED_MOVE_AWAY_END,
  2042. " Tasks"
  2043. " TASK_STOP_MOVING 0"
  2044. " TASK_FACE_REASONABLE 0"
  2045. ""
  2046. " Interrupts"
  2047. " COND_NEW_ENEMY"
  2048. " COND_SEE_ENEMY"
  2049. " COND_SEE_FEAR"
  2050. " COND_LIGHT_DAMAGE"
  2051. " COND_HEAVY_DAMAGE"
  2052. " COND_PROVOKED"
  2053. " COND_SMELL"
  2054. " COND_HEAR_COMBAT" // sound flags
  2055. " COND_HEAR_WORLD"
  2056. " COND_HEAR_PLAYER"
  2057. " COND_HEAR_DANGER"
  2058. " COND_HEAR_BULLET_IMPACT"
  2059. " COND_IDLE_INTERRUPT"
  2060. );
  2061. //=========================================================
  2062. // > SCHED_WAIT_FOR_SPEAK_FINISH
  2063. //=========================================================
  2064. AI_DEFINE_SCHEDULE
  2065. (
  2066. SCHED_WAIT_FOR_SPEAK_FINISH,
  2067. " Tasks"
  2068. " TASK_WAIT_FOR_SPEAK_FINISH 0"
  2069. ""
  2070. " Interrupts"
  2071. " COND_NEW_ENEMY"
  2072. " COND_SEE_FEAR"
  2073. " COND_LIGHT_DAMAGE"
  2074. " COND_HEAVY_DAMAGE"
  2075. " COND_SMELL"
  2076. " COND_PROVOKED"
  2077. " COND_GIVE_WAY"
  2078. " COND_HEAR_DANGER"
  2079. " COND_HEAR_COMBAT"
  2080. " COND_HEAR_BULLET_IMPACT"
  2081. );
  2082. //=========================================================
  2083. // > SCHED_DUCK_DODGE
  2084. //=========================================================
  2085. AI_DEFINE_SCHEDULE
  2086. (
  2087. SCHED_DUCK_DODGE,
  2088. " Tasks"
  2089. " TASK_STOP_MOVING 0"
  2090. " TASK_PLAY_SEQUENCE ACTIVITY:ACT_DUCK_DODGE"
  2091. " TASK_DEFER_DODGE 30"
  2092. ""
  2093. " Interrupts"
  2094. ""
  2095. );
  2096. //=========================================================
  2097. // > SCHED_INTERACTION_MOVE_TO_PARTNER
  2098. //=========================================================
  2099. AI_DEFINE_SCHEDULE
  2100. (
  2101. SCHED_INTERACTION_MOVE_TO_PARTNER,
  2102. " Tasks"
  2103. " TASK_GET_PATH_TO_INTERACTION_PARTNER 0"
  2104. " TASK_FACE_TARGET 0"
  2105. " TASK_WAIT 1"
  2106. ""
  2107. " Interrupts"
  2108. " COND_NO_CUSTOM_INTERRUPTS"
  2109. );
  2110. //=========================================================
  2111. // > SCHED_INTERACTION_WAIT_FOR_PARTNER
  2112. //=========================================================
  2113. AI_DEFINE_SCHEDULE
  2114. (
  2115. SCHED_INTERACTION_WAIT_FOR_PARTNER,
  2116. " Tasks"
  2117. " TASK_FACE_TARGET 0"
  2118. " TASK_WAIT 1"
  2119. ""
  2120. " Interrupts"
  2121. " COND_NO_CUSTOM_INTERRUPTS"
  2122. );
  2123. //=========================================================
  2124. // > SCHED_SLEEP
  2125. //=========================================================
  2126. AI_DEFINE_SCHEDULE
  2127. (
  2128. SCHED_SLEEP,
  2129. " Tasks"
  2130. " TASK_STOP_MOVING 0"
  2131. " TASK_WAIT 0.2"
  2132. ""
  2133. " Interrupts"
  2134. ""
  2135. );