riflesingleshot_base.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. enum RSSAnimState
  2. {
  3. DEFAULT = 0, ///< default weapon state, closed and discharged
  4. };
  5. enum RSSStableStateID
  6. {
  7. UNKNOWN = 0,
  8. Empty = 1,
  9. Fireout = 2,
  10. Loaded = 3,
  11. Jammed = 4,
  12. }
  13. class RSSEmpty extends WeaponStableState
  14. {
  15. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Empty E"); } super.OnEntry(e); }
  16. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Empty E"); } }
  17. override int GetCurrentStateID () { return RSSStableStateID.Empty; }
  18. override bool HasBullet () { return false; }
  19. override bool HasMagazine () { return false; }
  20. override bool IsJammed () { return false; }
  21. override bool IsRepairEnabled () { return true; }
  22. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  23. };
  24. class RSSFireout extends WeaponStableState
  25. {
  26. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Fireout F"); } super.OnEntry(e); }
  27. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Fireout F"); } }
  28. override int GetCurrentStateID () { return RSSStableStateID.Fireout; }
  29. override bool HasBullet () { return true; }
  30. override bool HasMagazine () { return false; }
  31. override bool IsJammed () { return false; }
  32. override bool IsRepairEnabled () { return true; }
  33. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
  34. };
  35. class RSSLoaded extends WeaponStableState
  36. {
  37. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Loaded C"); } super.OnEntry(e); }
  38. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Loaded C"); } }
  39. override int GetCurrentStateID () { return RSSStableStateID.Loaded; }
  40. override bool HasBullet () { return true; }
  41. override bool HasMagazine () { return false; }
  42. override bool IsJammed () { return false; }
  43. override bool IsRepairEnabled () { return true; }
  44. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; }
  45. };
  46. class RSSJammed extends WeaponStateJammed
  47. {
  48. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Jammed J"); } super.OnEntry(e); }
  49. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Jammed J"); } }
  50. override int GetCurrentStateID () { return RSSStableStateID.Jammed; }
  51. override bool HasBullet () { return true; }
  52. override bool HasMagazine () { return false; }
  53. override bool IsJammed () { return true; }
  54. override bool IsBoltOpen () { return true; }
  55. override bool IsRepairEnabled () { return true; }
  56. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
  57. };
  58. /**@class Izh18_Base
  59. * @brief base for Izh18
  60. * @NOTE name copies config base class
  61. **/
  62. class RifleSingleShot_Base extends Rifle_Base
  63. {
  64. void RifleSingleShot_Base ()
  65. {
  66. }
  67. override void InitStateMachine()
  68. {
  69. // setup abilities
  70. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  71. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED));
  72. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
  73. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_END));
  74. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
  75. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED));
  76. // setup state machine
  77. // basic weapon states
  78. WeaponStableState E = new RSSEmpty(this, NULL, RSSAnimState.DEFAULT);
  79. WeaponStableState F = new RSSFireout(this, NULL, RSSAnimState.DEFAULT);
  80. WeaponStableState J = new RSSJammed(this, NULL, RSSAnimState.DEFAULT);
  81. WeaponStableState L = new RSSLoaded(this, NULL, RSSAnimState.DEFAULT);
  82. // unstable (intermediate) states
  83. WeaponStateBase Mech_F = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  84. WeaponStateBase Mech_L = new WeaponEjectBullet(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  85. WeaponChambering Chamber_E = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED);
  86. WeaponChambering Chamber_F = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED);
  87. //WeaponStateBase Chamber_L = new RifleReChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED);
  88. WeaponStateBase Trigger_E = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED);
  89. WeaponStateBase Trigger_L = new WeaponFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL);
  90. WeaponStateBase Trigger_F = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED);
  91. WeaponStateBase Trigger_LJ = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM);
  92. WeaponStateBase Unjam_J = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START);
  93. // events
  94. WeaponEventBase __M__ = new WeaponEventMechanism;
  95. WeaponEventBase __T__ = new WeaponEventTrigger;
  96. WeaponEventBase __TJ_ = new WeaponEventTriggerToJam;
  97. WeaponEventBase __L__ = new WeaponEventLoad1Bullet;
  98. WeaponEventBase __U__ = new WeaponEventUnjam;
  99. WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
  100. WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
  101. WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
  102. m_fsm = new WeaponFSM();
  103. // charging
  104. m_fsm.AddTransition(new WeaponTransition( E, __M__, Mech_F));
  105. m_fsm.AddTransition(new WeaponTransition( F, __M__, Mech_F));
  106. m_fsm.AddTransition(new WeaponTransition( Mech_F, _fin_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  107. m_fsm.AddTransition(new WeaponTransition( Mech_F, _fin_, E));
  108. m_fsm.AddTransition(new WeaponTransition( Mech_F, _abt_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  109. m_fsm.AddTransition(new WeaponTransition( Mech_F, _abt_, E));
  110. // eject good cartridge
  111. m_fsm.AddTransition(new WeaponTransition( L, __M__, Mech_L));
  112. m_fsm.AddTransition(new WeaponTransition( Mech_L, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  113. m_fsm.AddTransition(new WeaponTransition( Mech_L, _fin_, L));
  114. m_fsm.AddTransition(new WeaponTransition( Mech_L, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  115. m_fsm.AddTransition(new WeaponTransition( Mech_L, _abt_, L));
  116. // load bullet
  117. m_fsm.AddTransition(new WeaponTransition( E, __L__, Chamber_E));
  118. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  119. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _fin_, L));
  120. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  121. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _abt_, L));
  122. m_fsm.AddTransition(new WeaponTransition( F, __L__, Chamber_F));
  123. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _fin_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  124. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  125. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _fin_, L));
  126. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _abt_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  127. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  128. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _abt_, L));
  129. // fire
  130. m_fsm.AddTransition(new WeaponTransition( E, __T__, Trigger_E)); // fire cocked
  131. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _fin_, E));
  132. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _dto_, E));
  133. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _abt_, E));
  134. m_fsm.AddTransition(new WeaponTransition( F, __T__, Trigger_F)); // fire uncocked
  135. m_fsm.AddTransition(new WeaponTransition( Trigger_F, _fin_, F));
  136. m_fsm.AddTransition(new WeaponTransition( Trigger_F, _dto_, F));
  137. m_fsm.AddTransition(new WeaponTransition( Trigger_F, _abt_, F));
  138. m_fsm.AddTransition(new WeaponTransition( L, __T__, Trigger_L)); // a) fire if not jammed
  139. m_fsm.AddTransition(new WeaponTransition( Trigger_L, _fin_, F));
  140. m_fsm.AddTransition(new WeaponTransition( Trigger_L, _abt_, F));
  141. m_fsm.AddTransition(new WeaponTransition( L, __TJ_, Trigger_LJ)); // a) fire if not jammed
  142. m_fsm.AddTransition(new WeaponTransition( Trigger_LJ, _fin_, J));
  143. m_fsm.AddTransition(new WeaponTransition( Trigger_LJ, _abt_, J));
  144. // unjam
  145. m_fsm.AddTransition(new WeaponTransition( J, __U__, Unjam_J));
  146. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _fin_, J, NULL, new WeaponGuardJammed(this)));
  147. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _fin_, E));
  148. // initial state setup
  149. bool empty = true;
  150. bool discharged = false; // @TODO:
  151. WeaponStableState init_state = E;
  152. if (empty)
  153. {
  154. if (!discharged)
  155. init_state = E;
  156. }
  157. else
  158. {
  159. init_state = L; // can init state == load/jammed?
  160. }
  161. SetInitialState(init_state);
  162. SelectionBulletHide();
  163. m_fsm.Start();
  164. }
  165. override float GetChanceToJam()
  166. {
  167. return 0.0;
  168. }
  169. };