ThreatMap.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. * ThreatMap.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. /*
  12. #include "ThreatMap.h"
  13. #include "StdInc.h"
  14. template <typename Container, typename Pred>
  15. auto sum(const Container & c, Pred p) -> decltype(p(*std::begin(c)))
  16. {
  17. double ret = 0;
  18. for(const auto &element : c)
  19. {
  20. ret += p(element);
  21. }
  22. return ret;
  23. }
  24. ThreatMap::ThreatMap(const CStack *Endangered) : endangered(Endangered)
  25. {
  26. sufferedDamage.fill(0);
  27. for(const CStack *enemy : getCbc()->battleGetStacks())
  28. {
  29. //Consider only stacks of different owner
  30. if(enemy->unitSide() == endangered->unitSide())
  31. continue;
  32. //Look-up which tiles can be melee-attacked
  33. std::array<bool, GameConstants::BFIELD_SIZE> meleeAttackable;
  34. meleeAttackable.fill(false);
  35. auto enemyReachability = getCbc()->getReachability(enemy);
  36. for(int i = 0; i < GameConstants::BFIELD_SIZE; i++)
  37. {
  38. if(enemyReachability.isReachable(i))
  39. {
  40. meleeAttackable[i] = true;
  41. for(auto n : BattleHex(i).neighbouringTiles())
  42. meleeAttackable[n] = true;
  43. }
  44. }
  45. //Gather possible assaults
  46. for(int i = 0; i < GameConstants::BFIELD_SIZE; i++)
  47. {
  48. if(getCbc()->battleCanShoot(enemy, i))
  49. threatMap[i].push_back(BattleAttackInfo(enemy, endangered, true));
  50. else if(meleeAttackable[i])
  51. {
  52. BattleAttackInfo bai(enemy, endangered, false);
  53. bai.chargedFields = std::max(BattleHex::getDistance(enemy->position, i) - 1, 0); //TODO check real distance (BFS), not just metric
  54. threatMap[i].push_back(BattleAttackInfo(bai));
  55. }
  56. }
  57. }
  58. for(int i = 0; i < GameConstants::BFIELD_SIZE; i++)
  59. {
  60. sufferedDamage[i] = sum(threatMap[i], [](const BattleAttackInfo &bai) -> int
  61. {
  62. auto dmg = getCbc()->calculateDmgRange(bai);
  63. return (dmg.first + dmg.second)/2;
  64. });
  65. }
  66. }
  67. */ // These lines may be useful but they are't used in the code.