boltactionrifleexternalmagazine_base.c 33 KB

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