// 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  } }}