CObstacleInstance.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include "StdInc.h"
  2. #include "CObstacleInstance.h"
  3. #include "CHeroHandler.h"
  4. #include "VCMI_Lib.h"
  5. #include "CSpellHandler.h"
  6. /*
  7. * CObstacleInstance.cpp, part of VCMI engine
  8. *
  9. * Authors: listed in file AUTHORS in main folder
  10. *
  11. * License: GNU General Public License v2.0 or later
  12. * Full text of license available in license.txt file, in main folder
  13. *
  14. */
  15. CObstacleInstance::CObstacleInstance()
  16. {
  17. obstacleType = USUAL;
  18. }
  19. CObstacleInstance::~CObstacleInstance()
  20. {
  21. }
  22. const CObstacleInfo & CObstacleInstance::getInfo() const
  23. {
  24. switch(obstacleType)
  25. {
  26. case ABSOLUTE_OBSTACLE:
  27. return VLC->heroh->absoluteObstacles[ID];
  28. case USUAL:
  29. return VLC->heroh->obstacles[ID];
  30. case MOAT:
  31. assert(0);
  32. default:
  33. assert(0);
  34. }
  35. }
  36. std::vector<BattleHex> CObstacleInstance::getBlockedTiles() const
  37. {
  38. if(blocksTiles())
  39. return getAffectedTiles();
  40. return std::vector<BattleHex>();
  41. }
  42. std::vector<BattleHex> CObstacleInstance::getStoppingTile() const
  43. {
  44. if(stopsMovement())
  45. return getAffectedTiles();
  46. return std::vector<BattleHex>();
  47. }
  48. std::vector<BattleHex> CObstacleInstance::getAffectedTiles() const
  49. {
  50. switch(obstacleType)
  51. {
  52. case ABSOLUTE_OBSTACLE:
  53. case USUAL:
  54. return getInfo().getBlocked(pos);
  55. default:
  56. assert(0);
  57. return std::vector<BattleHex>();
  58. }
  59. }
  60. // bool CObstacleInstance::spellGenerated() const
  61. // {
  62. // if(obstacleType == USUAL || obstacleType == ABSOLUTE_OBSTACLE)
  63. // return false;
  64. //
  65. // return true;
  66. // }
  67. bool CObstacleInstance::visibleForSide(ui8 side, bool hasNativeStack) const
  68. {
  69. //by default obstacle is visible for everyone
  70. return true;
  71. }
  72. bool CObstacleInstance::stopsMovement() const
  73. {
  74. return obstacleType == QUICKSAND || obstacleType == MOAT;
  75. }
  76. bool CObstacleInstance::blocksTiles() const
  77. {
  78. return obstacleType == USUAL || obstacleType == ABSOLUTE_OBSTACLE || obstacleType == FORCE_FIELD;
  79. }
  80. SpellCreatedObstacle::SpellCreatedObstacle()
  81. {
  82. casterSide = -1;
  83. spellLevel = -1;
  84. casterSpellPower = -1;
  85. turnsRemaining = -1;
  86. visibleForAnotherSide = -1;
  87. }
  88. bool SpellCreatedObstacle::visibleForSide(ui8 side, bool hasNativeStack) const
  89. {
  90. switch(obstacleType)
  91. {
  92. case FIRE_WALL:
  93. case FORCE_FIELD:
  94. //these are always visible
  95. return true;
  96. case QUICKSAND:
  97. case LAND_MINE:
  98. //we hide mines and not discovered quicksands
  99. //quicksands are visible to the caster or if owned unit stepped into that particular patch
  100. //additionally if side has a native unit, mines/quicksands will be visible
  101. return casterSide == side || visibleForAnotherSide || hasNativeStack;
  102. default:
  103. assert(0);
  104. return false;
  105. }
  106. }
  107. std::vector<BattleHex> SpellCreatedObstacle::getAffectedTiles() const
  108. {
  109. switch(obstacleType)
  110. {
  111. case QUICKSAND:
  112. case LAND_MINE:
  113. case FIRE_WALL:
  114. return std::vector<BattleHex>(1, pos);
  115. case FORCE_FIELD:
  116. return SpellID(SpellID::FORCE_FIELD).toSpell()->rangeInHexes(pos, spellLevel, casterSide);
  117. //TODO Fire Wall
  118. default:
  119. assert(0);
  120. return std::vector<BattleHex>();
  121. }
  122. }
  123. void SpellCreatedObstacle::battleTurnPassed()
  124. {
  125. if(turnsRemaining > 0)
  126. turnsRemaining--;
  127. }
  128. std::vector<BattleHex> MoatObstacle::getAffectedTiles() const
  129. {
  130. //rrr... need initializer lists
  131. static const BattleHex moatHexes[] = {11, 28, 44, 61, 77, 111, 129, 146, 164, 181};
  132. return std::vector<BattleHex>(moatHexes, moatHexes + ARRAY_COUNT(moatHexes));
  133. }