NPC movement

This is a list of important components of an NPC movement schedule and task. One day it may end up as a full tutorial.
== Schedule tasks ==
All of these tasks can be found in CAI_BaseNPC::StartTask(). Their TASK_ prefixes have been removed for readability.
=== Find targets ===
;GET_PATH_TO_PLAYER
:Sets the NPC's goal to the player's location at the time of calculation.
;WANDER <int|min_dist * 10000 + int|max_dist>
:Pick a random location for a goal. The parameter is complex because it is actually two values forced into one.
;GET_PATH_TO_ENEMY_LOS
;GET_FLANK_RADIUS_PATH_TO_ENEMY_LOS
;GET_FLANK_ARC_PATH_TO_ENEMY_LOS
;GET_PATH_TO_ENEMY_LKP_LOS
:Various hostile-related goal selection tasks.
;FIND_COVER_FROM_BEST_SOUND
;FIND_HINTNODE
;FIND_LOCK_HINTNODE
=== Walk/Run ===
;WALK_PATH
;RUN_PATH
;WALK_PATH_FOR_UNITS <units>
;RUN_PATH_FOR_UNITS <units>
;WALK_PATH_WITHIN_DIST <units>
;RUN_PATH_WITHIN_DIST <units>
:Basic movement tasks. WITHIN_DIST are useful when the target itself isn't accessible, e.g. is an entity's origin.
;RUN_PATH_FLEE <units>
:Run this many units. Won't set a goal though, so use it in conjunction with another task.
;WALK_PATH_TIMED <float|seconds>
;RUN_PATH_TIMED <float|seconds>
:Wait this many seconds, then move.
:
;WEAPON_RUN_PATH
;ITEM_RUN_PATH
:Move to pick up a weapon or item; fail if it is picked up or otherwise removed.
;SCRIPT_RUN_TO_TARGET
;SCRIPT_WALK_TO_TARGET
;SCRIPT_CUSTOM_MOVE_TO_TARGET
:For scripted movement.
;MOVE_TO_TARGET_RANGE
;MOVE_TO_GOAL_RANGE
:Move within weapons range. Identical, except that one uses a goal while the other uses a target entity.
;GET_PATH_AWAY_FROM_BEST_SOUND
;MOVE_AWAY_PATH
=== Turning/Facing ===
;TURN_RIGHT
;TURN_LEFT
;FACE_ENEMY
;FACE_PLAYER
;FACE_HINTNODE
;FACE_LASTPOSITION
;FACE_SAVEPOSITION
;FACE_AWAY_FROM_SAVEPOSITION
;FACE_TARGET
;FACE_IDEAL
;FACE_SCRIPT
;FACE_PATH
;FACE_REASONABLE
=== SavePosition ===
;STORE_POSITION_IN_SAVEPOSITION
;STORE_BESTSOUND_IN_SAVEPOSITION
;CLEAR_LASTPOSITION
;STORE_LASTPOSITION
;TASK_STORE_BESTSOUND_REACTORIGIN_IN_SAVEPOSITION
;TASK_STORE_ENEMY_POSITION_IN_SAVEPOSITION
;TASK_FIND_BACKAWAY_FROM_SAVEPOSITION
=== Utility ===
;WAIT_FOR_MOVEMENT <float|seconds>
:Wait this long for any ongoing movement to complete (pass 0 to wait forever if necessary). A very common task.
;WAIT_FOR_MOVEMENT_STEP <float|seconds>
:Same as above, but fails if the goal is a cover location which a hostile has LOS to.
:
;SET_ROUTE_SEARCH_TIME <seconds>
:Maximum time to spend building a route. The schedule will fail if it is overrun. Remember that different CPU speeds will give different results - don't use it except as a fail-safe.
;STOP_MOVING
:Like, duh.
== Task functions ==
=== General ===
;SetTarget( CBaseEntity )
:The NPC's target is the entity it is acting upon - moving towards, looking at, shooting at, etc. Theoretically, multiple targets can be acted upon in the same frame by changing this value over the course of execution.
===GetNavigator()->===
The NPC's CAI_Navigator instance, which defines the core movement functions.
;SetGoal(const AI_NavGoal_t &goal, unsigned int flags = 0)
:The standard function for telling an NPC where it should head to when next given the command to move. Can be called with only a vector thanks to an AI_NavGoal_t overload.
;SetDirectGoal( vector &goalPos, Navigation_t navType = <npc default> )
:Bypasses much of SetGoal's code. Purpose is unclear.
;SetArrivalDirection( vector || qangle || CBaseEntity )
:The direction to face on arrival at the task goal. The NPC will probably begin turning shortly before arrival.
:
;StopMoving( bool bImmediate )
:bImmediate doesn't seem to have any effect on walking NPCs - they stop immediately either way.
===GetTacticalServices()->===
Combat movement functions.
M