rifleboltlock_base.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. enum RBLAnimState
  2. {
  3. DEFAULT = 0, ///< default weapon state, closed and discharged
  4. OPENED = 1,
  5. JAMMED = 2,
  6. };
  7. enum RBLStableStateID
  8. {
  9. UNKNOWN = 0,
  10. RBL_CLO_BU0_MA0 = 1,
  11. RBL_CLO_BU1_MA0 = 2,
  12. RBL_CLO_BU1_MA1 = 3,
  13. RBL_CLO_BU0_MA1 = 4,
  14. RBL_OPN_BU0_MA1 = 5,
  15. RBL_OPN_BU0_MA0 = 6,
  16. RBL_JAM_BU1_MA0 = 7,
  17. RBL_JAM_BU1_MA1 = 8
  18. }
  19. class RBL_CLO_BU0_MA0 extends WeaponStableState
  20. {
  21. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { close nobull nomag"); } super.OnEntry(e); }
  22. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } close nobull nomag"); } }
  23. override int GetCurrentStateID () { return RBLStableStateID.RBL_CLO_BU0_MA0; }
  24. override bool HasBullet () { return false; }
  25. override bool HasMagazine () { return false; }
  26. override bool IsJammed () { return false; }
  27. override bool IsRepairEnabled () { return true; }
  28. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  29. };
  30. class RBL_CLO_BU1_MA0 extends WeaponStableState
  31. {
  32. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { close bullet nomag"); } super.OnEntry(e); }
  33. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } close bullet nomag"); } }
  34. override int GetCurrentStateID () { return RBLStableStateID.RBL_CLO_BU1_MA0; }
  35. override bool HasBullet () { return true; }
  36. override bool HasMagazine () { return false; }
  37. override bool IsJammed () { return false; }
  38. override bool IsRepairEnabled () { return true; }
  39. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; }
  40. };
  41. class RBL_CLO_BU1_MA1 extends WeaponStableState
  42. {
  43. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { close bullet mag"); } super.OnEntry(e); }
  44. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } close bullet mag"); } }
  45. override int GetCurrentStateID () { return RBLStableStateID.RBL_CLO_BU1_MA1; }
  46. override bool HasBullet () { return true; }
  47. override bool HasMagazine () { return true; }
  48. override bool IsJammed () { return false; }
  49. override bool IsRepairEnabled () { return true; }
  50. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; }
  51. };
  52. class RBL_CLO_BU0_MA1 extends WeaponStableState
  53. {
  54. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { close nobull mag"); } super.OnEntry(e); }
  55. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } close nobull mag"); } }
  56. override int GetCurrentStateID () { return RBLStableStateID.RBL_CLO_BU0_MA1; }
  57. override bool HasBullet () { return false; }
  58. override bool HasMagazine () { return true; }
  59. override bool IsJammed () { return false; }
  60. override bool IsRepairEnabled () { return true; }
  61. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  62. };
  63. class RBL_OPN_BU0_MA1 extends WeaponStableState
  64. {
  65. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { lock nobull mag"); } m_weapon.SetWeaponOpen(true); super.OnEntry(e); }
  66. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } open nobull mag"); } }
  67. override int GetCurrentStateID () { return RBLStableStateID.RBL_OPN_BU0_MA1; }
  68. override bool HasBullet () { return false; }
  69. override bool HasMagazine () { return true; }
  70. override bool IsJammed () { return false; }
  71. override bool IsBoltOpen () { return true; }
  72. override bool IsRepairEnabled () { return true; }
  73. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  74. };
  75. class RBL_OPN_BU0_MA0 extends WeaponStableState
  76. {
  77. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { lock nobull nomag"); } m_weapon.SetWeaponOpen(true); super.OnEntry(e); }
  78. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } open nobull nomag"); } }
  79. override int GetCurrentStateID () { return RBLStableStateID.RBL_OPN_BU0_MA0; }
  80. override bool HasBullet () { return false; }
  81. override bool HasMagazine () { return false; }
  82. override bool IsJammed () { return false; }
  83. override bool IsBoltOpen () { return true; }
  84. override bool IsRepairEnabled () { return true; }
  85. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  86. };
  87. class RBL_JAM_BU1_MA0 extends WeaponStateJammed
  88. {
  89. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { jammed bullet nomag"); } super.OnEntry(e); }
  90. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } jammed bullet nomag"); } }
  91. override int GetCurrentStateID () { return RBLStableStateID.RBL_JAM_BU1_MA0; }
  92. override bool HasBullet () { return true; }
  93. override bool HasMagazine () { return false; }
  94. override bool IsJammed () { return true; }
  95. override bool IsBoltOpen () { return true; }
  96. override bool IsRepairEnabled () { return true; }
  97. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
  98. };
  99. class RBL_JAM_BU1_MA1 extends WeaponStateJammed
  100. {
  101. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { jammed bullet mag"); } super.OnEntry(e); }
  102. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } jammed bullet mag"); } }
  103. override int GetCurrentStateID () { return RBLStableStateID.RBL_JAM_BU1_MA1; }
  104. override bool HasBullet () { return true; }
  105. override bool HasMagazine () { return true; }
  106. override bool IsJammed () { return true; }
  107. override bool IsBoltOpen () { return true; }
  108. override bool IsRepairEnabled () { return true; }
  109. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
  110. };
  111. /**@class Rifle_Base
  112. * @brief base for rifles
  113. * @NOTE name copies config base class
  114. **/
  115. class RifleBoltLock_Base extends Rifle_Base
  116. {
  117. ref WeaponStableState C00;
  118. ref WeaponStableState C10;
  119. ref WeaponStableState C11;
  120. ref WeaponStableState C01;
  121. ref WeaponStableState O00;
  122. ref WeaponStableState O01;
  123. ref WeaponStableState JF0;
  124. ref WeaponStableState JF1;
  125. void RifleBoltLock_Base ()
  126. {
  127. }
  128. override void InitStateMachine()
  129. {
  130. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET)));
  131. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET)));
  132. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_NOBULLET)));
  133. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET)));
  134. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET_OPEN)));
  135. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_NOBULLET_OPEN)));
  136. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH)));
  137. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED)));
  138. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_UNIQUE_CLOSED)));
  139. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED)));
  140. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED)));//????
  141. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START)));
  142. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_END)));
  143. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL)));
  144. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_LAST)));
  145. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM)));
  146. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY)));
  147. //m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED));
  148. // setup state machine
  149. // basic weapon states
  150. // close-locked-jammed | nobullet-bullet | nomag-mag
  151. // regexp: [CLJ][01][01]
  152. C00 = new RBL_CLO_BU0_MA0(this, NULL, RBLAnimState.DEFAULT);
  153. C10 = new RBL_CLO_BU1_MA0(this, NULL, RBLAnimState.DEFAULT);
  154. C11 = new RBL_CLO_BU1_MA1(this, NULL, RBLAnimState.DEFAULT);
  155. C01 = new RBL_CLO_BU0_MA1(this, NULL, RBLAnimState.DEFAULT);
  156. O00 = new RBL_OPN_BU0_MA0(this, NULL, RBLAnimState.OPENED);
  157. O01 = new RBL_OPN_BU0_MA1(this, NULL, RBLAnimState.OPENED);
  158. JF0 = new RBL_JAM_BU1_MA0(this, NULL, RBLAnimState.JAMMED);
  159. JF1 = new RBL_JAM_BU1_MA1(this, NULL, RBLAnimState.JAMMED);
  160. // unstable (intermediate) states
  161. WeaponCharging Mech_C00 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  162. WeaponCharging Mech_C01 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  163. WeaponCharging Mech_O00 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED));
  164. WeaponCharging Mech_O01 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED));
  165. WeaponCharging Mech_C10 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  166. WeaponCharging Mech_C11 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  167. WeaponStateBase Trigger_C00 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY)); // cock without clip
  168. WeaponStateBase Trigger_C10 = new WeaponFireLast(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL)); // cock with clip
  169. WeaponFireAndChamberNext Trigger_C11 = new WeaponFireAndChamberNext(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
  170. WeaponStateBase Trigger_C11L = new WeaponFireLast(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_LAST));
  171. WeaponStateBase Trigger_C01 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  172. WeaponStateBase Trigger_O00 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  173. WeaponStateBase Trigger_O01 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  174. WeaponStateBase Trigger_JF0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  175. WeaponStateBase Trigger_JF1 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  176. //Fire and jam
  177. WeaponStateBase Trigger_C10J = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM)); // cock with clip
  178. WeaponStateBase Trigger_C11J = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM));
  179. // WeaponStateBase Trigger_C11J = new WeaponFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM));
  180. WeaponStateBase Unjam_JF0 = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
  181. WeaponStateBase Unjam_JF1 = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
  182. WeaponChambering Chamber_C00 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED));
  183. WeaponChambering Chamber_C01 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED));
  184. WeaponChambering Chamber_O00 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_UNIQUE_CLOSED));
  185. WeaponChambering Chamber_O01 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_UNIQUE_CLOSED));
  186. WeaponAttachMagazine Attach_C00 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET));
  187. WeaponAttachMagazine Attach_C10 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET));
  188. WeaponAttachMagazine Attach_O00 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET_OPEN));//TODO Need add open animation
  189. WeaponAttachMagazine Attach_JF0 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET));
  190. WeaponReplacingMagAndChamberNext Reload_C11 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET));
  191. WeaponReplacingMagAndChamberNext Reload_C01 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_NOBULLET));
  192. WeaponReplacingMagAndChamberNext Reload_O01 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_NOBULLET_OPEN));//TODO Need add open animation
  193. WeaponReplacingMagAndChamberNext Reload_JF1 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET));
  194. WeaponDetachingMag Detach_C11 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
  195. WeaponDetachingMag Detach_C01 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
  196. WeaponDetachingMag Detach_O01 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
  197. WeaponDetachingMag Detach_JF1 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
  198. //WeaponStateBase chmMag = new WeaponChamberFromAttMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  199. // events
  200. WeaponEventBase __M__ = new WeaponEventMechanism;
  201. WeaponEventBase __T__ = new WeaponEventTrigger;
  202. WeaponEventBase __TJ_ = new WeaponEventTriggerToJam;
  203. WeaponEventBase __U__ = new WeaponEventUnjam;
  204. WeaponEventBase __L__ = new WeaponEventLoad1Bullet;
  205. WeaponEventBase __A__ = new WeaponEventAttachMagazine;
  206. WeaponEventBase __D__ = new WeaponEventDetachMagazine;
  207. WeaponEventBase __S__ = new WeaponEventSwapMagazine;
  208. WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
  209. WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
  210. WeaponEventBase _rto_ = new WeaponEventReloadTimeout;
  211. WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
  212. m_fsm = new WeaponFSM();
  213. // order: Discharged-Charged | nobullet-bullet | nomag-mag
  214. // charging
  215. m_fsm.AddTransition(new WeaponTransition( C00, __M__, Mech_C00)); // charge from dischg nobullet nomag
  216. m_fsm.AddTransition(new WeaponTransition( Mech_C00, _fin_, C00));
  217. m_fsm.AddTransition(new WeaponTransition( Mech_C00, _abt_, C00));
  218. m_fsm.AddTransition(new WeaponTransition( C10, __M__, Mech_C10)); // charge from bullet nomag
  219. m_fsm.AddTransition(new WeaponTransition( Mech_C10, _fin_, C00, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  220. m_fsm.AddTransition(new WeaponTransition( Mech_C10, _fin_, C10));
  221. m_fsm.AddTransition(new WeaponTransition( Mech_C10, _abt_, C00, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  222. m_fsm.AddTransition(new WeaponTransition( Mech_C10, _abt_, C10));
  223. m_fsm.AddTransition(new WeaponTransition( C11, __M__, Mech_C11)); // charge from dischg nobullet nomag
  224. m_fsm.AddTransition(new WeaponTransition( Mech_C11, _fin_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  225. m_fsm.AddTransition(new WeaponTransition( Mech_C11, _fin_, C11));
  226. m_fsm.AddTransition(new WeaponTransition( Mech_C11, _abt_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  227. m_fsm.AddTransition(new WeaponTransition( Mech_C11, _abt_, C11));
  228. m_fsm.AddTransition(new WeaponTransition( C01, __M__, Mech_C01)); // charge from dischg nobullet nomag
  229. m_fsm.AddTransition(new WeaponTransition( Mech_C01, _fin_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  230. m_fsm.AddTransition(new WeaponTransition( Mech_C01, _fin_, C11));
  231. m_fsm.AddTransition(new WeaponTransition( Mech_C01, _abt_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  232. m_fsm.AddTransition(new WeaponTransition( Mech_C01, _abt_, C11));
  233. m_fsm.AddTransition(new WeaponTransition( O00, __M__, Mech_O00)); // charge from dischg nobullet nomag
  234. m_fsm.AddTransition(new WeaponTransition( Mech_O00, _fin_, O00, NULL, new WeaponGuardWeaponOpen(this)));
  235. m_fsm.AddTransition(new WeaponTransition( Mech_O00, _fin_, C00));
  236. m_fsm.AddTransition(new WeaponTransition( Mech_O00, _abt_, O00, NULL, new WeaponGuardWeaponOpen(this)));
  237. m_fsm.AddTransition(new WeaponTransition( Mech_O00, _abt_, C00));
  238. m_fsm.AddTransition(new WeaponTransition( O01, __M__, Mech_O01)); // charge from dischg nobullet nomag
  239. m_fsm.AddTransition(new WeaponTransition( Mech_O01, _fin_, O01, NULL, new WeaponGuardWeaponOpen(this)));
  240. m_fsm.AddTransition(new WeaponTransition( Mech_O01, _fin_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  241. m_fsm.AddTransition(new WeaponTransition( Mech_O01, _fin_, C11));
  242. m_fsm.AddTransition(new WeaponTransition( Mech_O01, _abt_, O01, NULL, new WeaponGuardWeaponOpen(this)));
  243. m_fsm.AddTransition(new WeaponTransition( Mech_O01, _abt_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  244. m_fsm.AddTransition(new WeaponTransition( Mech_O01, _abt_, C11));
  245. // fire
  246. m_fsm.AddTransition(new WeaponTransition( C00, __T__, Trigger_C00));
  247. m_fsm.AddTransition(new WeaponTransition( Trigger_C00, _fin_, C00));
  248. m_fsm.AddTransition(new WeaponTransition( Trigger_C00, _dto_, C00));
  249. m_fsm.AddTransition(new WeaponTransition( Trigger_C00, _abt_, C00));
  250. m_fsm.AddTransition(new WeaponTransition( C01, __T__, Trigger_C01));
  251. m_fsm.AddTransition(new WeaponTransition( Trigger_C01, _fin_, C01));
  252. m_fsm.AddTransition(new WeaponTransition( Trigger_C01, _dto_, C01));
  253. m_fsm.AddTransition(new WeaponTransition( Trigger_C01, _abt_, C01));
  254. m_fsm.AddTransition(new WeaponTransition( C10, __T__, Trigger_C10));
  255. m_fsm.AddTransition(new WeaponTransition( Trigger_C10, _fin_, C00));
  256. m_fsm.AddTransition(new WeaponTransition( Trigger_C10, _rto_, C00));
  257. m_fsm.AddTransition(new WeaponTransition( Trigger_C10, _abt_, C00));
  258. m_fsm.AddTransition(new WeaponTransition( C11, __T__, Trigger_C11, NULL, new WeaponGuardHasAmmo(this)));
  259. m_fsm.AddTransition(new WeaponTransition( Trigger_C11, _fin_, C11));
  260. m_fsm.AddTransition(new WeaponTransition( Trigger_C11, _rto_, C11));
  261. m_fsm.AddTransition(new WeaponTransition( Trigger_C11, _abt_, C11));
  262. m_fsm.AddTransition(new WeaponTransition( C11, __T__, Trigger_C11L));
  263. m_fsm.AddTransition(new WeaponTransition( Trigger_C11L, _fin_, O01));
  264. m_fsm.AddTransition(new WeaponTransition( Trigger_C11L, _rto_, O01));
  265. m_fsm.AddTransition(new WeaponTransition( Trigger_C11L, _abt_, O01));
  266. m_fsm.AddTransition(new WeaponTransition( O00, __T__, Trigger_O00));
  267. m_fsm.AddTransition(new WeaponTransition( Trigger_O00, _fin_, O00));
  268. m_fsm.AddTransition(new WeaponTransition( Trigger_O00, _dto_, O00));
  269. m_fsm.AddTransition(new WeaponTransition( Trigger_O00, _abt_, O00));
  270. m_fsm.AddTransition(new WeaponTransition( O01, __T__, Trigger_O01));
  271. m_fsm.AddTransition(new WeaponTransition( Trigger_O01, _fin_, O01));
  272. m_fsm.AddTransition(new WeaponTransition( Trigger_O01, _dto_, O01));
  273. m_fsm.AddTransition(new WeaponTransition( Trigger_O01, _abt_, O01));
  274. m_fsm.AddTransition(new WeaponTransition( JF0, __T__, Trigger_JF0)); // opened fire.uncocked w mag
  275. m_fsm.AddTransition(new WeaponTransition( Trigger_JF0, _fin_, JF0));
  276. m_fsm.AddTransition(new WeaponTransition( Trigger_JF0, _dto_, JF0));
  277. m_fsm.AddTransition(new WeaponTransition( Trigger_JF0, _abt_, JF0));
  278. m_fsm.AddTransition(new WeaponTransition( JF1, __T__, Trigger_JF1)); // opened fire.uncocked w mag
  279. m_fsm.AddTransition(new WeaponTransition( Trigger_JF1, _fin_, JF1));
  280. m_fsm.AddTransition(new WeaponTransition( Trigger_JF1, _dto_, JF1));
  281. m_fsm.AddTransition(new WeaponTransition( Trigger_JF1, _abt_, JF1));
  282. m_fsm.AddTransition(new WeaponTransition( C10, __TJ_, Trigger_C10J));
  283. m_fsm.AddTransition(new WeaponTransition( Trigger_C10J, _fin_, JF0));
  284. m_fsm.AddTransition(new WeaponTransition( Trigger_C10J, _rto_, JF0));
  285. m_fsm.AddTransition(new WeaponTransition( Trigger_C10J, _abt_, JF0));
  286. m_fsm.AddTransition(new WeaponTransition( C11, __TJ_, Trigger_C11J));
  287. m_fsm.AddTransition(new WeaponTransition( Trigger_C11J, _fin_, JF1));
  288. m_fsm.AddTransition(new WeaponTransition( Trigger_C11J, _rto_, JF1));
  289. m_fsm.AddTransition(new WeaponTransition( Trigger_C11J, _abt_, JF1));
  290. // load cartridge
  291. m_fsm.AddTransition(new WeaponTransition( C00, __L__, Chamber_C00)); // chamber from closed=1
  292. m_fsm.AddTransition(new WeaponTransition( Chamber_C00, _fin_, O00, NULL, new WeaponGuardWeaponOpen(this)));
  293. m_fsm.AddTransition(new WeaponTransition( Chamber_C00, _fin_, C00, NULL, new WeaponGuardChamberEmpty(this)));
  294. m_fsm.AddTransition(new WeaponTransition( Chamber_C00, _fin_, C10));
  295. m_fsm.AddTransition(new WeaponTransition( Chamber_C00, _abt_, O00, NULL, new WeaponGuardWeaponOpen(this)));
  296. m_fsm.AddTransition(new WeaponTransition( Chamber_C00, _abt_, C00, NULL, new WeaponGuardChamberEmpty(this)));
  297. m_fsm.AddTransition(new WeaponTransition( Chamber_C00, _abt_, C10));
  298. m_fsm.AddTransition(new WeaponTransition( C01, __L__, Chamber_C01)); // chamber from closed charged
  299. m_fsm.AddTransition(new WeaponTransition( Chamber_C01, _fin_, O01, NULL, new WeaponGuardWeaponOpen(this)));
  300. m_fsm.AddTransition(new WeaponTransition( Chamber_C01, _fin_, C01, NULL, new WeaponGuardChamberEmpty(this)));
  301. m_fsm.AddTransition(new WeaponTransition( Chamber_C01, _fin_, C11));
  302. m_fsm.AddTransition(new WeaponTransition( Chamber_C01, _abt_, O01, NULL, new WeaponGuardWeaponOpen(this)));
  303. m_fsm.AddTransition(new WeaponTransition( Chamber_C01, _abt_, C01, NULL, new WeaponGuardChamberEmpty(this)));
  304. m_fsm.AddTransition(new WeaponTransition( Chamber_C01, _abt_, C11));
  305. m_fsm.AddTransition(new WeaponTransition( O00, __L__, Chamber_O00)); // chamber from closed charged
  306. m_fsm.AddTransition(new WeaponTransition( Chamber_O00, _fin_ , O00, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  307. m_fsm.AddTransition(new WeaponTransition( Chamber_O00, _fin_ , C10));
  308. m_fsm.AddTransition(new WeaponTransition( Chamber_O00, _abt_ , O00, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  309. m_fsm.AddTransition(new WeaponTransition( Chamber_O00, _abt_ , C10));
  310. m_fsm.AddTransition(new WeaponTransition( O01, __L__, Chamber_O01)); // chamber from closed charged
  311. m_fsm.AddTransition(new WeaponTransition( Chamber_O01, _fin_, O01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  312. m_fsm.AddTransition(new WeaponTransition( Chamber_O01, _fin_, C11));
  313. m_fsm.AddTransition(new WeaponTransition( Chamber_O01, _abt_, O01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  314. m_fsm.AddTransition(new WeaponTransition( Chamber_O01, _abt_, C11));
  315. // attach magazine (no mag in weapon)
  316. m_fsm.AddTransition(new WeaponTransition( C00, __A__, Attach_C00, NULL, new WeaponGuardCanAttachMag(this))); // attach from CLO/b0/m0
  317. m_fsm.AddTransition(new WeaponTransition( Attach_C00, _fin_, C00, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
  318. m_fsm.AddTransition(new WeaponTransition( Attach_C00, _fin_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this)) );
  319. m_fsm.AddTransition(new WeaponTransition( Attach_C00, _fin_, C11));
  320. m_fsm.AddTransition(new WeaponTransition( Attach_C00, _abt_, C00, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
  321. m_fsm.AddTransition(new WeaponTransition( Attach_C00, _abt_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this)) );
  322. m_fsm.AddTransition(new WeaponTransition( Attach_C00, _abt_, C11));
  323. m_fsm.AddTransition(new WeaponTransition( C10, __A__, Attach_C10, NULL, new WeaponGuardCanAttachMag(this))); // attach from CLO/b1/m0
  324. m_fsm.AddTransition(new WeaponTransition( Attach_C10, _fin_, C11, NULL, new WeaponGuardHasMag(this)) );
  325. m_fsm.AddTransition(new WeaponTransition( Attach_C10, _fin_, C10 ));
  326. m_fsm.AddTransition(new WeaponTransition( Attach_C10, _abt_, C11, NULL, new WeaponGuardHasMag(this)) );
  327. m_fsm.AddTransition(new WeaponTransition( Attach_C10, _abt_, C10 ));
  328. m_fsm.AddTransition(new WeaponTransition( O00, __A__, Attach_O00, NULL, new WeaponGuardCanAttachMag(this))); // attach from CLO/b0/m0
  329. m_fsm.AddTransition(new WeaponTransition( Attach_O00, _fin_, O00, NULL, new GuardNot(new WeaponGuardHasMag(this))));
  330. m_fsm.AddTransition(new WeaponTransition( Attach_O00, _fin_, O01, NULL, new WeaponGuardWeaponOpen(this)));
  331. m_fsm.AddTransition(new WeaponTransition( Attach_O00, _fin_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  332. m_fsm.AddTransition(new WeaponTransition( Attach_O00, _fin_, C11));
  333. m_fsm.AddTransition(new WeaponTransition( Attach_O00, _abt_, O00, NULL, new GuardNot(new WeaponGuardHasMag(this))));
  334. m_fsm.AddTransition(new WeaponTransition( Attach_O00, _abt_, O01, NULL, new WeaponGuardWeaponOpen(this)));
  335. m_fsm.AddTransition(new WeaponTransition( Attach_O00, _abt_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  336. m_fsm.AddTransition(new WeaponTransition( Attach_O00, _abt_, C11));
  337. m_fsm.AddTransition(new WeaponTransition( JF0, __A__, Attach_JF0, NULL, new WeaponGuardCanAttachMag(this))); // attach from JAM/b1/m0
  338. m_fsm.AddTransition(new WeaponTransition( Attach_JF0, _fin_, JF1, NULL, new WeaponGuardHasMag(this)));
  339. m_fsm.AddTransition(new WeaponTransition( Attach_JF0, _fin_, JF0));
  340. m_fsm.AddTransition(new WeaponTransition( Attach_JF0, _abt_, JF1, NULL, new WeaponGuardHasMag(this)));
  341. m_fsm.AddTransition(new WeaponTransition( Attach_JF0, _abt_, JF0));
  342. // replace magazine
  343. m_fsm.AddTransition(new WeaponTransition( C11, __S__, Reload_C11, NULL, new WeaponGuardCanSwapMag(this))); // swap in Chg/b1/m1
  344. m_fsm.AddTransition(new WeaponTransition( Reload_C11, _fin_, C11, NULL, new WeaponGuardHasMag(this)));
  345. m_fsm.AddTransition(new WeaponTransition( Reload_C11, _fin_, C10));
  346. m_fsm.AddTransition(new WeaponTransition( Reload_C11, _abt_, C11, NULL, new WeaponGuardHasMag(this)));
  347. m_fsm.AddTransition(new WeaponTransition( Reload_C11, _abt_, C10));
  348. m_fsm.AddTransition(new WeaponTransition( C01, __S__, Reload_C01, NULL, new WeaponGuardCanSwapMag(this))); // swap in CLO/b0/m1
  349. m_fsm.AddTransition(new WeaponTransition( Reload_C01, _fin_, C11, NULL, new WeaponGuardCurrentChamberFull(this)) );
  350. m_fsm.AddTransition(new WeaponTransition( Reload_C01, _fin_, C01, NULL, new WeaponGuardHasMag(this)) );
  351. m_fsm.AddTransition(new WeaponTransition( Reload_C01, _fin_, C00));
  352. m_fsm.AddTransition(new WeaponTransition( Reload_C01, _abt_, C11, NULL, new WeaponGuardCurrentChamberFull(this)) );
  353. m_fsm.AddTransition(new WeaponTransition( Reload_C01, _abt_, C01, NULL, new WeaponGuardHasMag(this)) );
  354. m_fsm.AddTransition(new WeaponTransition( Reload_C01, _abt_, C00));
  355. m_fsm.AddTransition(new WeaponTransition( O01, __S__, Reload_O01, NULL, new WeaponGuardCanSwapMag(this))); // swap in CLO/b0/m1
  356. m_fsm.AddTransition(new WeaponTransition( Reload_O01, _fin_, O00, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
  357. m_fsm.AddTransition(new WeaponTransition( Reload_O01, _fin_, O01, NULL, new WeaponGuardWeaponOpen(this)));
  358. m_fsm.AddTransition(new WeaponTransition( Reload_O01, _fin_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  359. m_fsm.AddTransition(new WeaponTransition( Reload_O01, _fin_, C11));
  360. m_fsm.AddTransition(new WeaponTransition( Reload_O01, _abt_, O00, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
  361. m_fsm.AddTransition(new WeaponTransition( Reload_O01, _abt_, O01, NULL, new WeaponGuardWeaponOpen(this)));
  362. m_fsm.AddTransition(new WeaponTransition( Reload_O01, _abt_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  363. m_fsm.AddTransition(new WeaponTransition( Reload_O01, _abt_, C11));
  364. m_fsm.AddTransition(new WeaponTransition( JF1, __S__, Reload_JF1, NULL, new WeaponGuardCanSwapMag(this))); // swap in JAM/b1/m1
  365. m_fsm.AddTransition(new WeaponTransition( Reload_JF1, _fin_, JF1, NULL, new WeaponGuardHasMag(this)));
  366. m_fsm.AddTransition(new WeaponTransition( Reload_JF1, _fin_, JF0));
  367. m_fsm.AddTransition(new WeaponTransition( Reload_JF1, _abt_, JF1, NULL, new WeaponGuardHasMag(this)));
  368. m_fsm.AddTransition(new WeaponTransition( Reload_JF1, _abt_, JF0));
  369. // @TODO: abort in jam
  370. // detach magazine
  371. m_fsm.AddTransition(new WeaponTransition( C11, __D__, Detach_C11, NULL, new WeaponGuardCanDetachMag(this))); // detach from Chg/b1/m1
  372. m_fsm.AddTransition(new WeaponTransition( Detach_C11, _fin_, C11, NULL, new WeaponGuardHasMag(this)));
  373. m_fsm.AddTransition(new WeaponTransition( Detach_C11, _fin_, C10));
  374. m_fsm.AddTransition(new WeaponTransition( Detach_C11, _abt_, C11, NULL, new WeaponGuardHasMag(this)));
  375. m_fsm.AddTransition(new WeaponTransition( Detach_C11, _abt_, C10));
  376. m_fsm.AddTransition(new WeaponTransition( C01, __D__, Detach_C01, NULL, new WeaponGuardCanDetachMag(this))); // detach from Chg/b0/m1
  377. m_fsm.AddTransition(new WeaponTransition( Detach_C01, _fin_, C01, NULL, new WeaponGuardHasMag(this)));
  378. m_fsm.AddTransition(new WeaponTransition( Detach_C01, _fin_, C00));
  379. m_fsm.AddTransition(new WeaponTransition( Detach_C01, _abt_, C01, NULL, new WeaponGuardHasMag(this)));
  380. m_fsm.AddTransition(new WeaponTransition( Detach_C01, _abt_, C00));
  381. m_fsm.AddTransition(new WeaponTransition( O01, __D__, Detach_O01, NULL, new WeaponGuardCanDetachMag(this))); // detach from Dic/b0/m1
  382. m_fsm.AddTransition(new WeaponTransition( Detach_O01, _fin_, O01, NULL, new WeaponGuardHasMag(this)));
  383. m_fsm.AddTransition(new WeaponTransition( Detach_O01, _fin_, O00));
  384. m_fsm.AddTransition(new WeaponTransition( Detach_O01, _abt_, O01, NULL, new WeaponGuardHasMag(this)));
  385. m_fsm.AddTransition(new WeaponTransition( Detach_O01, _abt_, O00));
  386. m_fsm.AddTransition(new WeaponTransition( JF1, __D__, Detach_JF1, NULL, new WeaponGuardCanDetachMag(this))); // detach from CLO/b1/m1 jammed
  387. m_fsm.AddTransition(new WeaponTransition( Detach_JF1, _fin_, JF1, NULL, new WeaponGuardHasMag(this)));
  388. m_fsm.AddTransition(new WeaponTransition( Detach_JF1, _fin_, JF0));
  389. m_fsm.AddTransition(new WeaponTransition( Detach_JF1, _abt_, JF1, NULL, new WeaponGuardHasMag(this)));
  390. m_fsm.AddTransition(new WeaponTransition( Detach_JF1, _abt_, JF0));
  391. // unjam
  392. m_fsm.AddTransition(new WeaponTransition( JF0, __U__, Unjam_JF0)); // unjam nomag
  393. m_fsm.AddTransition(new WeaponTransition( Unjam_JF0, _fin_, JF0, NULL, new WeaponGuardJammed(this)));
  394. m_fsm.AddTransition(new WeaponTransition( Unjam_JF0, _fin_, C00));
  395. m_fsm.AddTransition(new WeaponTransition( Unjam_JF0, _abt_, JF0, NULL, new WeaponGuardJammed(this)));
  396. m_fsm.AddTransition(new WeaponTransition( Unjam_JF0, _abt_, C00));
  397. m_fsm.AddTransition(new WeaponTransition( JF1, __U__, Unjam_JF1)); // unjam with mag with ammo
  398. m_fsm.AddTransition(new WeaponTransition( Unjam_JF1, _fin_, JF1, NULL, new WeaponGuardJammed(this)));
  399. m_fsm.AddTransition(new WeaponTransition( Unjam_JF1, _fin_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  400. m_fsm.AddTransition(new WeaponTransition( Unjam_JF1, _fin_, C11));
  401. m_fsm.AddTransition(new WeaponTransition( Unjam_JF1, _abt_, JF1, NULL, new WeaponGuardJammed(this)));
  402. m_fsm.AddTransition(new WeaponTransition( Unjam_JF1, _abt_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  403. m_fsm.AddTransition(new WeaponTransition( Unjam_JF1, _abt_, C11));
  404. SetInitialState(C00);
  405. SelectionBulletHide();
  406. HideMagazine();
  407. m_fsm.Start();
  408. }
  409. override float GetChanceToJam()
  410. {
  411. float chanceToJam = super.GetChanceToJam();
  412. Magazine mag = GetMagazine(GetCurrentMuzzle());
  413. if(mag)
  414. {
  415. chanceToJam = chanceToJam + ((1.0 - chanceToJam) * mag.GetChanceToJam());
  416. }
  417. else
  418. {
  419. chanceToJam = chanceToJam + ((1.0 - chanceToJam) * 0.06);
  420. }
  421. return chanceToJam;
  422. }
  423. override void SetActions()
  424. {
  425. super.SetActions();
  426. AddAction(FirearmActionDetachMagazine);
  427. }
  428. };