/TGame/TCommon/Gene/Status/GEConfuse.cpp

http://awoe.googlecode.com/ · C++ · 147 lines · 114 code · 26 blank · 7 comment · 18 complexity · f3cf3634c6bdaff3dc20df958409275e MD5 · raw file

  1. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2. // GEConfuse.cpp
  3. // 2010?1?20?
  4. // Copyright ?2007, 2010, 8DWorld, Inc. All rights reserved.
  5. //
  6. //
  7. ///////////////////////////////////////////////////////////////////////////////////////////////////
  8. #include "stdafx.h"
  9. #include "GEConfuse.h"
  10. #include "Entity/EntityIf.h"
  11. #include "Combat/CombatSysIf.h"
  12. #include "Gene/GeneCreateDataIf.h"
  13. #include "GEFear.h"
  14. #include "GEDaze.h"
  15. static short ___style2stage2state_[3][3] =
  16. {
  17. {GEConfuse::St_Fear,GEConfuse::St_Daze,GEConfuse::St_Daze},
  18. {GEConfuse::St_Daze,GEConfuse::St_Daze,GEConfuse::St_Fear},
  19. {GEConfuse::St_Daze,GEConfuse::St_Fear,GEConfuse::St_Daze}
  20. };
  21. GEConfuse::GEConfuse()
  22. :m_nCurState(St_Null), m_pGene(NULL)
  23. {
  24. }
  25. GEConfuse::~GEConfuse()
  26. {
  27. if (m_pGene)
  28. {
  29. delete m_pGene;
  30. }
  31. }
  32. bool
  33. GEConfuse::onInit(IGeneCreateData& createData)
  34. {
  35. if (!__super::onInit(createData))
  36. {
  37. return false;
  38. }
  39. m_nTIStage = m_wpSData->getDataZ()/3;
  40. m_nTimeLineNextStage = m_wpSData->getDataZ();
  41. m_nStyle = createData.getDataX() % 3;
  42. return true;
  43. }
  44. bool
  45. GEConfuse::onAttach()
  46. {
  47. m_nCurStage = -1;
  48. while (m_nTTL<=m_nTimeLineNextStage)
  49. {
  50. m_nCurStage++;
  51. m_nTimeLineNextStage -= m_nTIStage;
  52. }
  53. if (m_nCurStage<0 || m_nCurStage>2)
  54. {
  55. m_nCurStage = 0;
  56. }
  57. setState(m_nStyle, m_nCurStage);
  58. return true;
  59. }
  60. bool
  61. GEConfuse::onDetach()
  62. {
  63. setState(-1, -1);
  64. return true;
  65. }
  66. bool
  67. GEConfuse::onUpdate(int nElapse)
  68. {
  69. __super::onUpdate(nElapse);
  70. if (m_nTTL<=0)
  71. {
  72. return false;
  73. }
  74. if (m_nTTL<=m_nTimeLineNextStage)
  75. {
  76. m_nCurStage++;
  77. if (m_nCurStage>2)
  78. {
  79. m_nCurStage = 2;
  80. }
  81. setState(m_nStyle, m_nCurStage);
  82. }
  83. return true;
  84. }
  85. void
  86. GEConfuse::setState(short nStyle, short nStage)
  87. {
  88. int nNewState = St_Null;
  89. if (nStyle>=0 && nStyle<3 &&
  90. nStage>=0 && nStage<3)
  91. {
  92. nNewState = ___style2stage2state_[nStyle][nStage];
  93. }
  94. if (m_nCurState!=nNewState)
  95. {
  96. m_nCurState = nNewState;
  97. if (m_pGene)
  98. {
  99. if (m_pGene)
  100. {
  101. m_pGene->onDetach();
  102. m_pGene->setHost(NULL);
  103. delete m_pGene;
  104. m_pGene = NULL;
  105. }
  106. if (m_nCurState==St_Daze)
  107. {
  108. m_pGene = new GEDaze;
  109. }
  110. else if (m_nCurState==St_Fear)
  111. {
  112. m_pGene = new GEFear;
  113. }
  114. if (m_pGene)
  115. {
  116. m_pGene->setHost(m_wpHost);
  117. m_pGene->onAttach();
  118. }
  119. }
  120. }
  121. }