ReachabilityInfo.cpp 1.9 KB

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