chamberfirstinnermagazinesemiautomatic_base.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. enum CFIMSAAnimState
  2. {
  3. DEFAULT = 0, ///< default weapon state
  4. OPENNED = 1,
  5. JAMMED = 2,
  6. };
  7. enum CFIMSAStableStateID
  8. {
  9. UNKNOWN = 0,
  10. Empty = 1,
  11. Open = 2,
  12. Loaded = 3,
  13. Jammed = 4,
  14. }
  15. class CFIMSAEmpty extends WeaponStableState
  16. {
  17. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Empty E"); } super.OnEntry(e); }
  18. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Empty E"); } }
  19. override int GetCurrentStateID () { return CFIMSAStableStateID.Empty; }
  20. override bool HasBullet () { return false; }
  21. override bool HasMagazine () { return false; }
  22. override bool IsJammed () { return false; }
  23. override bool IsRepairEnabled () { return true; }
  24. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  25. };
  26. class CFIMSAOpenned extends WeaponStableState
  27. {
  28. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Open O"); } super.OnEntry(e); }
  29. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Open O"); } }
  30. override int GetCurrentStateID () { return CFIMSAStableStateID.Empty; }
  31. override bool HasBullet () { return false; }
  32. override bool HasMagazine () { return false; }
  33. override bool IsJammed () { return false; }
  34. override bool IsRepairEnabled () { return true; }
  35. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  36. };
  37. class CFIMSALoaded extends WeaponStableState
  38. {
  39. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Loaded L"); } super.OnEntry(e); }
  40. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Loaded L"); } }
  41. override int GetCurrentStateID () { return CFIMSAStableStateID.Loaded; }
  42. override bool HasBullet () { return true; }
  43. override bool HasMagazine () { return false; }
  44. override bool IsJammed () { return false; }
  45. override bool IsRepairEnabled () { return true; }
  46. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; }
  47. };
  48. class CFIMSAJammed extends WeaponStableState
  49. {
  50. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Jammed J"); } super.OnEntry(e); }
  51. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Jammed J"); } }
  52. override int GetCurrentStateID () { return CFIMSAStableStateID.Jammed; }
  53. override bool HasBullet () { return true; }
  54. override bool HasMagazine () { return false; }
  55. override bool IsJammed () { return true; }
  56. override bool IsRepairEnabled () { return true; }
  57. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
  58. };
  59. /**@class BoltRifle_Base
  60. * @brief base for bolt action rifles
  61. * @NOTE name copies config base class
  62. **/
  63. class ChamberFirst_InnerMagazine_SemiAutomatic_Base extends Rifle_Base
  64. {
  65. ref WeaponStableState E;
  66. ref WeaponStableState O;
  67. ref WeaponStableState L;
  68. ref WeaponStableState J;
  69. override void InitStateMachine ()
  70. {
  71. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  72. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_CLOSED_EXTRA));
  73. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_CLOSED_WITHCHAMBER));
  74. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_OPENED));
  75. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE));
  76. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
  77. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_END));
  78. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
  79. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_LAST));
  80. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  81. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM));
  82. E = new CFIMSAEmpty(this, NULL, CFIMSAAnimState.DEFAULT);
  83. O = new CFIMSAOpenned(this, NULL, CFIMSAAnimState.OPENNED);
  84. L = new CFIMSALoaded(this, NULL, CFIMSAAnimState.DEFAULT);
  85. J = new CFIMSAJammed(this, NULL, CFIMSAAnimState.JAMMED);
  86. WeaponStateBase Mech_E = new WeaponChargingInnerMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  87. WeaponStateBase Mech_O = new WeaponChargingInnerMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED);
  88. WeaponStateBase Mech_L = new WeaponChargingInnerMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  89. LoopedChamberingCombineChamberInternalMagazine Chamber_E = new LoopedChamberingCombineChamberInternalMagazine(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_CLOSED_EXTRA, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
  90. LoopedChamberingCombineChamberInternalMagazine Chamber_O = new LoopedChamberingCombineChamberInternalMagazine(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_OPENED, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
  91. LoopedChamberingEjectLast Chamber_L = new LoopedChamberingEjectLast(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_CLOSED_WITHCHAMBER, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
  92. WeaponStateBase Unjam_J = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START);
  93. WeaponStateBase Trigger_E = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY);
  94. WeaponStateBase Trigger_O = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY);
  95. WeaponStateBase Trigger_L = new WeaponFireAndChamberFromInnerMagazine(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL);
  96. WeaponStateBase Trigger_J = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY);
  97. WeaponStateBase Trigger_LL = new WeaponFireLast(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_LAST));
  98. WeaponStateBase Trigger_LJ = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM);
  99. WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
  100. WeaponEventBase __L__ = new WeaponEventLoad1Bullet;
  101. WeaponEventBase __T__ = new WeaponEventTrigger;
  102. WeaponEventBase __TJ_ = new WeaponEventTriggerToJam;
  103. WeaponEventBase __U__ = new WeaponEventUnjam;
  104. WeaponEventBase __M__ = new WeaponEventMechanism;
  105. WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
  106. WeaponEventBase _rto_ = new WeaponEventReloadTimeout;
  107. WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
  108. m_fsm = new WeaponFSM();
  109. // Mechanism
  110. //----------------------------------------
  111. m_fsm.AddTransition(new WeaponTransition( E, __M__, Mech_E));
  112. m_fsm.AddTransition(new WeaponTransition( Mech_E, _fin_, E));
  113. m_fsm.AddTransition(new WeaponTransition( Mech_E, _abt_, E));
  114. m_fsm.AddTransition(new WeaponTransition( O, __M__, Mech_O));
  115. m_fsm.AddTransition(new WeaponTransition( Mech_O, _fin_, O, NULL, new WeaponGuardWeaponOpen(this)));
  116. m_fsm.AddTransition(new WeaponTransition( Mech_O, _fin_, E));
  117. m_fsm.AddTransition(new WeaponTransition( Mech_O, _abt_, O, NULL, new WeaponGuardWeaponOpen(this)));
  118. m_fsm.AddTransition(new WeaponTransition( Mech_O, _abt_, E));
  119. m_fsm.AddTransition(new WeaponTransition( L, __M__, Mech_L));
  120. m_fsm.AddTransition(new WeaponTransition( Mech_L, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  121. m_fsm.AddTransition(new WeaponTransition( Mech_L, _fin_, L));
  122. m_fsm.AddTransition(new WeaponTransition( Mech_L, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  123. m_fsm.AddTransition(new WeaponTransition( Mech_L, _abt_, L));
  124. //----------------------------------------
  125. m_fsm.AddTransition(new WeaponTransition( E, __L__, Chamber_E));
  126. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  127. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _fin_, L));
  128. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _abt_, O, NULL, new WeaponGuardWeaponOpen(this)));
  129. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  130. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _abt_, L));
  131. m_fsm.AddTransition(new WeaponTransition( O, __L__, Chamber_O));
  132. m_fsm.AddTransition(new WeaponTransition( Chamber_O, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  133. m_fsm.AddTransition(new WeaponTransition( Chamber_O, _fin_, L));
  134. m_fsm.AddTransition(new WeaponTransition( Chamber_O, _abt_, O, NULL, new WeaponGuardWeaponOpen(this)));
  135. m_fsm.AddTransition(new WeaponTransition( Chamber_O, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  136. m_fsm.AddTransition(new WeaponTransition( Chamber_O, _abt_, L));
  137. m_fsm.AddTransition(new WeaponTransition( L, __L__, Chamber_L, NULL, new GuardNot(new WeaponGuardInnerMagazineFullShareChamber(this))));
  138. m_fsm.AddTransition(new WeaponTransition( Chamber_L, _fin_, L));
  139. m_fsm.AddTransition(new WeaponTransition( Chamber_L, _abt_, L));
  140. //------------------------------------------
  141. m_fsm.AddTransition(new WeaponTransition( J, __U__, Unjam_J));
  142. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _fin_, J, NULL, new WeaponGuardJammed(this)));
  143. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  144. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _fin_, L));
  145. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _abt_, J, NULL, new WeaponGuardJammed(this)));
  146. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  147. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _abt_, L));
  148. //-----------------------------------------
  149. // fire
  150. m_fsm.AddTransition(new WeaponTransition( E, __T__, Trigger_E)); // fire.cocked
  151. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _fin_, E));
  152. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _dto_, E));
  153. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _abt_, E));
  154. m_fsm.AddTransition(new WeaponTransition( O, __T__, Trigger_O)); // fire.cocked
  155. m_fsm.AddTransition(new WeaponTransition( Trigger_O, _fin_, O));
  156. m_fsm.AddTransition(new WeaponTransition( Trigger_O, _dto_, O));
  157. m_fsm.AddTransition(new WeaponTransition( Trigger_O, _abt_, O));
  158. m_fsm.AddTransition(new WeaponTransition( L, __T__, Trigger_L, NULL, new WeaponGuardHasAmmoInnerMagazine(this)));
  159. m_fsm.AddTransition(new WeaponTransition( Trigger_L, _fin_, L));
  160. m_fsm.AddTransition(new WeaponTransition( Trigger_L, _rto_, L));
  161. m_fsm.AddTransition(new WeaponTransition( Trigger_L, _abt_, L));
  162. m_fsm.AddTransition(new WeaponTransition( L, __T__, Trigger_LL));
  163. m_fsm.AddTransition(new WeaponTransition( Trigger_LL, _fin_, O));
  164. m_fsm.AddTransition(new WeaponTransition( Trigger_LL, _rto_, O));
  165. m_fsm.AddTransition(new WeaponTransition( Trigger_LL, _abt_, O));
  166. m_fsm.AddTransition(new WeaponTransition( J, __T__, Trigger_J)); // fire.cocked
  167. m_fsm.AddTransition(new WeaponTransition( Trigger_J, _fin_, J));
  168. m_fsm.AddTransition(new WeaponTransition( Trigger_J, _dto_, J));
  169. m_fsm.AddTransition(new WeaponTransition( Trigger_J, _abt_, J));
  170. m_fsm.AddTransition(new WeaponTransition( L, __TJ_, Trigger_LJ)); // fire.cocked
  171. m_fsm.AddTransition(new WeaponTransition( Trigger_LJ, _fin_, J));
  172. m_fsm.AddTransition(new WeaponTransition( Trigger_LJ, _rto_, J));
  173. m_fsm.AddTransition(new WeaponTransition( Trigger_LJ, _abt_, J));
  174. //---------------------------------------------
  175. SetInitialState(E);
  176. SelectionBulletHide();
  177. HideMagazine();
  178. m_fsm.Start();
  179. }
  180. override void SetActions()
  181. {
  182. AddAction(FirearmActionLoadMultiBulletQuick);
  183. super.SetActions();
  184. AddAction(FirearmActionLoadMultiBullet);
  185. }
  186. };