CObstacleInstance.cpp 3.3 KB

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