2
0

CObstacleInstance.cpp 3.1 KB

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