/TGame/TCommon/Combat/States/CombatState_Charging.cpp

http://awoe.googlecode.com/ · C++ · 137 lines · 105 code · 21 blank · 11 comment · 15 complexity · 5e6ec4b313d1ef4418748ab38586cc28 MD5 · raw file

  1. #include "stdafx.h"
  2. #include "CombatState_Charging.h"
  3. #include "Combat/EvtCombat.h"
  4. #include "Event/EvtImp.h"
  5. #include "Combat/CombatSysImp.h"
  6. #include "Entity/EntityIf.h"
  7. #include "Combat/CombatDefinition.h"
  8. #include "Move/EvtMove.h"
  9. enum
  10. {
  11. time_InCharging = 15000,
  12. };
  13. CombatState_Charging::CombatState_Charging(void)
  14. {
  15. }
  16. CombatState_Charging::~CombatState_Charging()
  17. {
  18. }
  19. void
  20. CombatState_Charging::enter()
  21. {
  22. //
  23. // if m_nTTL == 0, ICombatSys will keep in Charging states until some one else set me to another state
  24. // if m_nTTL > 0, ICombatSys will transfer to casting state when time expired
  25. //
  26. m_nTTL = 0;
  27. }
  28. void
  29. CombatState_Charging::leave()
  30. {
  31. //
  32. // In range
  33. m_wpEntity->setMoveState(Move::mst_Idle);
  34. }
  35. bool
  36. CombatState_Charging::update(int nElapse)
  37. {
  38. m_nTTL-= nElapse;
  39. if (m_nTTL<=0)
  40. {
  41. IEntity* pTarget = m_wpCombat->getTargetCC();
  42. if (pTarget)
  43. {
  44. int nDstTileX = 0;
  45. int nDstTileZ = 0;
  46. //pTarget->getTilePosition(nDstTileX, nDstTileZ);
  47. int nCurTileX = 0;
  48. int nCurTileZ = 0;
  49. //m_wpEntity->getTilePosition(nCurTileX, nCurTileZ);
  50. nCurTileX -= nDstTileX;
  51. nCurTileZ -= nDstTileZ;
  52. if ((nCurTileX*nCurTileX + nCurTileZ*nCurTileZ)<16)
  53. {
  54. m_wpCombat->setState(Combat::CBS_Casting);
  55. }
  56. else
  57. {
  58. //
  59. // If target is moving or I am not moving
  60. //
  61. if ( pTarget->getMoveState()==Move::mst_Moving ||
  62. m_wpEntity->getMoveState()!=Move::mst_Moving)
  63. {
  64. EvtImp ge(EVT_Move, int (nDstTileX * 1000), int (nDstTileZ * 1000), Move::MT_RUN);
  65. m_wpEntity->onEvent(ge);
  66. }
  67. m_nTTL = 1000;
  68. }
  69. }
  70. else
  71. {
  72. m_wpCombat->setState(Combat::CBS_Ready);
  73. }
  74. }
  75. return true;
  76. }
  77. void
  78. CombatState_Charging::onEvent(IEvt& evt)
  79. {
  80. if (evt.getID()==EVT_CastStart)
  81. {
  82. if (!m_wpCombat->isCalculator())
  83. {
  84. GECast* pGE = static_cast<GECast*>(&evt);
  85. m_wpCombat->onEvent_Cast(evt);
  86. m_wpCombat->setState(Combat::CBS_Ready);
  87. }
  88. else
  89. {
  90. LOG_ERROR("Failed, calculator should not received cast start when charging!\n");
  91. }
  92. }
  93. else if (evt.getID()==EVT_CastEnd)
  94. {
  95. if (!m_wpCombat->isCalculator())
  96. {
  97. m_wpCombat->setState(Combat::CBS_CoolDown);
  98. }
  99. else
  100. {
  101. LOG_ERROR_V("Failed to cast end in : %d !\n", m_wpCombat->getStateName());
  102. }
  103. }
  104. else if (evt.getID()==EVT_CastResult)
  105. {
  106. m_wpCombat->onEvent_CastResult(evt);
  107. }
  108. else if (evt.getID()==EVT_CastPrep)
  109. {
  110. m_wpCombat->onEvent_CastPrep(evt);
  111. }
  112. else if (evt.getID()==EVT_TargetSelected)
  113. {
  114. m_wpCombat->onEvent_Target(evt);
  115. }
  116. }