repeater.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. enum RPTAnimState
  2. {
  3. DEFAULT = 0, ///< default weapon state, closed and discharged
  4. CHARGED = 1,
  5. JAMMED = 2,
  6. };
  7. enum RPTStableStateID
  8. {
  9. UNKNOWN = 0,
  10. EmptyDischarged = 1,
  11. LoadedCharged = 2,
  12. LoadedDischarged = 3,
  13. LoadedJammed = 4,
  14. }
  15. class RPTEmptyDischarged extends WeaponStableState
  16. {
  17. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { EmptyDischarged C0"); } super.OnEntry(e); }
  18. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } EmptyDischarged C0"); } }
  19. override int GetCurrentStateID () { return RPTStableStateID.EmptyDischarged; }
  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 RPTLoadedCharged extends WeaponStableState
  27. {
  28. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { LoadedCharged C1"); } super.OnEntry(e); }
  29. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } LoadedCharged C1"); } }
  30. override int GetCurrentStateID () { return RPTStableStateID.LoadedCharged; }
  31. override bool HasBullet () { return true; }
  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.L}; }
  36. };
  37. class RPTLoadedDischarged extends WeaponStableState
  38. {
  39. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { LoadedDischarged D1"); } super.OnEntry(e); }
  40. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } LoadedDischarged D1"); } }
  41. override int GetCurrentStateID () { return RPTStableStateID.LoadedDischarged; }
  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.F}; }
  47. };
  48. class RPTLoadedJammed extends WeaponStateJammed
  49. {
  50. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { LoadedJammed JF"); } super.OnEntry(e); }
  51. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } LoadedJammed JF"); } }
  52. override int GetCurrentStateID () { return RPTStableStateID.LoadedJammed; }
  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 Mp133Shotgun_Base
  60. * @brief basic mp5 submachine gun
  61. **/
  62. class Repeater_Base extends Rifle_Base
  63. {
  64. ref WeaponStableState D0;
  65. ref WeaponStableState C0;
  66. ref WeaponStableState C1;
  67. ref WeaponStableState DF;
  68. ref WeaponStableState JF;
  69. override void InitStateMachine ()
  70. {
  71. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  72. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED));
  73. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_COCKED));
  74. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_UNCOCKED));
  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_COCKED));
  80. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED));
  81. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  82. D0 = new RPTEmptyDischarged(this, NULL, RPTAnimState.DEFAULT);
  83. C0 = new RPTEmptyDischarged(this, NULL, RPTAnimState.CHARGED);
  84. DF = new RPTLoadedDischarged(this, NULL, RPTAnimState.DEFAULT);
  85. C1 = new RPTLoadedCharged(this, NULL, RPTAnimState.CHARGED);
  86. JF = new RPTLoadedJammed(this, NULL, RPTAnimState.JAMMED);
  87. //WeaponStateBase Mech_D0 = new WeaponChargingInnerMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  88. WeaponStateBase Mech_C1 = new WeaponChargingInnerMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED);
  89. WeaponStateBase Mech_DF = new WeaponChargingInnerMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  90. LoopedChamberingEjectLast Chamber_D0 = new LoopedChamberingEjectLast(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_UNCOCKED, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
  91. LoopedChamberingEjectLast Chamber_C0 = new LoopedChamberingEjectLast(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_UNCOCKED, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
  92. LoopedChamberingEjectLast Chamber_C1 = new LoopedChamberingEjectLast(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_COCKED, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
  93. LoopedChamberingEjectLast Chamber_DF = new LoopedChamberingEjectLast(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_UNCOCKED, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
  94. WeaponStateBase Unjam_JF = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START);
  95. WeaponStateBase Trigger_D0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY);
  96. WeaponStateBase Trigger_C0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL);
  97. WeaponStateBase Trigger_C1 = new WeaponFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL);
  98. WeaponStateBase Trigger_DF = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY);
  99. WeaponStateBase Trigger_JF = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY);
  100. WeaponStateBase Trigger_C1J = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM);
  101. WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
  102. WeaponEventBase __L__ = new WeaponEventLoad1Bullet;
  103. WeaponEventBase __T__ = new WeaponEventTrigger;
  104. WeaponEventBase __TJ_ = new WeaponEventTriggerToJam;
  105. WeaponEventBase __U__ = new WeaponEventUnjam;
  106. WeaponEventBase __M__ = new WeaponEventMechanism;
  107. WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
  108. WeaponEventBase _rto_ = new WeaponEventReloadTimeout;
  109. WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
  110. m_fsm = new WeaponFSM();
  111. // Mechanism
  112. //----------------------------------------
  113. m_fsm.AddTransition(new WeaponTransition( D0, __M__, Mech_DF));
  114. m_fsm.AddTransition(new WeaponTransition( C0, __M__, Mech_C1));
  115. m_fsm.AddTransition(new WeaponTransition( C1, __M__, Mech_C1));
  116. m_fsm.AddTransition(new WeaponTransition( Mech_C1, _fin_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  117. m_fsm.AddTransition(new WeaponTransition( Mech_C1, _fin_, C1));
  118. m_fsm.AddTransition(new WeaponTransition( Mech_C1, _abt_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  119. m_fsm.AddTransition(new WeaponTransition( Mech_C1, _abt_, C1));
  120. m_fsm.AddTransition(new WeaponTransition( DF, __M__, Mech_DF));
  121. m_fsm.AddTransition(new WeaponTransition( Mech_DF, _fin_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  122. m_fsm.AddTransition(new WeaponTransition( Mech_DF, _fin_, DF, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  123. m_fsm.AddTransition(new WeaponTransition( Mech_DF, _fin_, C1));
  124. m_fsm.AddTransition(new WeaponTransition( Mech_DF, _abt_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  125. m_fsm.AddTransition(new WeaponTransition( Mech_DF, _abt_, DF, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  126. m_fsm.AddTransition(new WeaponTransition( Mech_DF, _abt_, C1));
  127. //----------------------------------------
  128. m_fsm.AddTransition(new WeaponTransition( C0, __L__, Chamber_D0));
  129. m_fsm.AddTransition(new WeaponTransition( D0, __L__, Chamber_D0));
  130. m_fsm.AddTransition(new WeaponTransition( Chamber_D0, _fin_, C1));
  131. m_fsm.AddTransition(new WeaponTransition( Chamber_D0, _abt_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  132. m_fsm.AddTransition(new WeaponTransition( Chamber_D0, _abt_, C1));
  133. m_fsm.AddTransition(new WeaponTransition( C1, __L__, Chamber_C1, NULL, new GuardNot(new WeaponGuardInnerMagazineFull(this))));
  134. m_fsm.AddTransition(new WeaponTransition( Chamber_C1, _fin_, C1));
  135. m_fsm.AddTransition(new WeaponTransition( Chamber_C1, _abt_, C1));
  136. m_fsm.AddTransition(new WeaponTransition( DF, __L__, Chamber_DF, NULL, new GuardNot(new WeaponGuardInnerMagazineFull(this))));
  137. m_fsm.AddTransition(new WeaponTransition( Chamber_DF, _fin_, C1));
  138. m_fsm.AddTransition(new WeaponTransition( Chamber_DF, _abt_, DF, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  139. m_fsm.AddTransition(new WeaponTransition( Chamber_DF, _abt_, C1));
  140. //------------------------------------------
  141. m_fsm.AddTransition(new WeaponTransition( JF, __U__, Unjam_JF));
  142. m_fsm.AddTransition(new WeaponTransition( Unjam_JF, _fin_, JF, NULL, new WeaponGuardJammed(this)));
  143. m_fsm.AddTransition(new WeaponTransition( Unjam_JF, _fin_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  144. m_fsm.AddTransition(new WeaponTransition( Unjam_JF, _fin_, C1));
  145. m_fsm.AddTransition(new WeaponTransition( Unjam_JF, _abt_, JF, NULL, new WeaponGuardJammed(this)));
  146. m_fsm.AddTransition(new WeaponTransition( Unjam_JF, _abt_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  147. m_fsm.AddTransition(new WeaponTransition( Unjam_JF, _abt_, C1));
  148. //-----------------------------------------
  149. // fire
  150. m_fsm.AddTransition(new WeaponTransition( D0, __T__, Trigger_D0)); // fire.cocked
  151. m_fsm.AddTransition(new WeaponTransition( Trigger_D0, _fin_, D0));
  152. m_fsm.AddTransition(new WeaponTransition( Trigger_D0, _dto_, D0));
  153. m_fsm.AddTransition(new WeaponTransition( Trigger_D0, _abt_, D0));
  154. m_fsm.AddTransition(new WeaponTransition( C0, __T__, Trigger_C0)); // fire.cocked
  155. m_fsm.AddTransition(new WeaponTransition( Trigger_C0, _fin_, D0));
  156. m_fsm.AddTransition(new WeaponTransition( Trigger_C0, _dto_, D0));
  157. m_fsm.AddTransition(new WeaponTransition( Trigger_C0, _abt_, D0));
  158. m_fsm.AddTransition(new WeaponTransition( C1, __T__, Trigger_C1)); // fire.cocked
  159. m_fsm.AddTransition(new WeaponTransition( Trigger_C1, _fin_, DF));
  160. m_fsm.AddTransition(new WeaponTransition( Trigger_C1, _rto_, DF));
  161. m_fsm.AddTransition(new WeaponTransition( Trigger_C1, _abt_, DF));
  162. m_fsm.AddTransition(new WeaponTransition( DF, __T__, Trigger_DF)); // fire.cocked
  163. m_fsm.AddTransition(new WeaponTransition( Trigger_DF, _fin_, DF));
  164. m_fsm.AddTransition(new WeaponTransition( Trigger_DF, _dto_, DF));
  165. m_fsm.AddTransition(new WeaponTransition( Trigger_DF, _abt_, DF));
  166. m_fsm.AddTransition(new WeaponTransition( JF, __T__, Trigger_JF)); // fire.cocked
  167. m_fsm.AddTransition(new WeaponTransition( Trigger_JF, _fin_, JF));
  168. m_fsm.AddTransition(new WeaponTransition( Trigger_JF, _dto_, JF));
  169. m_fsm.AddTransition(new WeaponTransition( Trigger_JF, _abt_, JF));
  170. m_fsm.AddTransition(new WeaponTransition( JF, __TJ_, Trigger_C1J)); // fire.cocked
  171. m_fsm.AddTransition(new WeaponTransition( Trigger_C1J, _fin_, JF));
  172. m_fsm.AddTransition(new WeaponTransition( Trigger_C1J, _rto_, JF));
  173. m_fsm.AddTransition(new WeaponTransition( Trigger_C1J, _abt_, JF));
  174. //---------------------------------------------
  175. SetInitialState(D0);
  176. SelectionBulletHide();
  177. HideMagazine();
  178. m_fsm.Start();
  179. }
  180. override bool CanChamberBullet (int muzzleIndex, Magazine mag)
  181. {
  182. return CanChamberFromMag(muzzleIndex, mag) && !IsInternalMagazineFull(muzzleIndex);
  183. }
  184. override void SetActions()
  185. {
  186. super.SetActions();
  187. AddAction(FirearmActionLoadMultiBullet);
  188. RemoveAction(FirearmActionLoadBulletQuick); // Easy reload
  189. AddAction(FirearmActionLoadMultiBulletQuick); // Easy reload
  190. }
  191. };
  192. class Repeater : Repeater_Base
  193. {
  194. override RecoilBase SpawnRecoilObject()
  195. {
  196. return new RepeaterRecoil(this);
  197. }
  198. //Debug menu Spawn Ground Special
  199. override void OnDebugSpawn()
  200. {
  201. super.OnDebugSpawn();
  202. EntityAI entity;
  203. if ( Class.CastTo(entity, this) )
  204. {
  205. entity.SpawnEntityOnGroundPos("Ammo_357", entity.GetPosition());
  206. }
  207. }
  208. };