/* * SpecialAction.h, 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 * */ #pragma once #include "../../AIUtility.h" #include "../../Goals/AbstractGoal.h" VCMI_LIB_NAMESPACE_BEGIN struct PathNodeInfo; struct CDestinationNodeInfo; VCMI_LIB_NAMESPACE_END namespace NKAI { struct AIPathNode; class ChainActor; class SpecialAction { public: virtual ~SpecialAction() = default; virtual bool canAct(const AIPathNode * source) const { return true; } virtual Goals::TSubgoal decompose(const CGHeroInstance * hero) const; virtual void execute(const CGHeroInstance * hero) const; virtual void applyOnDestination( const CGHeroInstance * hero, CDestinationNodeInfo & destination, const PathNodeInfo & source, AIPathNode * dstNode, const AIPathNode * srcNode) const { } virtual std::string toString() const = 0; virtual const CGObjectInstance * targetObject() const { return nullptr; } virtual std::vector> getParts() const { return {}; } virtual const ChainActor * getActor(const ChainActor * sourceActor) const { return sourceActor; } }; class CompositeAction : public SpecialAction { private: std::vector> parts; public: CompositeAction(std::vector> parts) : parts(parts) {} bool canAct(const AIPathNode * source) const override; void execute(const CGHeroInstance * hero) const override; std::string toString() const override; const CGObjectInstance * targetObject() const override; Goals::TSubgoal decompose(const CGHeroInstance * hero) const override; std::vector> getParts() const override { return parts; } void applyOnDestination( const CGHeroInstance * hero, CDestinationNodeInfo & destination, const PathNodeInfo & source, AIPathNode * dstNode, const AIPathNode * srcNode) const override; }; }