singleshotpistol_base.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. enum SSPAnimState
  2. {
  3. COCKED = 0, ///< default weapon state, closed and discharged
  4. UNCOCKED = 1, ///< default weapon state, closed and discharged
  5. };
  6. enum SSPStableStateID
  7. {
  8. UNKNOWN = 0,
  9. Empty = 1,
  10. Fireout = 2,
  11. Loaded = 3,
  12. }
  13. class SSPEmpty 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 SSPStableStateID.Empty; }
  18. override bool HasBullet () { return false; }
  19. override bool HasMagazine () { return false; }
  20. override bool IsJammed () { return false; }
  21. override bool IsBoltOpen () { return false; }
  22. override bool IsRepairEnabled () { return true; }
  23. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  24. };
  25. class SSPFireout extends WeaponStableState
  26. {
  27. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Fireout F"); } super.OnEntry(e); }
  28. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Fireout F"); } }
  29. override int GetCurrentStateID () { return SSPStableStateID.Fireout; }
  30. override bool HasBullet () { return true; }
  31. override bool HasMagazine () { return false; }
  32. override bool IsJammed () { return false; }
  33. override bool IsBoltOpen () { return false; }
  34. override bool IsRepairEnabled () { return true; }
  35. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
  36. };
  37. class SSPLoaded extends WeaponStableState
  38. {
  39. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Loaded C"); } super.OnEntry(e); }
  40. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Loaded C"); } }
  41. override int GetCurrentStateID () { return SSPStableStateID.Loaded; }
  42. override bool HasBullet () { return true; }
  43. override bool HasMagazine () { return false; }
  44. override bool IsJammed () { return false; }
  45. override bool IsBoltOpen () { return false; }
  46. override bool IsRepairEnabled () { return true; }
  47. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; }
  48. };
  49. class SingleShotPistol_Base: Weapon_Base
  50. {
  51. override void InitStateMachine()
  52. {
  53. // setup abilities
  54. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  55. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED));
  56. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED));
  57. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
  58. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED));
  59. // setup state machine
  60. // basic weapon states
  61. WeaponStableState E = new SSPEmpty(this, NULL, SSPAnimState.UNCOCKED);
  62. WeaponStableState F = new SSPFireout(this, NULL, SSPAnimState.UNCOCKED);
  63. WeaponStableState L = new SSPLoaded(this, NULL, SSPAnimState.COCKED);
  64. // unstable (intermediate) states
  65. WeaponStateBase Mech_F = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  66. WeaponStateBase Mech_L = new WeaponEjectBullet(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED);
  67. WeaponStateBase Chamber_E = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED);
  68. WeaponStateBase Chamber_F = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED);
  69. //WeaponStateBase Chamber_L = new RifleReChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED);
  70. WeaponStateBase Trigger_E = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED);
  71. WeaponStateBase Trigger_L = new WeaponFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL);
  72. WeaponStateBase Trigger_F = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED);
  73. // events
  74. WeaponEventBase __M__ = new WeaponEventMechanism;
  75. WeaponEventBase __T__ = new WeaponEventTrigger;
  76. WeaponEventBase __TJ_ = new WeaponEventTriggerToJam;
  77. WeaponEventBase __L__ = new WeaponEventLoad1Bullet;
  78. WeaponEventBase __U__ = new WeaponEventUnjam;
  79. WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
  80. WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
  81. WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
  82. m_fsm = new WeaponFSM();
  83. // charging
  84. m_fsm.AddTransition(new WeaponTransition( E, __M__, Mech_F));
  85. m_fsm.AddTransition(new WeaponTransition( F, __M__, Mech_F));
  86. m_fsm.AddTransition(new WeaponTransition( Mech_F, _fin_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  87. m_fsm.AddTransition(new WeaponTransition( Mech_F, _fin_, E));
  88. m_fsm.AddTransition(new WeaponTransition( Mech_F, _abt_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  89. m_fsm.AddTransition(new WeaponTransition( Mech_F, _abt_, E));
  90. // eject good cartridge
  91. m_fsm.AddTransition(new WeaponTransition( L, __M__, Mech_L));
  92. m_fsm.AddTransition(new WeaponTransition( Mech_L, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  93. m_fsm.AddTransition(new WeaponTransition( Mech_L, _fin_, L));
  94. m_fsm.AddTransition(new WeaponTransition( Mech_L, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  95. m_fsm.AddTransition(new WeaponTransition( Mech_L, _abt_, L));
  96. m_fsm.AddTransition(new WeaponTransition( E, __L__, Chamber_F));
  97. m_fsm.AddTransition(new WeaponTransition( F, __L__, Chamber_F));
  98. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _fin_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  99. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  100. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _fin_, L));
  101. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _abt_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  102. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  103. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _abt_, L));
  104. // fire
  105. m_fsm.AddTransition(new WeaponTransition( E, __T__, Trigger_E)); // fire cocked
  106. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _fin_, E));
  107. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _dto_, E));
  108. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _abt_, E));
  109. m_fsm.AddTransition(new WeaponTransition( F, __T__, Trigger_F)); // fire uncocked
  110. m_fsm.AddTransition(new WeaponTransition( Trigger_F, _fin_, F));
  111. m_fsm.AddTransition(new WeaponTransition( Trigger_F, _dto_, F));
  112. m_fsm.AddTransition(new WeaponTransition( Trigger_F, _abt_, F));
  113. m_fsm.AddTransition(new WeaponTransition( L, __T__, Trigger_L)); // a) fire if not jammed
  114. m_fsm.AddTransition(new WeaponTransition( Trigger_L, _fin_, F));
  115. m_fsm.AddTransition(new WeaponTransition( Trigger_L, _abt_, F));
  116. // initial state setup
  117. bool empty = true;
  118. bool discharged = false; // @TODO:
  119. WeaponStableState init_state = E;
  120. if (empty)
  121. {
  122. if (!discharged)
  123. init_state = E;
  124. }
  125. else
  126. {
  127. init_state = L; // can init state == load/jammed?
  128. }
  129. SetInitialState(init_state);
  130. SelectionBulletHide();
  131. m_fsm.Start();
  132. }
  133. };