AdventureSpellEffect.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * AdventureSpellEffect.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 "AdventureSpellEffect.h"
  12. #include "../../json/JsonNode.h"
  13. #include "../../mapObjects/CGHeroInstance.h"
  14. #include "../../callback/IGameInfoCallback.h"
  15. VCMI_LIB_NAMESPACE_BEGIN
  16. AdventureSpellRangedEffect::AdventureSpellRangedEffect(const JsonNode & config)
  17. : rangeX(config["rangeX"].Integer())
  18. , rangeY(config["rangeY"].Integer())
  19. , ignoreFow(config["ignoreFow"].Bool())
  20. {
  21. }
  22. bool AdventureSpellRangedEffect::isTargetInRange(const int3 & pos, const int3 & center) const
  23. {
  24. int3 diff = pos - center;
  25. return diff.x >= -rangeX && diff.x <= rangeX && diff.y >= -rangeY && diff.y <= rangeY;
  26. }
  27. bool AdventureSpellRangedEffect::canBeCastAtImpl(spells::Problem & problem, const IGameInfoCallback * cb, const spells::Caster * caster, const int3 & pos) const
  28. {
  29. if(!cb->isInTheMap(pos))
  30. return false;
  31. if(caster->getHeroCaster())
  32. {
  33. int3 casterPosition = caster->getHeroCaster()->getSightCenter();
  34. if(!isTargetInRange(casterPosition, pos))
  35. return false;
  36. }
  37. if(!ignoreFow && !cb->isVisibleFor(pos, caster->getCasterOwner()))
  38. return false;
  39. return true;
  40. }
  41. VCMI_LIB_NAMESPACE_END