riflesingleshotmanual_base.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /**@class Izh18_Base
  2. * @brief base for Izh18
  3. * @NOTE name copies config base class
  4. **/
  5. class RifleSingleShotManual_Base extends RifleSingleShot_Base
  6. {
  7. void RifleSingleShotManual_Base ()
  8. {
  9. }
  10. override void InitStateMachine()
  11. {
  12. // setup abilities
  13. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  14. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED));
  15. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED));
  16. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_OPENED));
  17. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
  18. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_END));
  19. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
  20. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED));
  21. // setup state machine
  22. // basic weapon states
  23. WeaponStableState E = new RSSEmpty(this, NULL, RSSAnimState.DEFAULT);
  24. WeaponStableState F = new RSSFireout(this, NULL, RSSAnimState.DEFAULT);
  25. WeaponStableState J = new RSSJammed(this, NULL, RSSAnimState.DEFAULT);
  26. WeaponStableState L = new RSSLoaded(this, NULL, RSSAnimState.DEFAULT);
  27. // unstable (intermediate) states
  28. WeaponStateBase Mech_E = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED);
  29. WeaponStateBase Mech_F = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  30. WeaponStateBase Mech_L = new WeaponEjectBullet(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  31. WeaponChambering Chamber_E = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED);
  32. WeaponChambering Chamber_F = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_OPENED);
  33. //WeaponStateBase Chamber_L = new RifleReChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED);
  34. WeaponStateBase Trigger_E = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED);
  35. WeaponStateBase Trigger_L = new WeaponFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL);
  36. WeaponStateBase Trigger_F = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED);
  37. WeaponStateBase Trigger_LJ = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM);
  38. WeaponStateBase Unjam_J = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START);
  39. // events
  40. WeaponEventBase __M__ = new WeaponEventMechanism;
  41. WeaponEventBase __T__ = new WeaponEventTrigger;
  42. WeaponEventBase __TJ_ = new WeaponEventTriggerToJam;
  43. WeaponEventBase __L__ = new WeaponEventLoad1Bullet;
  44. WeaponEventBase __U__ = new WeaponEventUnjam;
  45. WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
  46. WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
  47. WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
  48. m_fsm = new WeaponFSM();
  49. // charging
  50. m_fsm.AddTransition(new WeaponTransition( E, __M__, Mech_E));
  51. m_fsm.AddTransition(new WeaponTransition( Mech_E, _fin_, E));
  52. m_fsm.AddTransition(new WeaponTransition( Mech_E, _abt_, E));
  53. m_fsm.AddTransition(new WeaponTransition( F, __M__, Mech_F));
  54. m_fsm.AddTransition(new WeaponTransition( Mech_F, _fin_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  55. m_fsm.AddTransition(new WeaponTransition( Mech_F, _fin_, E));
  56. m_fsm.AddTransition(new WeaponTransition( Mech_F, _abt_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  57. m_fsm.AddTransition(new WeaponTransition( Mech_F, _abt_, E));
  58. // eject good cartridge
  59. m_fsm.AddTransition(new WeaponTransition( L, __M__, Mech_L));
  60. m_fsm.AddTransition(new WeaponTransition( Mech_L, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  61. m_fsm.AddTransition(new WeaponTransition( Mech_L, _fin_, L));
  62. m_fsm.AddTransition(new WeaponTransition( Mech_L, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  63. m_fsm.AddTransition(new WeaponTransition( Mech_L, _abt_, L));
  64. // load bullet
  65. m_fsm.AddTransition(new WeaponTransition( E, __L__, Chamber_E));
  66. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  67. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _fin_, L));
  68. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  69. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _abt_, L));
  70. m_fsm.AddTransition(new WeaponTransition( F, __L__, Chamber_F));
  71. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _fin_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  72. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  73. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _fin_, L));
  74. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _abt_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  75. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  76. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _abt_, L));
  77. // fire
  78. m_fsm.AddTransition(new WeaponTransition( E, __T__, Trigger_E)); // fire cocked
  79. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _fin_, E));
  80. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _dto_, E));
  81. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _abt_, E));
  82. m_fsm.AddTransition(new WeaponTransition( F, __T__, Trigger_F)); // fire uncocked
  83. m_fsm.AddTransition(new WeaponTransition( Trigger_F, _fin_, F));
  84. m_fsm.AddTransition(new WeaponTransition( Trigger_F, _dto_, F));
  85. m_fsm.AddTransition(new WeaponTransition( Trigger_F, _abt_, F));
  86. m_fsm.AddTransition(new WeaponTransition( L, __T__, Trigger_L)); // a) fire if not jammed
  87. m_fsm.AddTransition(new WeaponTransition( Trigger_L, _fin_, F));
  88. m_fsm.AddTransition(new WeaponTransition( Trigger_L, _abt_, F));
  89. m_fsm.AddTransition(new WeaponTransition( L, __TJ_, Trigger_LJ)); // a) fire if not jammed
  90. m_fsm.AddTransition(new WeaponTransition( Trigger_LJ, _fin_, J));
  91. m_fsm.AddTransition(new WeaponTransition( Trigger_LJ, _abt_, J));
  92. // unjam
  93. m_fsm.AddTransition(new WeaponTransition( J, __U__, Unjam_J));
  94. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _fin_, J, NULL, new WeaponGuardJammed(this)));
  95. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _fin_, E));
  96. // initial state setup
  97. bool empty = true;
  98. bool discharged = false; // @TODO:
  99. WeaponStableState init_state = E;
  100. if (empty)
  101. {
  102. if (!discharged)
  103. init_state = E;
  104. }
  105. else
  106. {
  107. init_state = L; // can init state == load/jammed?
  108. }
  109. SetInitialState(init_state);
  110. SelectionBulletHide();
  111. m_fsm.Start();
  112. }
  113. };