ReachabilityInfo.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. VCMI_LIB_NAMESPACE_BEGIN
  14. ReachabilityInfo::Parameters::Parameters(const battle::Unit * Stack, BattleHex StartPosition):
  15. perspective(static_cast<BattlePerspective::BattlePerspective>(Stack->unitSide())),
  16. startPosition(StartPosition),
  17. doubleWide(Stack->doubleWide()),
  18. side(Stack->unitSide()),
  19. flying(Stack->hasBonusOfType(BonusType::FLYING))
  20. {
  21. knownAccessible = battle::Unit::getHexes(startPosition, doubleWide, side);
  22. }
  23. ReachabilityInfo::ReachabilityInfo()
  24. {
  25. distances.fill(INFINITE_DIST);
  26. predecessors.fill(BattleHex::INVALID);
  27. }
  28. bool ReachabilityInfo::isReachable(BattleHex hex) const
  29. {
  30. return distances[hex] < INFINITE_DIST;
  31. }
  32. uint32_t ReachabilityInfo::distToNearestNeighbour(
  33. const std::vector<BattleHex> & targetHexes,
  34. BattleHex * chosenHex) const
  35. {
  36. uint32_t ret = 1000000;
  37. for(auto targetHex : targetHexes)
  38. {
  39. for(auto & n : targetHex.neighbouringTiles())
  40. {
  41. if(distances[n] < ret)
  42. {
  43. ret = distances[n];
  44. if(chosenHex)
  45. *chosenHex = n;
  46. }
  47. }
  48. }
  49. return ret;
  50. }
  51. uint32_t ReachabilityInfo::distToNearestNeighbour(
  52. const battle::Unit * attacker,
  53. const battle::Unit * defender,
  54. BattleHex * chosenHex) const
  55. {
  56. auto attackableHexes = defender->getHexes();
  57. if(attacker->doubleWide())
  58. {
  59. vstd::concatenate(attackableHexes, battle::Unit::getHexes(defender->occupiedHex(), true, attacker->unitSide()));
  60. }
  61. return distToNearestNeighbour(attackableHexes, chosenHex);
  62. }
  63. VCMI_LIB_NAMESPACE_END