riflechambering.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. class RifleChambering extends WeaponStateBase
  2. {
  3. WeaponActions m_action;
  4. int m_actionType;
  5. Magazine m_srcMagazine; /// source of the cartridge
  6. ref WeaponStateBase m_start;
  7. ref WeaponEjectCasing m_eject;
  8. ref WeaponChambering_Cartridge m_chamber;
  9. ref WeaponChambering_W4T m_w4t;
  10. void RifleChambering (Weapon_Base w = NULL, WeaponStateBase parent = NULL, WeaponActions action = WeaponActions.NONE, int actionType = -1)
  11. {
  12. m_action = action;
  13. m_actionType = actionType;
  14. // setup nested state machine
  15. m_start = new WeaponChambering_Start(m_weapon, this, m_action, m_actionType);
  16. m_eject = new WeaponEjectCasing(m_weapon, this);
  17. m_chamber = new WeaponChambering_Cartridge(m_weapon, this);
  18. m_w4t = new WeaponChambering_W4T(m_weapon, this);
  19. // events
  20. WeaponEventAnimBulletEject __be_ = new WeaponEventAnimBulletEject;
  21. WeaponEventAnimBulletShow __bs_ = new WeaponEventAnimBulletShow;
  22. WeaponEventAnimBulletInChamber __bc_ = new WeaponEventAnimBulletInChamber;
  23. WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
  24. m_fsm = new WeaponFSM(this); // @NOTE: set owner of the submachine fsm
  25. m_fsm.AddTransition(new WeaponTransition(m_start , __be_, m_eject));
  26. m_fsm.AddTransition(new WeaponTransition(m_eject , __bs_, m_chamber));
  27. m_fsm.AddTransition(new WeaponTransition(m_chamber, __bc_, m_w4t));
  28. m_fsm.AddTransition(new WeaponTransition(m_w4t , _fin_, NULL));
  29. // Safety exits
  30. m_fsm.AddTransition(new WeaponTransition(m_chamber, _fin_, null));
  31. m_fsm.AddTransition(new WeaponTransition(m_eject , _fin_, null));
  32. m_fsm.AddTransition(new WeaponTransition(m_start , _fin_, null));
  33. m_fsm.SetInitialState(m_start);
  34. }
  35. override void OnEntry (WeaponEventBase e)
  36. {
  37. if (e != NULL)
  38. {
  39. if (e.m_magazine != NULL)
  40. {
  41. if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " RifleChambering, taking mag from event e.mag=" + e.m_magazine.ToString()); }
  42. m_srcMagazine = e.m_magazine;
  43. m_chamber.m_srcMagazine = m_srcMagazine;
  44. }
  45. }
  46. else
  47. {
  48. if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " RifleChambering (e=NULL), m_srcMagazine=" + m_srcMagazine.ToString()); }
  49. }
  50. if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " m_srcMagazine=" + m_srcMagazine.ToString()); }
  51. super.OnEntry(e); // @NOTE: super at the end (prevent override from submachine start)
  52. }
  53. override void OnAbort (WeaponEventBase e)
  54. {
  55. super.OnAbort(e);
  56. m_srcMagazine = NULL;
  57. }
  58. override void OnExit (WeaponEventBase e)
  59. {
  60. super.OnExit(e);
  61. m_srcMagazine = NULL;
  62. }
  63. override bool SaveCurrentFSMState (ParamsWriteContext ctx)
  64. {
  65. if (!super.SaveCurrentFSMState(ctx))
  66. return false;
  67. if (!ctx.Write(m_srcMagazine))
  68. {
  69. Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " RifleChambering.SaveCurrentFSMState: cannot save m_srcMagazine for weapon=" + m_weapon);
  70. return false;
  71. }
  72. return true;
  73. }
  74. override bool LoadCurrentFSMState (ParamsReadContext ctx, int version)
  75. {
  76. if (!super.LoadCurrentFSMState(ctx, version))
  77. return false;
  78. if (!ctx.Read(m_srcMagazine))
  79. {
  80. Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " RifleChambering.LoadCurrentFSMState: cannot read m_srcMagazine for weapon=" + m_weapon);
  81. return false;
  82. }
  83. return true;
  84. }
  85. };