123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /*
- * RemoveObjectEffect.cpp, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
- #include "StdInc.h"
- #include "RemoveObjectEffect.h"
- #include "../CSpellHandler.h"
- #include "../../callback/IGameInfoCallback.h"
- #include "../../mapObjects/CGHeroInstance.h"
- #include "../../mapping/CMap.h"
- #include "../../networkPacks/PacksForClient.h"
- #include "../../modding/IdentifierStorage.h"
- VCMI_LIB_NAMESPACE_BEGIN
- RemoveObjectEffect::RemoveObjectEffect(const CSpell * s, const JsonNode & config)
- : AdventureSpellRangedEffect(config)
- , owner(s)
- , failMessage(MetaString::createFromTextID("core.genrltxt.337")) //%s tried to scuttle the boat, but failed
- , cursor(config["cursor"].String())
- {
- for(const auto & objectNode : config["objects"].Struct())
- {
- if(objectNode.second.Bool())
- {
- LIBRARY->identifiers()->requestIdentifier(objectNode.second.getModScope(), "object", objectNode.first, [this](si32 index)
- {
- removedObjects.push_back(MapObjectID(index));
- });
- }
- }
- }
- std::string RemoveObjectEffect::getCursorForTarget(const IGameInfoCallback * cb, const spells::Caster * caster, const int3 & pos) const
- {
- return cursor;
- }
- bool RemoveObjectEffect::canBeCastAtImpl(spells::Problem & problem, const IGameInfoCallback * cb, const spells::Caster * caster, const int3 & pos) const
- {
- if (!isTargetInRange(cb, caster, pos))
- return false;
- const TerrainTile * t = cb->getTileUnchecked(pos);
- if(!t || t->visitableObjects.empty())
- return false;
- const CGObjectInstance * topObject = cb->getObj(t->visitableObjects.back());
- return vstd::contains(removedObjects, topObject->ID);
- }
- ESpellCastResult RemoveObjectEffect::applyAdventureEffects(SpellCastEnvironment * env, const AdventureSpellCastParameters & parameters) const
- {
- const auto schoolLevel = parameters.caster->getSpellSchoolLevel(owner);
- //check if spell works at all
- if(env->getRNG()->nextInt(0, 99) >= owner->getLevelPower(schoolLevel)) //power is % chance of success
- {
- InfoWindow iw;
- iw.player = parameters.caster->getCasterOwner();
- iw.text = failMessage;
- parameters.caster->getCasterName(iw.text);
- env->apply(iw);
- return ESpellCastResult::OK;
- }
- const TerrainTile & t = env->getMap()->getTile(parameters.pos);
- RemoveObject ro;
- ro.initiator = parameters.caster->getCasterOwner();
- ro.objectID = t.visitableObjects.back();
- env->apply(ro);
- return ESpellCastResult::OK;
- }
- VCMI_LIB_NAMESPACE_END
|