ReachabilityInfo.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * ReachabilityInfo.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "ReachabilityInfo.h"
  12. #include "Unit.h"
  13. ReachabilityInfo::Parameters::Parameters()
  14. {
  15. perspective = BattlePerspective::ALL_KNOWING;
  16. side = 0;
  17. doubleWide = flying = false;
  18. }
  19. ReachabilityInfo::Parameters::Parameters(const battle::Unit * Stack, BattleHex StartPosition)
  20. {
  21. perspective = (BattlePerspective::BattlePerspective)(Stack->unitSide());
  22. startPosition = StartPosition;
  23. doubleWide = Stack->doubleWide();
  24. side = Stack->unitSide();
  25. flying = Stack->hasBonusOfType(Bonus::FLYING);
  26. knownAccessible = battle::Unit::getHexes(startPosition, doubleWide, side);
  27. }
  28. ReachabilityInfo::ReachabilityInfo()
  29. {
  30. distances.fill(INFINITE_DIST);
  31. predecessors.fill(BattleHex::INVALID);
  32. }
  33. bool ReachabilityInfo::isReachable(BattleHex hex) const
  34. {
  35. return distances[hex] < INFINITE_DIST;
  36. }
  37. int ReachabilityInfo::distToNearestNeighbour(
  38. const battle::Unit * attacker,
  39. const battle::Unit * defender,
  40. BattleHex * chosenHex) const
  41. {
  42. int ret = 1000000;
  43. auto defenderHexes = battle::Unit::getHexes(
  44. defender->getPosition(),
  45. defender->doubleWide(),
  46. defender->unitSide());
  47. std::vector<BattleHex> targetableHexes;
  48. for(auto defenderHex : defenderHexes)
  49. {
  50. vstd::concatenate(targetableHexes, battle::Unit::getHexes(
  51. defenderHex,
  52. attacker->doubleWide(),
  53. defender->unitSide()));
  54. }
  55. vstd::removeDuplicates(targetableHexes);
  56. for(auto targetableHex : targetableHexes)
  57. {
  58. for(auto & n : targetableHex.neighbouringTiles())
  59. {
  60. if(distances[n] >= 0 && distances[n] < ret)
  61. {
  62. ret = distances[n];
  63. if(chosenHex)
  64. *chosenHex = n;
  65. }
  66. }
  67. }
  68. return ret;
  69. }