combo

// Combo file format and template

//RemapReloadButton("<button>");
//  Since the reload button is generally unused by combo weapons, allow
//   it to be remapped for the soldier.
//  <button> string param; values:
//   "Fire"   - Fire button
//   "FireSecondary" - Secondary fire button
//   "Jump"   - Jump button
//   "Sprint"  - Sprint button
//   "Crouch"  - Crouch button
//   "Reload", "None"- Don't remap the reload button
 RemapReloadButton("FireSecondary"); // remap to FireSecondary so we
                                     // can use the second trigger for our own purposes
//Animation("<animname>")
//{} scope OPTIONAL
//  Defines a combo animation by name to be used below.
//   Since combo animations have custom names, it is sometimes
//   necessary to define them ahead of time so that they can be
//   referenced later in the file.
//  <animname> string param; values: any, does not include a bank name
//   (i.e. without "human_sabre_") and may optionally exclude the
//   the animation scope ("_upper" or "_lower"), in which case both
//   animation scopes are affected.
//  [scope] contains animation data in the same format as the .sanm file.
//   If not present, this tag will simply act as a forward declaration.
 Animation("stand_attack1a_end");// forward declare "stand_attack1a_end_upper" 
                                 // and "stand_attack1_end_lower"
 Animation("stand_attack1a") // declare "stand_attack1a_upper"/"lower"
                             // with the following data:
     {
 //Loop([bLoop]);
 //  Set whether this anim loops; defaults to not looping.
 //  [bLoop] OPTIONAL numeric param; default 1; values: 0, 1
 //  Also may be "FinalFrame" to loop just the last frame.
 Loop();

//AimType("<aimtype>");

 //  Set the aiming behavior of this anim; defaults to "None".
 //   NOTE: only used by "_upper" anim scope.
 //  <aimtype> string param; values:
 //   "None"  - body oriented in move direction
 //   "Head"  - body in move direction, head turned to aim
 //   "Torso"  - body in move direction, torso turned to aim
 //   "FullBody" - body in aim direction, override walk/run anims
 AimType("FullBody");
 //SyncType("<name>"[, "ByTime"]);
 //  Sets the sync class of this anim; defaults to no sync class.
 //   When transitioning between two anims in the same sync class,
 //   the new anim will frame sync to the old.
 //  <name> string param; values: any
 //  "ByTime" if specified, sync to same time as previous anim instead
 //   of to same ratio of anim length.
 SyncType("forward");
 //BlendInTime(<time>[, "Frames"|"Seconds"]);
 //  Sets the blend in time of this anim; defaults to 0.0.
 //  <time> numeric param; value in seconds [0.00 - 2.55]
 //  "Frames" specifies that time is in frames.
 BlendInTime(0.15);
 //BlendOutTime(<time>[, "Frames"|"Seconds"]);
 //  Sets the blend out time of this anim; defaults to 0.0.
 //  <time> numeric param; value in seconds [0.00 - 2.55]
 //  "Frames" specifies that time is in frames.
 BlendOutTime(0.15);
 //BlendTimeTo("<animname>", <time>[, "Frames"|"Seconds"]);
 //  Sets the specific blend time from this anim to another, by name.
 //   If no specific blend time exists, the blend time will be set
 //   to the minimum of this anim's BlendOutTime and the destination
 //   anim's BlendInTime.
 //  <animname> string param; values: previously defined animnames.
 //   All basic movement, action, and weapon animations are defined
 //   as well as any animations previously defined in this file with
 //   an Animation() tag.  Animation scope (i.e. "_upper") is ignored.
 //  <time> numeric param; value in seconds [0.00 - 2.55]
 //  "Frames" specifies that time is in frames.
 BlendTimeTo("stand_attack1a_end", 0.00);
 //LowResPose(<time>[, "Frames"|"Seconds"]);
 //  If specified, this animation will be reduced to a single pose
 //  generated from frame <time> when animating low res models.
 //  NOTE: currently this only applies to attack and block anims.
 //  <time> numeric param; value in seconds [0.00 - 2.55]
 //  "Frames" specifies that time is in frames.
 LowResPose(5, "Frames");
}
//State("<statename>")
//{} scope REQUIRED
//  Defines a state in the combo.
//  <statename> is used to reference this state elsewhere in the file.
//  NOTE: all combos must define an initial state called "IDLE"
State("ATTACK1")
{
 //RestartAnimation();  no parameters - tag to tell the system to restart the animation
 //   if coming in from the same one, rather than continuing it.
 RestartAnimation();
 //PlayExplosion();  no parameters - tag to tell the system to play the WeaponMelee's
 //   Explosion, if it has one set.
 PlayExplosion();
 //MustShowOneFrame(); will not exit this state to another without displaying at least
 //   one frame of the soldier's animation for it - which is enough
 //   to allow them to jump, etc, before transitioning.
 MustShowOneFrame();
 
 //Duration(<time>[, "FromAnim"|"Frames"|"Seconds"]);
 //  Sets the duration of this state; defaults to the anim duration.
 //  <time> numeric param; value in seconds by default [0.00-10.22]
 //   0.0 means infinite
 //  "FromAnim" if specified, duration is a percentage of anim duration.
 //  "Frames" if specified, duration is in frames (30ths of seconds).
 //  "Seconds" if specified, duration is in seconds.
 Duration(-1); // use anim duration
 //Animation("<animname>")
 //{} scope OPTIONAL
 //  Sets the animation associated with this state; defaults to no anim.
 //   Also defines a combo animation by name as above.
 Animation("stand_attack1a");
 //Sound("<soundname>" [, <time>][, "Frames"|"Seconds"]);
 //  Sets the sound played with this state; defaults to no sound.
 //  [time] numeric param; default 0.00; value in seconds: [0.00-10.23]
 //   Sets the time from the start of the state to play the sound.
 //  "Frames" specifies that the time value is in frames.
 Sound("imp_weap_lightsabre", 0.00);
 //AnimatedMove([set])
 //{} scope OPTIONAL
 //  If set, the animation will control the soldier's velocity for the
 //   duration of this state; defaults to false.
 //  [set] numeric param; default 1; values: 0, 1
 //  [scope] contains conditions to disable AnimatedMove
 AnimatedMove()
 {
  //VelocityZ(<velocity>[, "FromAnim"]);
  //  Sets the override z velocity for this animated move; defaults
  //   to the animation velocity (1.0, "FromAnim");
  //  <velocity> numeric param; value in meters per second;
  //   [-40.96-40.94]
  //  "FromAnim" if specified, interpret <velocity> as a multiplier
  //   to apply to the animation velocity.
  VelocityZ(1.0, "FromAnim");  // use animation velocity z
  //VelocityX(<velocity>[, "FromAnim"]);
  //  Sets the override x velocity for this animated move; defaults
  //   to the animation velocity (1.0, "FromAnim");
  //  <velocity> numeric param; value in meters per second;
  //   [-40.96-40.94]
  //  "FromAnim" if specified, interpret <velocity> as a multiplier
  //   to apply to the animation velocity.
  VelocityX(1.0, "FromAnim");  // use animation velocity x
  //VelocityFromThrust(<velocity>);
  //  Sets the thrust dependent (z) velocity for this animated move;
  //   defaults to 0.0.  Multiplied by input thrust (-1 - 1).
  //  <velocity> numeric param; value in meters per second;
  //   [0.00-12.75]
  VelocityFromThrust(0.0);
  //VelocityFromStrafe(<velocity>);
  //  Sets the strafe dependent (x) velocity for this animated move;
  //   defaults to 0.0.  Multiplied by input strafe (-1 - 1).
  //  <velocity> numeric param; value in meters per second;
  //   [0.00-12.75]
  VelocityFromStrafe(0.0);
  //Until/If/Or()
  //{} scope REQUIRED
  //  Defines a condition to break out of AnimatedMove.
  //   All conditions are forced to breaking conditions.
  //  See Transition::If/Or below for details.
  Until() // break out after 0.2 seconds if stick is moved
  {
   Break(0.2);
   Thrust(">", 0.5477);
  }
 }
 //AlignedToThrust([0|1|"Initial"]);
 //  Sets this state to align its aim and VelocityFromThrust direction
 //   to the input thrust direction; defaults to 0.
 //  [0|1] numeric or string param; default 1; values: 0, 1, "Initial"
 //   "Initial" causes this state to align to the initial thrust
 //    direction (i.e. the direction the thrust pointed in when
 //    entering this state).
 AlignedToThrust(0);
 //Gravity(<gravity>);
 //  Sets the gravity during this state in g's; default is 1.0.
 //  <gravity> numeric param; value [-12.7 - 12.7]
 Gravity(1.0);
 //GravityVelocityTarget(<velocity>[, "Impulse"][, "ZeroGravity"]);
 //  Sets a (Y) velocity condition on the Gravity setting; default
 //   is no condition.
 //  <velocity> numeric param; value [-204.7 - 204.7] meters per second.
 //  "Impulse" if specified, instantly accelerate to target velocity.
 //  "ZeroGravity" if specified, gravity resets to 0.0 instead of 1.0
 //   once the velocity condition is met.
 GravityVelocityTarget(0.0);
 //InputLock([<duration>[, "Frames"|"Seconds"]][, "<control>"][, ...]);
 //  Sets the combo to lock controls from going to the soldier in
 //   this state; defaults to none.
 //  [duration] OPTIONAL numeric param; default 0.0; value in seconds
 //   [0.00-10.23].  0.0 or negative means entire state duration.
 //  "Frames" specifies that the duration is in frames.
 //  [control] OPTIONAL string param; default "All"; values:
 //   "All", "Any" - All controls
 //   "Thrust"  - Thrust stick
 //   "Fire"   - Fire button
 //   "FireSecondary" - Secondary fire button
 //   "Jump"   - Jump button
 //   "Sprint"  - Sprint button
 //   "Crouch"  - Crouch button
 //   "Reload"  - Reload button
 //   "!<control>" - except a control
 //    i.e. InputLock(0.0, "All", "!Thrust", "!Sprint");
 //    locks all controls except Thrust and Sprint
 InputLock();   // lock all controls for duration of state
 //ThrustFactor(<factor>);
 //  Set a multiplier to apply to the thrust control while in this state;
 //   defaults to 1.0.  Note that while InputLock("Thrust") is active,
 //   the thrust factor will effectively be 0.0.
 //  <factor> numeric param; value [0.00-12.75]
 ThrustFactor(1.0);  // default thrust speed
 //StrafeFactor(<factor>);
 //  Set a multiplier to apply to the strafe control while in this state;
 //   defaults to 1.0.  Note that while InputLock("Thrust") is active,
 //   the strafe factor will effectively be 0.0.
 //  <factor> numeric param; value [0.00-12.75]
 StrafeFactor(1.0);  // default strafe speed
 //TurnFactor(<factor>);
 //  Set a multiplier to apply to the turn control while in this state;
 //   defaults to 1.0.
 //  <factor> numeric param; value [0.00-12.75]
 TurnFactor(1.0);  // default turn speed
 //PitchFactor(<factor>);
 //  Set a multiplier to apply to the pitch control while in this state;
 //   defaults to 1.0.
 //  <factor> numeric param; value [0.00-12.75]
 PitchFactor(1.0);  // default pitch speed
 //Posture("<posture>"[, "<posture>"][, ...]);
 //  Sets the soldier postures allowed in this state; defaults to "All"
 //   The soldier will be forced into one of the postures, if
 //   possible, and will abort to IDLE state if not.
 //  <posture> string param; values:
 //   "All", "Any" - All postures
 //   "Stand"   - soldier is standing
 //   "Crouch"  - soldier is crouching
 //   "Prone"   - soldier is prone
 //   "Sprint"  - soldier is sprinting
 //   "Jump"   - soldier is jumping
 //   "RollRight"  - soldier is rolling to the right
 //   "RollLeft"  - soldier is rolling to the left
 //   "Jet"   - soldier is jet jumping
 //   "Roll"   - synonym for "RollLeft","RollRight"
 //   "!<posture>" - except a posture
 Posture("Stand");  // must be standing
 //TurnOffLightsaber([weapon#][, weapon#][, ...]);
 //  Causes the lightsabers specified to be turned off while in this
 //   state.  Default is all sabers on.
 //  [weapon#] int param; values [0-3]; the weapon indices from the
 //   melee weapon odf of the lightsabers to turn off.
 //   If no [weapon#] are specified, all will be turned off.
 //TurnOffLightsaber(1); // turn off lightsaber 1
 //EnergyRestoreRate([rate][, "FromSoldier"]);
 //  Sets the soldier energy restore rate in this state; defaults to
 //   normal soldier energy restore rate in current posture
 //   (0.0, "FromSoldier").
 //  [rate] OPTIONAL numeric param; default 0.0, "FromSoldier";
 //   value in energy per second [-102.2-102.2], may be negative
 //  "FromSoldier" if specified, apply <rate> as an offset from the
 //   normal energy restore rate.  Otherwise, use <rate> as an
 //   absolute rate.
 EnergyRestoreRate(0.0); // do not restore energy while attacking
 //Attack()
 //{} scope OPTIONAL
 //  Define attack (damage) parameters for this state; default none.
 //   Multiple Attack's may be defined per state.
 //  [scope] contains data defining this attack; defaults to an attack
 //   with default parameters.
 Attack()
 {
  //AttackId(<id>);
  //  If two attacks within a short period of time share the same
  //   AttackId, only the first to apply damage to a character
  //   will do damage.  This is useful for splitting one attack
  //   across multiple states without potentially creating
  //   double damage.
  //  <id> string param; arbitrary value.
  AttackId("attack1");

// Edge(<index>);

  // Specify which edge this damage is attached to, if this
  //   character has multiple blades defined in their weapon odf;
  //   default is 0.
  //  <index> numeric param; value [0-<numedges-1>]
  Edge(0);
  //DamageTime(<time0>, <time1>[, "<option>"]);
  //  Sets the time range from the start of the state during which
  //   damage will be applied; defaults to 0.2-0.3 FromAnim.
  //  <time> numeric param; value in seconds by default
  //  [option] string param; values:
  //   "Seconds" - <time> is in seconds
  //   "Frames" - <time> is in frames (1/30ths of a second)
  //   "FromAnim" - <time> is fraction of state duration in
  //       the range [0.0-1.0]
  DamageTime(2, 5, "Frames"); // do damage from frame 2 to 5
  //Damage([damage]);
  //  Sets the damage inflicted by this attack; defaults to the value
  //   set in the weapon odf with "Damage" or "MaxDamage".
  //  <damage> numeric param; value in health units. [0-4094]
  //   or "Default" for weapon odf value.
  Damage(200);
  //Push(<strength>);
  //  Sets the push effect strength inflicted by this attack;
  //   defaults to 0.0.
  //  <strength> numeric param; value in meters per second [0.0-25.5].
  Push(0.0);
  //DamageLength(<length>[, "FromEdge"]);
  //  Sets the length of the ray used for applying damage;
  //   defaults to 1.0 FromEdge.
  //  <length> numeric param; value in meters by default [0.0-10.23]
  //  "FromEdge" if specified, the distance is a multiplier on the
  //   edge length specified in the weapon odf.
  DamageLength(1.0, "FromEdge");
  //DamageWidth(<width>,[, "FromEdge"]);
  //  Sets the width of the ray used for applying damage;
  //   defaults to 1.0 FromEdge.
  //  <length> numeric param; value in meters by default [0.0-2.55]
  //  "FromEdge" if specified, the distance is a multiplier on the
  //   edge width specified in the weapon odf.
  DamageWidth(1.0, "FromEdge");
 }
 //Deflect()
 //{} scope REQUIRED
 //  Enables ordnance deflection in this state; defauls to none.
 //   Only one Deflect may be defined per state, currently.
 //  [scope] contains deflection parameters.
 Deflect()
 {
  //DeflectAngle(<min>, <max>);
  //  Only attacks in directions within this angular range in the
  //   XZ plane can be deflected.  defaults to all directions.
  //  <min> numeric param; value in degrees [-180-180]
  //  <max> numeric param; value in degrees [-180-180]
  //EnergyCost(<energy>);
  //  Sets the energy cost per attack deflected; defaults to 0.0.
  //  <energy> numeric param; value in energy units [0.0-102.3]
  EnergyCost(0.0);
  //DeflectAnimation("<animname>"[, "<direction>"][, ...][, "Offhand"])
  //{} scope OPTIONAL
  //  Sets a deflection pose to use when an attack is deflected in
  //   a given approximate direction.  If multiple animations
  //   match an incoming attack's direction, one will be randomly
  //   selected.  If none match, the first anim will be used.
  //  <animname> as in Animation tags above.
  //  [direction] string param; values one or more of:
  //   "Forward", "Right", "BackRight",
  //   "Left", "BackLeft", "Back"
  //   "All"   - match any direction
  //   "!<direction>" - disable a direction, useful with "All"
  //  "Offhand" if specified, this is a lefthanded block - use the
  //   left hand or damage edges when attaching effects.  Note
  //   that if you have moved a right handed lightsaber to the
  //   left hand by moving hp_weapons, it still counts as right
  //   handed.
  //  [scope] as in Animation tags above.
  DeflectAnimation("stand_block_front1", "Forward");
  DeflectAnimation("stand_block_right1", "Right");
  DeflectAnimation("stand_block_left1", "Left");
 }
 //Transition("<statename>")
 //{} scope OPTIONAL
 //  Define a transition from this state to another by name;
 //   if no transitions are defined, defaults to an unconditional
 //   transition to IDLE at the end of this state's Duration.
 //   Multiple Transition's may be defined per state, in which case
 //   the final Transition is also considered to be an unconditional
 //   non-breaking transition if no other such transition is defined.
 //  <statename> string param; values: any statename defined elsewhere
 //   in this file by a State tag.
 //  [scope] contains data defining this transition; defaults to
 //   an unconditional transition to the given state at the end of
 //   this state's Duration.
 Transition("ATTACK2")
 {
  //EnergyCost(<energy>);
  //  Sets the energy cost of following this transition, which is
  //   effectively also a condition on the soldier energy to
  //   make this transition; default 0.0.
  //  <energy> numeric param; value in energy units.
  EnergyCost(0.0);
  //If/Or()
  //{} scope REQUIRED
  //  Defines a condition to be met in order to make this transition;
  //   default is unconditional, non-breaking transition.
  //   Multiple conditions may be defined per transition, in which
  //   case the transition will trigger if any of the conditions
  //   are met (hence the optional tag "Or").
  //  <scope> contains a set of conditions to be met; all conditions
  //   in the scope must be met to trigger this transition.
  If() // transition if...
  {
   //Break([time][, "Frames"|"Seconds"]);
   //  After [time] seconds, if the rest of this condition is
   //   met, the transition will break out of the current
   //   state immediately rather than waiting until the state
   //   Duration expires.
   //   NOTE: A TimeStart less than the Break time allows a
   //   breaking condition to depend on earlier button events.
   //   A Break time less than TimeStart won't break until
   //   TimeStart.
   //  [time] numeric param; default 0.0; value in seconds.
   //   [0.00 - 5.11].
   //   This condition will not break until [time] seconds
   //   have passed since the start of the state.
   //  "Frames" specifies that the time is in frames.
   //TimeStart(<time>[, "FromEnd"][, "Frames"|"Seconds"]);
   //  Set the time to start checking this condition; defaults to
   //   0.0, the start of the state.  The start time may be
   //   negative or before the start of the state, in which
   //   case button events still stored from the previous
   //   state may apply.  Button events are checked to see if
   //   they occurred in the time range defined.  Other
   //   conditions only check their current value, if the
   //   current time is in range.
   //  <time> numeric param; value in seconds [-5.12 - 5.11]
   //  "FromEnd" if specified, time is measured from the end
   //   of the current state's Duration.
   //  "Frames" specifies that the time is in frames.
   TimeStart(-1.0); // accept button hits up to 1 second before
   //TimeEnd(<time>[, "FromEnd"][, "Frames"|"Seconds"]);
   //  Set the time to stop checking this condition; defaults to
   //   0.0, FromEnd, the end of the state.  The end time may
   //   be after then end of the state, in which case, if the
   //   combo transitions unconditionally, it will continue
   //   checking the condition to retroactively take this
   //   transition.
   //  <time> numeric param; value in seconds [-5.12 - 5.11]
   //  "FromEnd" if specified, time is measured from the end
   //   of the current state's Duration.
   //  "Frames" specifies that the time is in frames.
   TimeEnd(0.15);  // keep checking this condition for 0.15
                   // seconds into RECOVER1
   //Button("<button>"[, "<action>"]);
   //  Set a button event condition to take this transition.
   //  <button> string param; values:
   //   "Fire"   - Fire button
   //   "FireSecondary" - Secondary fire button
   //   "Jump"   - Jump button
   //   "Sprint"  - Sprint button
   //   "Crouch"  - Crouch button
   //   "Reload"  - Reload button
   //   "FireBoth"  - Fire and FireSecondary together
   //  [action] string param; default "Tap"; values:
   //   "Tap"   - button pressed and released quickly
   //   "DoubleTap"  - button tapped twice quickly
   //   "Hold"   - button pressed, held, and released
   //   "Down"   - button down at any time (matches all
   //        other actions)
   Button("Fire");  // look for a tap on the fire button
   //ButtonsPressed("<button>"[, "<button>"][, ...]);
   //ButtonsReleased("<button>"[, "<button>"][, ...]);
   //  Set a condition on any of a number of buttons being
   //   pressed or released.  This condition differs from
   //   Button in the following ways:
   //   It does not consume button events; this makes it
   //    possible to test a button but leave it in the
   //    queue to trigger a transition from the following
   //    state.
   //   It can test multiple buttons simultaneously.
   //   If both ButtonsPressed and ButtonsReleased conditions
   //    are present, they are evaluated collectively; i.e.
   //    if any button in the ButtonPressed list was
   //    pressed or any button in the ButtonReleased list
   //    was released, this part of the condition passes.
   //  <button> string param; values one or more of:
   //   "Fire"   - Fire button
   //   "FireSecondary" - Secondary fire button
   //   "Jump"   - Jump button
   //   "Sprint"  - Sprint button
   //   "Crouch"  - Crouch button
   //   "Reload"  - Reload button
   //   "All", "Any" - Any button
   //   "!<button>"  - Remove this button from the list;
   //         useful with "Any".
   ButtonsPressed("All", "!Reload"); // any button but reload was pressed
   ButtonsReleased("Fire");   // or fire was released
   //Posture("<posture>"[, "<posture>"][, ...]);
   //  Sets a soldier posture condition to take this transition.
   //  <posture> string param; values:
   //   "All", "Any" - All postures
   //   "Stand"   - soldier is standing
   //   "Crouch"  - soldier is crouching
   //   "Prone"   - soldier is prone
   //   "Sprint"  - soldier is sprinting
   //   "Jump"   - soldier is jumping
   //   "RollRight"  - soldier is rolling to the right
   //   "RollLeft"  - soldier is rolling to the left
   //   "Jet"   - soldier is jet jumping
   //   "Roll"   - synonym for "RollLeft","RollRight"
   //   "!<posture>" - except a posture
   Posture("Stand");
   //TimeInPosture(">"|"<", <time>[, "Frames"|"Seconds"]);
   //  Sets a soldier posture timer condition to make this
   //   transition. i.e. soldier in "Jump" posture for so
   //   many seconds.
   //  ">"|"<" if "<", condition is less than or equal to,
   //   otherwise, condition is greater than or equal to.
   //  <time> numeric param; value in seconds [0.00 - 20.47].
   //  "Frames" specifies that the time is in frames.
   TimeInPosture(">", 0.00); // same as no condition
   //Energy(">"|"<", <energy>);
   //  Sets a condition on the soldier energy required to make
   //   this transition.
   //  ">"|"<" if "<", condition is less than or equal to,
   //   otherwise, condition is greater than or equal to.
   //  <energy> numeric param; value in energy [0.0 - 102.3].
   Energy(">", 0.0);   // same as no condition
   //Thrust(">"|"<", <thrust>);
   //  Sets a condition on the input thrust magnitude.
   //  ">"|"<" if "<", condition is less than or equal to,
   //   otherwise, condition is greater than or equal to.
   //  <thrust> numeric param; value [0.00 - 1.00].
   Thrust(">", 0.00);   // same as no condition
   //ThrustAngle(<anglemin>, <anglemax>);
   //  Sets a condition on the input thrust angle in degrees,
   //   where 0, 360, or -360 is forward,
   //   90 or -270 is left, -90 or 270 is right, and
   //   180 or -180 is back.
   //  <anglemin> numeric param; value in degrees [-360 - 360]
   //  <anglemax> numeric param; value in degrees [-360 - 360]
   //   <anglemax> should be greater than <anglemin> or
   //   the condition will end up inverted.
   ThrustAngle(0, 0);   // same as no condition
   //VelocityXZ(">"|"<", <velocity>);
   //  Sets a condition on the soldier speed in the XZ direction.
   //  ">"|"<" if "<", condition is less than or equal to,
   //   otherwise, condition is greater than or equal to.
   //  <velocity> numeric param; value in meters per second
   //   [0.00 - 20.47].
   VelocityXZ(">", 0.00);  // same as no condition
   //VelocityXZAngle(<anglemin>, <anglemax>);
   //  Sets a condition on the soldier velocity angle in the XZ
   //   direction in degrees, where 0, 360, or -360 is
   //   forward, 90 or -270 is left, -90 or 270 is right, and
   //   180 or -180 is back.
   //  <anglemin> numeric param; value in degrees [-360 - 360]
   //  <anglemax> numeric param; value in degrees [-360 - 360]
   //   <anglemax> should be greater than <anglemin> or
   //   the condition will end up inverted.
   VelocityXZAngle(0, 0);  // same as no condition
   //VelocityYAbs(">"|"<", <velocity>);
   //  Sets a condition on the soldier speed in the Y direction.
   //  ">"|"<" if "<", condition is less than or equal to,
   //   otherwise, condition is greater than or equal to.
   //  <velocity> numeric param; value in meters per second
   //   [0.00 - 15.75].
   VelocityYAbs(">", 0.0);  // same as no condition
   //VelocityY(">"|"<", <velocity>);
   //  Sets a condition on the soldier velocity in the Y
   //   direction, i.e. including sign.
   //  ">"|"<" if "<", condition is less than or equal to,
   //   otherwise, condition is greater than or equal to.
   //  <velocity> numeric param; value in meters per second
   //   [-16.0 - 15.5].
   VelocityY(">", -16.0);  // same as no condition
  }
 }
}