rifleboltfree_base.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. enum RBFAnimState
  2. {
  3. DEFAULT = 0, ///< default weapon state, closed and discharged
  4. JAMMED = 1,
  5. };
  6. enum RBFStableStateID
  7. {
  8. UNKNOWN = 0,
  9. RBF_CLO_BU0_MA0 = 1,
  10. RBF_CLO_BU1_MA0 = 2,
  11. RBF_CLO_BU1_MA1 = 3,
  12. RBF_CLO_BU0_MA1 = 4,
  13. RBF_JAM_BU1_MA0 = 5,
  14. RBF_JAM_BU1_MA1 = 6
  15. }
  16. class RBF_CLO_BU0_MA0 extends WeaponStableState
  17. {
  18. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { close nobull nomag"); } super.OnEntry(e); }
  19. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } close nobull nomag"); } }
  20. override int GetCurrentStateID () { return RBFStableStateID.RBF_CLO_BU0_MA0; }
  21. override bool HasBullet () { return false; }
  22. override bool HasMagazine () { return false; }
  23. override bool IsJammed () { return false; }
  24. override bool IsRepairEnabled () { return true; }
  25. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  26. };
  27. class RBF_CLO_BU1_MA0 extends WeaponStableState
  28. {
  29. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { close bullet nomag"); } super.OnEntry(e);}
  30. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } close bullet nomag"); } }
  31. override int GetCurrentStateID () { return RBFStableStateID.RBF_CLO_BU1_MA0; }
  32. override bool HasBullet () { return true; }
  33. override bool HasMagazine () { return false; }
  34. override bool IsJammed () { return false; }
  35. override bool IsRepairEnabled () { return true; }
  36. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; }
  37. };
  38. class RBF_CLO_BU1_MA1 extends WeaponStableState
  39. {
  40. override void OnEntry (WeaponEventBase e) { /*Print("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { close bullet mag");*/ super.OnEntry(e);}
  41. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } close bullet mag"); } }
  42. override int GetCurrentStateID () { return RBFStableStateID.RBF_CLO_BU1_MA1; }
  43. override bool HasBullet () { return true; }
  44. override bool HasMagazine () { return true; }
  45. override bool IsJammed () { return false; }
  46. override bool IsRepairEnabled () { return true; }
  47. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; }
  48. };
  49. class RBF_CLO_BU0_MA1 extends WeaponStableState
  50. {
  51. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { close nobull mag"); } super.OnEntry(e); }
  52. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } close nobull mag"); } }
  53. override int GetCurrentStateID () { return RBFStableStateID.RBF_CLO_BU0_MA1; }
  54. override bool HasBullet () { return false; }
  55. override bool HasMagazine () { return true; }
  56. override bool IsJammed () { return false; }
  57. override bool IsRepairEnabled () { return true; }
  58. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  59. };
  60. class RBF_JAM_BU1_MA0 extends WeaponStateJammed
  61. {
  62. override void OnEntry (WeaponEventBase e) { Print("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { jammed bullet nomag"); super.OnEntry(e); }
  63. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } jammed bullet nomag"); } }
  64. override int GetCurrentStateID () { return RBFStableStateID.RBF_JAM_BU1_MA0; }
  65. override bool HasBullet () { return true; }
  66. override bool HasMagazine () { return false; }
  67. override bool IsJammed () { return true; }
  68. override bool IsBoltOpen () { return true; }
  69. override bool IsRepairEnabled () { return true; }
  70. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
  71. };
  72. class RBF_JAM_BU1_MA1 extends WeaponStateJammed
  73. {
  74. override void OnEntry (WeaponEventBase e) { Print("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { jammed bullet mag"); super.OnEntry(e); }
  75. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } jammed bullet mag"); } }
  76. override int GetCurrentStateID () { return RBFStableStateID.RBF_JAM_BU1_MA1; }
  77. override bool HasBullet () { return true; }
  78. override bool HasMagazine () { return true; }
  79. override bool IsJammed () { return true; }
  80. override bool IsBoltOpen () { return true; }
  81. override bool IsRepairEnabled () { return true; }
  82. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
  83. };
  84. /**@class Rifle_Base
  85. * @brief base for rifles
  86. * @NOTE name copies config base class
  87. **/
  88. class RifleBoltFree_Base extends Rifle_Base
  89. {
  90. ref WeaponStableState C00;
  91. ref WeaponStableState C10;
  92. ref WeaponStableState C11;
  93. ref WeaponStableState C01;
  94. ref WeaponStableState JF0;
  95. ref WeaponStableState JF1;
  96. void RifleBoltFree_Base ()
  97. {
  98. }
  99. override void InitStateMachine()
  100. {
  101. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET)));
  102. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET)));
  103. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_NOBULLET)));
  104. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET)));
  105. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH)));
  106. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED)));
  107. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED)));
  108. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START)));
  109. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_END)));
  110. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM)));
  111. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL)));
  112. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY)));
  113. // setup state machine
  114. // basic weapon states
  115. // close-locked-jammed | nobullet-bullet | nomag-mag
  116. // regexp: [CLJ][01][01]
  117. C00 = new RBF_CLO_BU0_MA0(this, NULL, RBLAnimState.DEFAULT);
  118. C10 = new RBF_CLO_BU1_MA0(this, NULL, RBLAnimState.DEFAULT);
  119. C11 = new RBF_CLO_BU1_MA1(this, NULL, RBLAnimState.DEFAULT);
  120. C01 = new RBF_CLO_BU0_MA1(this, NULL, RBLAnimState.DEFAULT);
  121. JF0 = new RBF_JAM_BU1_MA0(this, NULL, RBLAnimState.JAMMED);
  122. JF1 = new RBF_JAM_BU1_MA1(this, NULL, RBLAnimState.JAMMED);
  123. // unstable (intermediate) states
  124. WeaponCharging Mech_C00 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  125. WeaponCharging Mech_C01 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  126. WeaponCharging Mech_C10 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  127. WeaponCharging Mech_C11 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  128. WeaponStateBase Trigger_C00 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY)); // cock without clip
  129. WeaponStateBase Trigger_C10 = new WeaponFireLast(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL)); // cock with clip
  130. WeaponFireAndChamberNext Trigger_C11 = new WeaponFireAndChamberNext(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
  131. WeaponStateBase Trigger_C11L = new WeaponFireLast(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
  132. WeaponStateBase Trigger_C01 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  133. WeaponStateBase Trigger_JF0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  134. WeaponStateBase Trigger_JF1 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  135. //Fire and jammed
  136. WeaponStateBase Trigger_C10J = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM)); // cock with clip
  137. WeaponStateBase Trigger_C11J = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM));
  138. // Unjam
  139. WeaponStateBase Unjam_JF0 = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
  140. WeaponStateBase Unjam_JF1 = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
  141. WeaponChambering Chamber_C00 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED));
  142. WeaponChambering Chamber_C01 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED));
  143. WeaponAttachMagazine Attach_C00 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET));
  144. WeaponAttachMagazine Attach_C10 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET));
  145. WeaponAttachMagazine Attach_JF0 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET));
  146. WeaponReplacingMagAndChamberNext Reload_C11 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET));
  147. WeaponReplacingMagAndChamberNext Reload_C01 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_NOBULLET));
  148. WeaponReplacingMagAndChamberNext Reload_JF1 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET));
  149. WeaponDetachingMag Detach_C11 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
  150. WeaponDetachingMag Detach_C01 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
  151. WeaponDetachingMag Detach_JF1 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
  152. // events
  153. WeaponEventBase __M__ = new WeaponEventMechanism;
  154. WeaponEventBase __T__ = new WeaponEventTrigger;
  155. WeaponEventBase __TJ_ = new WeaponEventTriggerToJam;
  156. WeaponEventBase __U__ = new WeaponEventUnjam;
  157. WeaponEventBase __L__ = new WeaponEventLoad1Bullet;
  158. WeaponEventBase __A__ = new WeaponEventAttachMagazine;
  159. WeaponEventBase __D__ = new WeaponEventDetachMagazine;
  160. WeaponEventBase __S__ = new WeaponEventSwapMagazine;
  161. WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
  162. WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
  163. WeaponEventBase _rto_ = new WeaponEventReloadTimeout;
  164. WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
  165. m_fsm = new WeaponFSM();
  166. // order: Discharged-Charged | nobullet-bullet | nomag-mag
  167. // charging
  168. m_fsm.AddTransition(new WeaponTransition( C00, __M__, Mech_C00)); // charge from dischg nobullet nomag
  169. m_fsm.AddTransition(new WeaponTransition( Mech_C00, _fin_, C00));
  170. m_fsm.AddTransition(new WeaponTransition( Mech_C00, _abt_, C00));
  171. m_fsm.AddTransition(new WeaponTransition( C10, __M__, Mech_C10)); // charge from bullet nomag
  172. m_fsm.AddTransition(new WeaponTransition( Mech_C10, _fin_, C00, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  173. m_fsm.AddTransition(new WeaponTransition( Mech_C10, _fin_, C10));
  174. m_fsm.AddTransition(new WeaponTransition( Mech_C10, _abt_, C00, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  175. m_fsm.AddTransition(new WeaponTransition( Mech_C10, _abt_, C10));
  176. m_fsm.AddTransition(new WeaponTransition( C11, __M__, Mech_C11)); // charge from dischg nobullet nomag
  177. m_fsm.AddTransition(new WeaponTransition( Mech_C11, _fin_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  178. m_fsm.AddTransition(new WeaponTransition( Mech_C11, _fin_, C11));
  179. m_fsm.AddTransition(new WeaponTransition( Mech_C11, _abt_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  180. m_fsm.AddTransition(new WeaponTransition( Mech_C11, _abt_, C11));
  181. m_fsm.AddTransition(new WeaponTransition( C01, __M__, Mech_C01)); // charge from dischg nobullet nomag
  182. m_fsm.AddTransition(new WeaponTransition( Mech_C01, _fin_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  183. m_fsm.AddTransition(new WeaponTransition( Mech_C01, _fin_, C11));
  184. m_fsm.AddTransition(new WeaponTransition( Mech_C01, _abt_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  185. m_fsm.AddTransition(new WeaponTransition( Mech_C01, _abt_, C11));
  186. // fire
  187. m_fsm.AddTransition(new WeaponTransition( C00, __T__, Trigger_C00));
  188. m_fsm.AddTransition(new WeaponTransition( Trigger_C00, _fin_, C00));
  189. m_fsm.AddTransition(new WeaponTransition( Trigger_C00, _dto_, C00));
  190. m_fsm.AddTransition(new WeaponTransition( Trigger_C00, _abt_, C00));
  191. m_fsm.AddTransition(new WeaponTransition( C01, __T__, Trigger_C01));
  192. m_fsm.AddTransition(new WeaponTransition( Trigger_C01, _fin_, C01));
  193. m_fsm.AddTransition(new WeaponTransition( Trigger_C01, _dto_, C01));
  194. m_fsm.AddTransition(new WeaponTransition( Trigger_C01, _abt_, C01));
  195. m_fsm.AddTransition(new WeaponTransition( C10, __T__, Trigger_C10));
  196. m_fsm.AddTransition(new WeaponTransition( Trigger_C10, _fin_, C00));
  197. m_fsm.AddTransition(new WeaponTransition( Trigger_C10, _rto_, C00));
  198. m_fsm.AddTransition(new WeaponTransition( Trigger_C10, _abt_, C00));
  199. m_fsm.AddTransition(new WeaponTransition( JF1, __T__, Trigger_JF1));
  200. m_fsm.AddTransition(new WeaponTransition( Trigger_JF1, _fin_, JF1));
  201. m_fsm.AddTransition(new WeaponTransition( Trigger_JF1, _rto_, JF1));
  202. m_fsm.AddTransition(new WeaponTransition( Trigger_JF1, _abt_, JF1));
  203. m_fsm.AddTransition(new WeaponTransition( JF0, __T__, Trigger_JF0));
  204. m_fsm.AddTransition(new WeaponTransition( Trigger_JF0, _fin_, JF0));
  205. m_fsm.AddTransition(new WeaponTransition( Trigger_JF0, _rto_, JF0));
  206. m_fsm.AddTransition(new WeaponTransition( Trigger_JF0, _abt_, JF0));
  207. m_fsm.AddTransition(new WeaponTransition( C11, __T__, Trigger_C11, NULL, new WeaponGuardHasAmmo(this)));
  208. m_fsm.AddTransition(new WeaponTransition( Trigger_C11, _fin_, C11));
  209. m_fsm.AddTransition(new WeaponTransition( Trigger_C11, _rto_, C11));
  210. m_fsm.AddTransition(new WeaponTransition( Trigger_C11, _abt_, C11));
  211. m_fsm.AddTransition(new WeaponTransition( C11, __T__, Trigger_C11L));
  212. m_fsm.AddTransition(new WeaponTransition( Trigger_C11L, _fin_, C01));
  213. m_fsm.AddTransition(new WeaponTransition( Trigger_C11L, _rto_, C01));
  214. m_fsm.AddTransition(new WeaponTransition( Trigger_C11L, _abt_, C01));
  215. m_fsm.AddTransition(new WeaponTransition( C11, __TJ_, Trigger_C11J));
  216. m_fsm.AddTransition(new WeaponTransition( Trigger_C11J, _fin_, JF1));
  217. m_fsm.AddTransition(new WeaponTransition( Trigger_C11J, _rto_, JF1));
  218. m_fsm.AddTransition(new WeaponTransition( Trigger_C11J, _abt_, JF1));
  219. m_fsm.AddTransition(new WeaponTransition( C10, __TJ_, Trigger_C10J));
  220. m_fsm.AddTransition(new WeaponTransition( Trigger_C10J, _fin_, JF0));
  221. m_fsm.AddTransition(new WeaponTransition( Trigger_C10J, _rto_, JF0));
  222. m_fsm.AddTransition(new WeaponTransition( Trigger_C10J, _abt_, JF0));
  223. // load cartridge
  224. m_fsm.AddTransition(new WeaponTransition( C00, __L__, Chamber_C00)); // chamber from closed=1
  225. m_fsm.AddTransition(new WeaponTransition( Chamber_C00, _fin_, C00, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  226. m_fsm.AddTransition(new WeaponTransition( Chamber_C00, _fin_, C10));
  227. m_fsm.AddTransition(new WeaponTransition( Chamber_C00, _abt_, C00, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  228. m_fsm.AddTransition(new WeaponTransition( Chamber_C00, _abt_, C10));
  229. m_fsm.AddTransition(new WeaponTransition( C01, __L__, Chamber_C01)); // chamber from closed charged
  230. m_fsm.AddTransition(new WeaponTransition( Chamber_C01, _fin_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  231. m_fsm.AddTransition(new WeaponTransition( Chamber_C01, _fin_, C11));
  232. m_fsm.AddTransition(new WeaponTransition( Chamber_C01, _abt_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  233. m_fsm.AddTransition(new WeaponTransition( Chamber_C01, _abt_, C11));
  234. // attach magazine (no mag in weapon)
  235. m_fsm.AddTransition(new WeaponTransition( C00, __A__, Attach_C00, NULL, new WeaponGuardCanAttachMag(this))); // attach from CLO/b0/m0
  236. m_fsm.AddTransition(new WeaponTransition( Attach_C00, _fin_, C11, NULL, new WeaponGuardCurrentChamberFull(this)));
  237. m_fsm.AddTransition(new WeaponTransition( Attach_C00, _fin_, C01, NULL, new WeaponGuardHasMag(this)));
  238. m_fsm.AddTransition(new WeaponTransition( Attach_C00, _fin_, C00));
  239. m_fsm.AddTransition(new WeaponTransition( Attach_C00, _abt_, C11, NULL, new WeaponGuardCurrentChamberFull(this)));
  240. m_fsm.AddTransition(new WeaponTransition( Attach_C00, _abt_, C01, NULL, new WeaponGuardHasMag(this)));
  241. m_fsm.AddTransition(new WeaponTransition( Attach_C00, _abt_, C00));
  242. m_fsm.AddTransition(new WeaponTransition( C10, __A__, Attach_C10, NULL, new WeaponGuardCanAttachMag(this))); // attach from CLO/b1/m0
  243. m_fsm.AddTransition(new WeaponTransition( Attach_C10, _fin_, C11, NULL, new WeaponGuardHasMag(this)));
  244. m_fsm.AddTransition(new WeaponTransition( Attach_C10, _fin_, C10));
  245. m_fsm.AddTransition(new WeaponTransition( Attach_C10, _abt_, C11, NULL, new WeaponGuardHasMag(this)));
  246. m_fsm.AddTransition(new WeaponTransition( Attach_C10, _abt_, C10));
  247. m_fsm.AddTransition(new WeaponTransition( JF0, __A__, Attach_JF0, NULL, new WeaponGuardCanAttachMag(this))); // attach from JAM/b1/m0
  248. m_fsm.AddTransition(new WeaponTransition( Attach_JF0, _fin_, JF1, NULL, new WeaponGuardHasMag(this)));
  249. m_fsm.AddTransition(new WeaponTransition( Attach_JF0, _fin_, JF0));
  250. m_fsm.AddTransition(new WeaponTransition( Attach_JF0, _abt_, JF1, NULL, new WeaponGuardHasMag(this)));
  251. m_fsm.AddTransition(new WeaponTransition( Attach_JF0, _abt_, JF0));
  252. // replace magazine
  253. m_fsm.AddTransition(new WeaponTransition( C11, __S__, Reload_C11, NULL, new WeaponGuardCanSwapMag(this))); // swap in Chg/b1/m1
  254. m_fsm.AddTransition(new WeaponTransition( Reload_C11, _fin_, C11, NULL, new WeaponGuardHasMag(this)));
  255. m_fsm.AddTransition(new WeaponTransition( Reload_C11, _fin_, C10));
  256. m_fsm.AddTransition(new WeaponTransition( Reload_C11, _abt_, C11, NULL, new WeaponGuardHasMag(this)));
  257. m_fsm.AddTransition(new WeaponTransition( Reload_C11, _abt_, C10));
  258. m_fsm.AddTransition(new WeaponTransition( C01, __S__, Reload_C01, NULL, new WeaponGuardCanSwapMag(this))); // swap in CLO/b0/m1
  259. m_fsm.AddTransition(new WeaponTransition( Reload_C01, _fin_, C11, NULL, new WeaponGuardCurrentChamberFull(this)));
  260. m_fsm.AddTransition(new WeaponTransition( Reload_C01, _fin_, C01, NULL, new WeaponGuardHasMag(this)));
  261. m_fsm.AddTransition(new WeaponTransition( Reload_C01, _fin_, C00));
  262. m_fsm.AddTransition(new WeaponTransition( Reload_C01, _abt_, C11, NULL, new WeaponGuardCurrentChamberFull(this)));
  263. m_fsm.AddTransition(new WeaponTransition( Reload_C01, _abt_, C01, NULL, new WeaponGuardHasMag(this)));
  264. m_fsm.AddTransition(new WeaponTransition( Reload_C01, _abt_, C00));
  265. m_fsm.AddTransition(new WeaponTransition( JF1, __S__, Reload_JF1, NULL, new WeaponGuardCanSwapMag(this))); // swap in Chg/b1/m1
  266. m_fsm.AddTransition(new WeaponTransition( Reload_JF1, _fin_, JF1, NULL, new WeaponGuardHasMag(this)));
  267. m_fsm.AddTransition(new WeaponTransition( Reload_JF1, _fin_, JF0));
  268. m_fsm.AddTransition(new WeaponTransition( Reload_JF1, _abt_, JF1, NULL, new WeaponGuardHasMag(this)));
  269. m_fsm.AddTransition(new WeaponTransition( Reload_JF1, _abt_, JF0));
  270. // detach magazine
  271. m_fsm.AddTransition(new WeaponTransition( C11, __D__, Detach_C11, NULL, new WeaponGuardCanDetachMag(this))); // detach from Chg/b1/m1
  272. m_fsm.AddTransition(new WeaponTransition( Detach_C11, _fin_, C11, NULL, new WeaponGuardHasMag(this)));
  273. m_fsm.AddTransition(new WeaponTransition( Detach_C11, _fin_, C10));
  274. m_fsm.AddTransition(new WeaponTransition( Detach_C11, _abt_, C11, NULL, new WeaponGuardHasMag(this)));
  275. m_fsm.AddTransition(new WeaponTransition( Detach_C11, _abt_, C10));
  276. m_fsm.AddTransition(new WeaponTransition( C01, __D__, Detach_C01, NULL, new WeaponGuardCanDetachMag(this))); // detach from Chg/b0/m1
  277. m_fsm.AddTransition(new WeaponTransition( Detach_C01, _fin_, C01, NULL, new WeaponGuardHasMag(this)));
  278. m_fsm.AddTransition(new WeaponTransition( Detach_C01, _fin_, C00));
  279. m_fsm.AddTransition(new WeaponTransition( Detach_C01, _abt_, C01, NULL, new WeaponGuardHasMag(this)));
  280. m_fsm.AddTransition(new WeaponTransition( Detach_C01, _abt_, C00));
  281. m_fsm.AddTransition(new WeaponTransition( JF1, __D__, Detach_JF1, NULL, new WeaponGuardCanDetachMag(this))); // detach from CLO/b1/m1 jammed
  282. m_fsm.AddTransition(new WeaponTransition( Detach_JF1, _fin_, JF1, NULL, new WeaponGuardHasMag(this)));
  283. m_fsm.AddTransition(new WeaponTransition( Detach_JF1, _fin_, JF0));
  284. m_fsm.AddTransition(new WeaponTransition( Detach_JF1, _abt_, JF1, NULL, new WeaponGuardHasMag(this)));
  285. m_fsm.AddTransition(new WeaponTransition( Detach_JF1, _abt_, JF0));
  286. // unjam
  287. m_fsm.AddTransition(new WeaponTransition( JF0, __U__, Unjam_JF0)); // unjam nomag
  288. m_fsm.AddTransition(new WeaponTransition( Unjam_JF0, _fin_, JF0, NULL, new WeaponGuardJammed(this)));
  289. m_fsm.AddTransition(new WeaponTransition( Unjam_JF0, _fin_, C00));
  290. m_fsm.AddTransition(new WeaponTransition( Unjam_JF0, _abt_, JF0, NULL, new WeaponGuardJammed(this)));
  291. m_fsm.AddTransition(new WeaponTransition( Unjam_JF0, _abt_, C00));
  292. m_fsm.AddTransition(new WeaponTransition( JF1, __U__, Unjam_JF1)); // unjam with mag with ammo
  293. m_fsm.AddTransition(new WeaponTransition( Unjam_JF1, _fin_, JF1, NULL, new WeaponGuardJammed(this)));
  294. m_fsm.AddTransition(new WeaponTransition( Unjam_JF1, _fin_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  295. m_fsm.AddTransition(new WeaponTransition( Unjam_JF1, _fin_, C11));
  296. m_fsm.AddTransition(new WeaponTransition( Unjam_JF1, _abt_, JF1, NULL, new WeaponGuardJammed(this)));
  297. m_fsm.AddTransition(new WeaponTransition( Unjam_JF1, _abt_, C01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  298. m_fsm.AddTransition(new WeaponTransition( Unjam_JF1, _abt_, C11));
  299. SetInitialState(C00);
  300. SelectionBulletHide();
  301. HideMagazine();
  302. m_fsm.Start();
  303. }
  304. override float GetChanceToJam()
  305. {
  306. float chanceToJam = super.GetChanceToJam();
  307. Magazine mag = GetMagazine(GetCurrentMuzzle());
  308. if(mag)
  309. {
  310. chanceToJam = chanceToJam + ((1.0 - chanceToJam) * mag.GetChanceToJam());
  311. }
  312. else
  313. {
  314. chanceToJam = chanceToJam + ((1.0 - chanceToJam) * 0.06);
  315. }
  316. return chanceToJam;
  317. }
  318. override void SetActions()
  319. {
  320. super.SetActions();
  321. AddAction(FirearmActionDetachMagazine);
  322. }
  323. };