/TGame/TCommon/Gene/Status/GEDOT.cpp

http://awoe.googlecode.com/ · C++ · 172 lines · 132 code · 33 blank · 7 comment · 22 complexity · 0bb9b9b00a06540c6669b16eb6a1e8f8 MD5 · raw file

  1. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2. // GEDOT.cpp
  3. // 2010?1?20?
  4. // Copyright ?2007, 2010, 8DWorld, Inc. All rights reserved.
  5. //
  6. //
  7. ///////////////////////////////////////////////////////////////////////////////////////////////////
  8. #include "stdafx.h"
  9. #include "GEDOT.h"
  10. #include "Entity/EntityIf.h"
  11. #include "Combat/CombatSysIf.h"
  12. #include "Gene/GeneCreateDataIf.h"
  13. GEDOT::GEDOT()
  14. {
  15. }
  16. bool
  17. GEDOT::onAttach()
  18. {
  19. if (! __super::onAttach())
  20. {
  21. return false;
  22. }
  23. if (m_nTTL<=0 || m_wpSData->getDataZ()<=0)
  24. {
  25. return false;
  26. }
  27. m_nTimeInterval = m_wpSData->getData(ArgIdx_IntervalTime);
  28. if (m_nTimeInterval<0)
  29. {
  30. m_nTimeInterval = 1000;
  31. }
  32. m_nDamageRemain = m_wpSData->getData(ArgIdx_FullBaseDamage);
  33. CalculateDamage(m_nDamageRemain);
  34. m_nDamagePerTime = m_nDamageRemain * m_nTimeInterval / m_wpSData->getDataZ();
  35. if (m_nDamagePerTime==0)
  36. {
  37. LOG_WARN("Wain, Damage Per Time is zeo in Dot\n");
  38. }
  39. m_nTimeNextDamage = m_wpSData->getDataZ() - m_nTimeInterval;
  40. if (m_wpSData->getDataZ()>0 && m_wpSData->getDataZ()!=m_nTTL)
  41. {
  42. while(m_nTimeNextDamage>=m_nTTL)
  43. {
  44. m_nTimeNextDamage -= m_nTimeInterval;
  45. m_nDamageRemain -= m_nDamagePerTime;
  46. }
  47. }
  48. return true;
  49. }
  50. bool
  51. GEDOT::onUpdate(int nElapse)
  52. {
  53. __super::onUpdate(nElapse);
  54. if (m_nTTL<=0)
  55. {
  56. m_wpCombat->updateHP(m_nDamageRemain);
  57. return false;
  58. }
  59. else if (m_nTTL<=m_nTimeNextDamage)
  60. {
  61. m_nDamageRemain -= m_nDamagePerTime;
  62. m_nTimeNextDamage -= m_nTimeInterval;
  63. m_wpCombat->updateHP(m_nDamagePerTime);
  64. }
  65. return true;
  66. }
  67. bool
  68. GEDOT::CalculateDamage(int& nD)
  69. {
  70. if (nD<0)
  71. {
  72. return true;
  73. }
  74. else if (nD>0)
  75. {
  76. nD = -nD;
  77. }
  78. else
  79. {
  80. nD = -1;
  81. }
  82. return false;
  83. }
  84. GEDOT_Element::GEDOT_Element(short nElemID)
  85. :m_nWhichElement(nElemID), m_nTheElementValue(0), m_nTheCaster(0)
  86. {
  87. }
  88. bool
  89. GEDOT_Element::onInit(IGeneCreateData& createData)
  90. {
  91. if (m_nWhichElement<Combat::CBP_Start || m_nWhichElement>=Combat::CBP_End)
  92. {
  93. m_nWhichElement = Combat::CBP_Fire;
  94. }
  95. m_nTheCaster = createData.getSrcEntityID();
  96. IEntity* pCaster = createData.getSrcEntity();
  97. if (pCaster && pCaster->getCombatSys())
  98. {
  99. m_nTheElementValue = 0;
  100. }
  101. else
  102. {
  103. m_nTheElementValue = 0;
  104. }
  105. return true;
  106. }
  107. bool GEDOT_Element::onAttach()
  108. {
  109. if (__super::onAttach())
  110. {
  111. m_nDamageRatioOnElement = m_wpSData->getData(ArgIdx_DamageRatio_OnElement);
  112. if (m_nDamageRatioOnElement<=0)
  113. {
  114. m_nDamageRatioOnElement = 1;
  115. }
  116. return true;
  117. }
  118. else
  119. {
  120. return false;
  121. }
  122. }
  123. bool GEDOT_Element::CalculateDamage(int& nD)
  124. {
  125. int nDamage = m_nDamageRatioOnElement * m_nTheElementValue / 1000;
  126. if (nD<=0)
  127. {
  128. nD = nD - nDamage;
  129. }
  130. else
  131. {
  132. nD = -nD - nDamage;
  133. }
  134. if (nD>=0)
  135. {
  136. nD = -1;
  137. }
  138. return true;
  139. }