RemoveObjectEffect.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * RemoveObjectEffect.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 "RemoveObjectEffect.h"
  12. #include "../CSpellHandler.h"
  13. #include "../../callback/IGameInfoCallback.h"
  14. #include "../../mapObjects/CGHeroInstance.h"
  15. #include "../../mapping/CMap.h"
  16. #include "../../networkPacks/PacksForClient.h"
  17. #include "../../modding/IdentifierStorage.h"
  18. VCMI_LIB_NAMESPACE_BEGIN
  19. RemoveObjectEffect::RemoveObjectEffect(const CSpell * s, const JsonNode & config)
  20. : AdventureSpellRangedEffect(config)
  21. , owner(s)
  22. , failMessage(MetaString::createFromTextID("core.genrltxt.337")) //%s tried to scuttle the boat, but failed
  23. , cursor(config["cursor"].String())
  24. {
  25. for(const auto & objectNode : config["objects"].Struct())
  26. {
  27. if(objectNode.second.Bool())
  28. {
  29. LIBRARY->identifiers()->requestIdentifier(objectNode.second.getModScope(), "object", objectNode.first, [this](si32 index)
  30. {
  31. removedObjects.push_back(MapObjectID(index));
  32. });
  33. }
  34. }
  35. }
  36. std::string RemoveObjectEffect::getCursorForTarget(const IGameInfoCallback * cb, const spells::Caster * caster, const int3 & pos) const
  37. {
  38. return cursor;
  39. }
  40. bool RemoveObjectEffect::canBeCastAtImpl(spells::Problem & problem, const IGameInfoCallback * cb, const spells::Caster * caster, const int3 & pos) const
  41. {
  42. if (!isTargetInRange(cb, caster, pos))
  43. return false;
  44. const TerrainTile * t = cb->getTileUnchecked(pos);
  45. if(!t || t->visitableObjects.empty())
  46. return false;
  47. const CGObjectInstance * topObject = cb->getObj(t->visitableObjects.back());
  48. return vstd::contains(removedObjects, topObject->ID);
  49. }
  50. ESpellCastResult RemoveObjectEffect::applyAdventureEffects(SpellCastEnvironment * env, const AdventureSpellCastParameters & parameters) const
  51. {
  52. const auto schoolLevel = parameters.caster->getSpellSchoolLevel(owner);
  53. //check if spell works at all
  54. if(env->getRNG()->nextInt(0, 99) >= owner->getLevelPower(schoolLevel)) //power is % chance of success
  55. {
  56. InfoWindow iw;
  57. iw.player = parameters.caster->getCasterOwner();
  58. iw.text = failMessage;
  59. parameters.caster->getCasterName(iw.text);
  60. env->apply(iw);
  61. return ESpellCastResult::OK;
  62. }
  63. const TerrainTile & t = env->getMap()->getTile(parameters.pos);
  64. RemoveObject ro;
  65. ro.initiator = parameters.caster->getCasterOwner();
  66. ro.objectID = t.visitableObjects.back();
  67. env->apply(ro);
  68. return ESpellCastResult::OK;
  69. }
  70. VCMI_LIB_NAMESPACE_END