openbolt_base.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. enum OBAnimState
  2. {
  3. CLOSED = 0, ///< default weapon state, closed and discharged
  4. OPENED = 1,
  5. JAMMED = 2,
  6. };
  7. enum OBStableStateID
  8. {
  9. UNKNOWN = 0,
  10. OB_CLO_MA0 = 1,
  11. OB_OPN_MA0 = 2,
  12. OB_CLO_MA1 = 3,
  13. OB_OPN_MA1 = 4,
  14. OB_OPN_MA1_EMPTY = 5,
  15. OB_JAM_MA0 = 6,
  16. OB_JAM_MA1 = 7
  17. }
  18. class OB_CLO_MA0 extends WeaponStableState
  19. {
  20. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { close nomag"); } super.OnEntry(e); }
  21. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } close nomag"); } }
  22. override int GetCurrentStateID () { return OBStableStateID.OB_CLO_MA0; }
  23. override bool HasBullet () { return false; }
  24. override bool HasMagazine () { return false; }
  25. override bool IsJammed () { return false; }
  26. override bool IsBoltOpen () { return false; }
  27. override bool IsRepairEnabled () { return true; }
  28. override bool IsDischarged () { return true; }
  29. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  30. };
  31. class OB_OPN_MA0 extends WeaponStableState
  32. {
  33. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { open nomag"); } super.OnEntry(e); }
  34. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } open nomag"); } }
  35. override int GetCurrentStateID () { return OBStableStateID.OB_OPN_MA0; }
  36. override bool HasBullet () { return false; }
  37. override bool HasMagazine () { return false; }
  38. override bool IsJammed () { return false; }
  39. override bool IsBoltOpen () { return true; }
  40. override bool IsRepairEnabled () { return true; }
  41. override bool IsDischarged () { return false; }
  42. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  43. };
  44. class OB_CLO_MA1 extends WeaponStableState
  45. {
  46. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { close mag"); } super.OnEntry(e); }
  47. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } close mag"); } }
  48. override int GetCurrentStateID () { return OBStableStateID.OB_CLO_MA1; }
  49. override bool HasBullet () { return false; }
  50. override bool HasMagazine () { return true; }
  51. override bool IsJammed () { return false; }
  52. override bool IsBoltOpen () { return false; }
  53. override bool IsDischarged () { return true; }
  54. override bool IsRepairEnabled () { return true; }
  55. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  56. };
  57. class OB_OPN_MA1 extends WeaponStableState
  58. {
  59. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { open mag"); } super.OnEntry(e); }
  60. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } open mag"); } }
  61. override int GetCurrentStateID () { return OBStableStateID.OB_OPN_MA1; }
  62. override bool HasBullet () { return true; }
  63. override bool HasMagazine () { return true; }
  64. override bool IsJammed () { return false; }
  65. override bool IsBoltOpen () { return true; }
  66. override bool IsDischarged () { return false; }
  67. override bool IsRepairEnabled () { return true; }
  68. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; }
  69. };
  70. class OB_OPN_MA1_EMPTY extends WeaponStableState
  71. {
  72. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { open mag empty"); } super.OnEntry(e); }
  73. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } open mag empty"); } }
  74. override int GetCurrentStateID () { return OBStableStateID.OB_OPN_MA1_EMPTY; }
  75. override bool HasBullet () { return false; }
  76. override bool HasMagazine () { return true; }
  77. override bool IsJammed () { return false; }
  78. override bool IsBoltOpen () { return true; }
  79. override bool IsDischarged () { return false; }
  80. override bool IsRepairEnabled () { return true; }
  81. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  82. };
  83. class OB_JAM_MA0 extends WeaponStableState
  84. {
  85. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { jammed nomag"); } m_weapon.SetWeaponOpen(true); super.OnEntry(e); }
  86. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } jammed nomag"); } }
  87. override int GetCurrentStateID () { return OBStableStateID.OB_JAM_MA0; }
  88. override bool HasBullet () { return true; }
  89. override bool HasMagazine () { return false; }
  90. override bool IsJammed () { return true; }
  91. override bool IsBoltOpen () { return true; }
  92. override bool IsDischarged () { return true; }
  93. override bool IsRepairEnabled () { return true; }
  94. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
  95. };
  96. class OB_JAM_MA1 extends WeaponStableState
  97. {
  98. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { jammed mag"); } m_weapon.SetWeaponOpen(true); super.OnEntry(e); }
  99. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } jammed mag"); } }
  100. override int GetCurrentStateID () { return OBStableStateID.OB_JAM_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 IsDischarged () { return true; }
  106. override bool IsRepairEnabled () { return true; }
  107. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
  108. };
  109. /**@class OpenBolt_Base
  110. * @brief base for automatic weapons fireing from open bolt position
  111. * @NOTE name copies config base class
  112. **/
  113. class OpenBolt_Base extends Rifle_Base
  114. {
  115. ref WeaponStableState C0;
  116. ref WeaponStableState O0;
  117. ref WeaponStableState C1;
  118. ref WeaponStableState O1;
  119. ref WeaponStableState O1E;
  120. ref WeaponStableState J1;
  121. ref WeaponStableState J0;
  122. void OpenBolt_Base ()
  123. {
  124. }
  125. override void InitStateMachine()
  126. {
  127. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET));
  128. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET));
  129. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_NOBULLET_OPEN));
  130. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET_OPEN));
  131. m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH));
  132. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED));
  133. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
  134. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_END));
  135. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
  136. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  137. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED));
  138. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM));
  139. //m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED));
  140. // setup state machine
  141. // basic weapon states
  142. // close-open-jammed | nomag-mag | - no bullet in chamber
  143. // regexp: [COJ][01][-E]
  144. C0 = new OB_CLO_MA0(this, NULL, OBAnimState.CLOSED);
  145. O0 = new OB_OPN_MA0(this, NULL, OBAnimState.OPENED);
  146. C1 = new OB_CLO_MA1(this, NULL, OBAnimState.CLOSED);
  147. O1 = new OB_OPN_MA1(this, NULL, OBAnimState.OPENED);
  148. O1E = new OB_OPN_MA1_EMPTY(this, NULL, OBAnimState.OPENED);
  149. J0 = new OB_JAM_MA0(this, NULL, OBAnimState.JAMMED);
  150. J1 = new OB_JAM_MA1(this, NULL, OBAnimState.JAMMED);
  151. WeaponCharging Mech_C1 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED));
  152. //-----------------------------------------------
  153. WeaponStateBase Trigger_C0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  154. WeaponStateBase Trigger_C1 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  155. WeaponStateBase Trigger_O1E = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED));
  156. WeaponStateBase Trigger_O0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED));
  157. WeaponFireAndChamberNext Trigger_O1 = new WeaponFireAndChamberNext(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
  158. WeaponStateBase Trigger_O1L = new WeaponFireLast(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
  159. WeaponStateBase Trigger_O1J = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM));//Fire and jam
  160. WeaponStateBase Trigger_J0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  161. WeaponStateBase Trigger_J1 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  162. //-----------------------------------------------
  163. WeaponStateBase Unjam_J0 = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
  164. WeaponStateBase Unjam_J1 = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
  165. //-----------------------------------------------
  166. WeaponAttachMagazineOpenBoltCharged Attach_C0 = new WeaponAttachMagazineOpenBoltCharged(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET_OPEN));
  167. WeaponAttachMagazineOpenBoltCharged Attach_O0 = new WeaponAttachMagazineOpenBoltCharged(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET));//TODO Need add open animation
  168. WeaponAttachMagazineOpenBoltCharged Attach_J0 = new WeaponAttachMagazineOpenBoltCharged(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET));
  169. WeaponReplacingMagAndChamberNextOpenBoltCharged Reload_C1 = new WeaponReplacingMagAndChamberNextOpenBoltCharged(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_NOBULLET_OPEN));
  170. WeaponReplacingMagAndChamberNextOpenBoltCharged Reload_O1 = new WeaponReplacingMagAndChamberNextOpenBoltCharged(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET));//TODO Need add open animation
  171. WeaponReplacingMagAndChamberNextOpenBoltCharged Reload_J1 = new WeaponReplacingMagAndChamberNextOpenBoltCharged(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET));
  172. WeaponDetachingMagOpenBolt Detach_C1 = new WeaponDetachingMagOpenBolt(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
  173. WeaponDetachingMagOpenBolt Detach_O1 = new WeaponDetachingMagOpenBolt(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
  174. WeaponDetachingMagOpenBolt Detach_J1 = new WeaponDetachingMagOpenBolt(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
  175. //WeaponStateBase chmMag = new WeaponChamberFromAttMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  176. // events
  177. WeaponEventBase __M__ = new WeaponEventMechanism;
  178. WeaponEventBase __T__ = new WeaponEventTrigger;
  179. WeaponEventBase __TJ_ = new WeaponEventTriggerToJam;
  180. WeaponEventBase __U__ = new WeaponEventUnjam;
  181. WeaponEventBase __A__ = new WeaponEventAttachMagazine;
  182. WeaponEventBase __D__ = new WeaponEventDetachMagazine;
  183. WeaponEventBase __S__ = new WeaponEventSwapMagazine;
  184. WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
  185. WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
  186. WeaponEventBase _rto_ = new WeaponEventReloadTimeout;
  187. WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
  188. m_fsm = new WeaponFSM();
  189. m_fsm.AddTransition(new WeaponTransition( C1, __M__, Mech_C1)); // charge from bullet nomag
  190. m_fsm.AddTransition(new WeaponTransition( Mech_C1, _fin_, C1, NULL, new WeaponGuardWeaponDischarged(this) ));
  191. m_fsm.AddTransition(new WeaponTransition( Mech_C1, _fin_, O1E, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  192. m_fsm.AddTransition(new WeaponTransition( Mech_C1, _fin_, O1));
  193. m_fsm.AddTransition(new WeaponTransition( Mech_C1, _abt_, C1, NULL, new WeaponGuardWeaponDischarged(this) ));
  194. m_fsm.AddTransition(new WeaponTransition( Mech_C1, _abt_, O1E, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
  195. m_fsm.AddTransition(new WeaponTransition( Mech_C1, _abt_, O1));
  196. m_fsm.AddTransition(new WeaponTransition( C0, __M__, C0));
  197. m_fsm.AddTransition(new WeaponTransition( O1E, __M__, O1E));
  198. m_fsm.AddTransition(new WeaponTransition( O0, __M__, O0));
  199. m_fsm.AddTransition(new WeaponTransition( O1, __M__, O1));
  200. m_fsm.AddTransition(new WeaponTransition( J0, __M__, J0));
  201. m_fsm.AddTransition(new WeaponTransition( J1, __M__, J1));
  202. // fire
  203. m_fsm.AddTransition(new WeaponTransition( C0, __T__, Trigger_C0));
  204. m_fsm.AddTransition(new WeaponTransition( Trigger_C0, _fin_, C0));
  205. m_fsm.AddTransition(new WeaponTransition( Trigger_C0, _dto_, C0));
  206. m_fsm.AddTransition(new WeaponTransition( Trigger_C0, _abt_, C0));
  207. m_fsm.AddTransition(new WeaponTransition( C1, __T__, Trigger_C1));
  208. m_fsm.AddTransition(new WeaponTransition( Trigger_C1, _fin_, C1));
  209. m_fsm.AddTransition(new WeaponTransition( Trigger_C1, _dto_, C1));
  210. m_fsm.AddTransition(new WeaponTransition( Trigger_C1, _abt_, C1));
  211. m_fsm.AddTransition(new WeaponTransition( O1, __T__, Trigger_O1, NULL, new WeaponGuardHasAmmo(this)));
  212. m_fsm.AddTransition(new WeaponTransition( Trigger_O1, _fin_, O1));
  213. m_fsm.AddTransition(new WeaponTransition( Trigger_O1, _rto_, O1));
  214. m_fsm.AddTransition(new WeaponTransition( Trigger_O1, _abt_, O1));
  215. m_fsm.AddTransition(new WeaponTransition( O1, __T__, Trigger_O1L, NULL, new GuardNot(new WeaponGuardHasAmmo(this))));
  216. m_fsm.AddTransition(new WeaponTransition( Trigger_O1L, _fin_, O1E));
  217. m_fsm.AddTransition(new WeaponTransition( Trigger_O1L, _rto_, O1E));
  218. m_fsm.AddTransition(new WeaponTransition( Trigger_O1L, _abt_, O1E));
  219. m_fsm.AddTransition(new WeaponTransition( O1, __TJ_, Trigger_O1J ));
  220. m_fsm.AddTransition(new WeaponTransition( Trigger_O1J, _fin_, J1 ));
  221. m_fsm.AddTransition(new WeaponTransition( Trigger_O1J, _rto_, J1 ));
  222. m_fsm.AddTransition(new WeaponTransition( Trigger_O1J, _abt_, J1 ));
  223. m_fsm.AddTransition(new WeaponTransition( O1E, __T__, Trigger_O1E));
  224. m_fsm.AddTransition(new WeaponTransition( Trigger_O1E, _fin_, C1));
  225. m_fsm.AddTransition(new WeaponTransition( Trigger_O1E, _rto_, C1));
  226. m_fsm.AddTransition(new WeaponTransition( Trigger_O1E, _abt_, C1));
  227. m_fsm.AddTransition(new WeaponTransition( O0, __T__, Trigger_O0));
  228. m_fsm.AddTransition(new WeaponTransition( Trigger_O0, _fin_, C0));
  229. m_fsm.AddTransition(new WeaponTransition( Trigger_O0, _rto_, C0));
  230. m_fsm.AddTransition(new WeaponTransition( Trigger_O0, _abt_, C0));
  231. m_fsm.AddTransition(new WeaponTransition( J0, __T__, Trigger_J0));
  232. m_fsm.AddTransition(new WeaponTransition( Trigger_J0, _fin_, J0));
  233. m_fsm.AddTransition(new WeaponTransition( Trigger_J0, _dto_, J0));
  234. m_fsm.AddTransition(new WeaponTransition( Trigger_J0, _abt_, J0));
  235. m_fsm.AddTransition(new WeaponTransition( J1, __T__, Trigger_J1));
  236. m_fsm.AddTransition(new WeaponTransition( Trigger_J1, _fin_, J1));
  237. m_fsm.AddTransition(new WeaponTransition( Trigger_J1, _dto_, J1));
  238. m_fsm.AddTransition(new WeaponTransition( Trigger_J1, _abt_, J1));
  239. // attach magazine (no mag in weapon)
  240. m_fsm.AddTransition(new WeaponTransition( C0, __A__, Attach_C0, NULL, new WeaponGuardCanAttachMag(this)));
  241. m_fsm.AddTransition(new WeaponTransition( Attach_C0, _fin_, C0, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
  242. m_fsm.AddTransition(new WeaponTransition( Attach_C0, _fin_, C1, NULL, new WeaponGuardWeaponDischarged(this)));
  243. m_fsm.AddTransition(new WeaponTransition( Attach_C0, _fin_, O1E, NULL, new WeaponGuardChamberEmpty(this)) );
  244. m_fsm.AddTransition(new WeaponTransition( Attach_C0, _fin_, O1));
  245. m_fsm.AddTransition(new WeaponTransition( Attach_C0, _abt_, C0, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
  246. m_fsm.AddTransition(new WeaponTransition( Attach_C0, _abt_, C1, NULL, new WeaponGuardWeaponDischarged(this)));
  247. m_fsm.AddTransition(new WeaponTransition( Attach_C0, _abt_, O1E, NULL, new WeaponGuardChamberEmpty(this)) );
  248. m_fsm.AddTransition(new WeaponTransition( Attach_C0, _abt_, O1));
  249. m_fsm.AddTransition(new WeaponTransition( O0, __A__, Attach_O0, NULL, new WeaponGuardCanAttachMag(this)));
  250. m_fsm.AddTransition(new WeaponTransition( Attach_O0, _fin_, O0, NULL, new GuardNot(new WeaponGuardHasMag(this))));
  251. m_fsm.AddTransition(new WeaponTransition( Attach_O0, _fin_, O1E, NULL, new WeaponGuardChamberEmpty(this)));
  252. m_fsm.AddTransition(new WeaponTransition( Attach_O0, _fin_, O1));
  253. m_fsm.AddTransition(new WeaponTransition( Attach_O0, _abt_, O0, NULL, new GuardNot(new WeaponGuardHasMag(this))));
  254. m_fsm.AddTransition(new WeaponTransition( Attach_O0, _abt_, O1E, NULL, new WeaponGuardChamberEmpty(this)));
  255. m_fsm.AddTransition(new WeaponTransition( Attach_O0, _abt_, O1));
  256. m_fsm.AddTransition(new WeaponTransition( J0, __A__, Attach_J0, NULL, new WeaponGuardCanAttachMag(this)));
  257. m_fsm.AddTransition(new WeaponTransition( Attach_J0, _fin_, J1, NULL, new WeaponGuardHasMag(this)));
  258. m_fsm.AddTransition(new WeaponTransition( Attach_J0, _fin_, J0));
  259. m_fsm.AddTransition(new WeaponTransition( Attach_J0, _abt_, J1, NULL, new WeaponGuardHasMag(this)));
  260. m_fsm.AddTransition(new WeaponTransition( Attach_J0, _abt_, J0));
  261. // replace magazine
  262. m_fsm.AddTransition(new WeaponTransition( C1, __S__, Reload_C1, NULL, new WeaponGuardCanSwapMag(this)));
  263. m_fsm.AddTransition(new WeaponTransition( Reload_C1, _fin_, C0, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
  264. m_fsm.AddTransition(new WeaponTransition( Reload_C1, _fin_, C1, NULL, new WeaponGuardWeaponDischarged(this)));
  265. m_fsm.AddTransition(new WeaponTransition( Reload_C1, _fin_, O1E, NULL, new WeaponGuardChamberEmpty(this)));
  266. m_fsm.AddTransition(new WeaponTransition( Reload_C1, _fin_, O1));
  267. m_fsm.AddTransition(new WeaponTransition( Reload_C1, _abt_, C0, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
  268. m_fsm.AddTransition(new WeaponTransition( Reload_C1, _abt_, C1, NULL, new WeaponGuardWeaponDischarged(this)));
  269. m_fsm.AddTransition(new WeaponTransition( Reload_C1, _abt_, O1E, NULL, new WeaponGuardChamberEmpty(this)));
  270. m_fsm.AddTransition(new WeaponTransition( Reload_C1, _abt_, O1));
  271. m_fsm.AddTransition(new WeaponTransition( O1, __S__, Reload_O1, NULL, new WeaponGuardCanSwapMag(this)));
  272. m_fsm.AddTransition(new WeaponTransition( O1E, __S__, Reload_O1, NULL, new WeaponGuardCanSwapMag(this)));
  273. m_fsm.AddTransition(new WeaponTransition( Reload_O1, _fin_, O0, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
  274. m_fsm.AddTransition(new WeaponTransition( Reload_O1, _fin_, O1E, NULL, new WeaponGuardChamberEmpty(this)) );
  275. m_fsm.AddTransition(new WeaponTransition( Reload_O1, _fin_, O1));
  276. m_fsm.AddTransition(new WeaponTransition( Reload_O1, _abt_, O0, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
  277. m_fsm.AddTransition(new WeaponTransition( Reload_O1, _abt_, O1E, NULL, new WeaponGuardChamberEmpty(this)) );
  278. m_fsm.AddTransition(new WeaponTransition( Reload_O1, _abt_, O1));
  279. m_fsm.AddTransition(new WeaponTransition( J1, __S__, Reload_J1, NULL, new WeaponGuardCanSwapMag(this)));
  280. m_fsm.AddTransition(new WeaponTransition( Reload_J1, _fin_, J1, NULL, new WeaponGuardHasMag(this)));
  281. m_fsm.AddTransition(new WeaponTransition( Reload_J1, _fin_, J0));
  282. m_fsm.AddTransition(new WeaponTransition( Reload_J1, _abt_, J1, NULL, new WeaponGuardHasMag(this)));
  283. m_fsm.AddTransition(new WeaponTransition( Reload_J1, _abt_, J0));
  284. // @TODO: abort in jam
  285. // detach magazine
  286. m_fsm.AddTransition(new WeaponTransition( C1, __D__, Detach_C1, NULL, new WeaponGuardCanDetachMag(this)));
  287. m_fsm.AddTransition(new WeaponTransition( Detach_C1, _fin_, C1, NULL, new WeaponGuardHasMag(this)));
  288. m_fsm.AddTransition(new WeaponTransition( Detach_C1, _fin_, C0));
  289. m_fsm.AddTransition(new WeaponTransition( Detach_C1, _abt_, C1, NULL, new WeaponGuardHasMag(this)));
  290. m_fsm.AddTransition(new WeaponTransition( Detach_C1, _abt_, C0));
  291. m_fsm.AddTransition(new WeaponTransition( O1E, __D__, Detach_O1, NULL, new WeaponGuardCanDetachMag(this)));
  292. m_fsm.AddTransition(new WeaponTransition( O1, __D__, Detach_O1, NULL, new WeaponGuardCanDetachMag(this)));
  293. m_fsm.AddTransition(new WeaponTransition( Detach_O1, _fin_, O0, NULL, new GuardNot(new WeaponGuardHasMag(this))));
  294. m_fsm.AddTransition(new WeaponTransition( Detach_O1, _fin_, O1E, NULL, new WeaponGuardChamberEmpty(this)));
  295. m_fsm.AddTransition(new WeaponTransition( Detach_O1, _fin_, O1));
  296. m_fsm.AddTransition(new WeaponTransition( Detach_O1, _abt_, O0, NULL, new GuardNot(new WeaponGuardHasMag(this))));
  297. m_fsm.AddTransition(new WeaponTransition( Detach_O1, _abt_, O1E, NULL, new WeaponGuardChamberEmpty(this)));
  298. m_fsm.AddTransition(new WeaponTransition( Detach_O1, _abt_, O1));
  299. m_fsm.AddTransition(new WeaponTransition( J1, __D__, Detach_J1, NULL, new WeaponGuardCanDetachMag(this)));
  300. m_fsm.AddTransition(new WeaponTransition( Detach_J1, _fin_, J1, NULL, new WeaponGuardHasMag(this)));
  301. m_fsm.AddTransition(new WeaponTransition( Detach_J1, _fin_, J0));
  302. m_fsm.AddTransition(new WeaponTransition( Detach_J1, _abt_, J1, NULL, new WeaponGuardHasMag(this)));
  303. m_fsm.AddTransition(new WeaponTransition( Detach_J1, _abt_, J0));
  304. // unjam
  305. m_fsm.AddTransition(new WeaponTransition( J0, __U__, Unjam_J0)); // unjam nomag
  306. m_fsm.AddTransition(new WeaponTransition( Unjam_J0, _fin_, J0, NULL, new WeaponGuardJammed(this)));
  307. m_fsm.AddTransition(new WeaponTransition( Unjam_J0, _fin_, O0));
  308. m_fsm.AddTransition(new WeaponTransition( Unjam_J0, _abt_, J0, NULL, new WeaponGuardJammed(this)));
  309. m_fsm.AddTransition(new WeaponTransition( Unjam_J0, _abt_, O0));
  310. m_fsm.AddTransition(new WeaponTransition( J1, __U__, Unjam_J1)); // unjam with mag with ammo
  311. m_fsm.AddTransition(new WeaponTransition( Unjam_J1, _fin_, J1, NULL, new WeaponGuardJammed(this)));
  312. m_fsm.AddTransition(new WeaponTransition( Unjam_J1, _fin_, O1E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  313. m_fsm.AddTransition(new WeaponTransition( Unjam_J1, _fin_, O1));
  314. m_fsm.AddTransition(new WeaponTransition( Unjam_J1, _abt_, J1, NULL, new WeaponGuardJammed(this)));
  315. m_fsm.AddTransition(new WeaponTransition( Unjam_J1, _abt_, O1E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  316. m_fsm.AddTransition(new WeaponTransition( Unjam_J1, _abt_, O1));
  317. SetInitialState(C0);
  318. SelectionBulletHide();
  319. HideMagazine();
  320. m_fsm.Start();
  321. }
  322. override void SetActions()
  323. {
  324. super.SetActions();
  325. RemoveAction(FirearmActionLoadBullet);
  326. RemoveAction(FirearmActionLoadBulletQuick); // Easy reload
  327. }
  328. }