/* * CGoal.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 "AbstractGoal.h" struct HeroPtr; class AIGateway; namespace Goals { template class DLL_EXPORT CGoal : public AbstractGoal { public: CGoal(EGoals goal = INVALID) : AbstractGoal(goal) { isAbstract = true; value = 0; aid = -1; objid = -1; resID = -1; tile = int3(-1, -1, -1); town = nullptr; } CGoal * clone() const override { return new T(static_cast(*this)); //casting enforces template instantiation } template void serialize(Handler & h, const int version) { h & static_cast(*this); //h & goalType & isElementar & isAbstract & priority; //h & value & resID & objid & aid & tile & hero & town & bid; } virtual bool operator==(const AbstractGoal & g) const override { if(goalType != g.goalType) return false; return (*this) == (static_cast(g)); } virtual bool operator==(const T & other) const = 0; virtual TGoalVec decompose() const override { TSubgoal single = decomposeSingle(); if(!single || single->invalid()) return {}; return {single}; } protected: virtual TSubgoal decomposeSingle() const { return TSubgoal(); } }; template class DLL_EXPORT ElementarGoal : public CGoal, public ITask { public: ElementarGoal(EGoals goal = INVALID) : CGoal(goal), ITask() { AbstractGoal::isAbstract = false; } ElementarGoal(const ElementarGoal & other) : CGoal(other), ITask(other) { } T & setpriority(float p) { ITask::priority = p; return *((T *)this); } virtual bool isElementar() const override { return true; } virtual HeroPtr getHero() const override { return AbstractGoal::hero; } }; class DLL_EXPORT Invalid : public ElementarGoal { public: Invalid() : ElementarGoal(Goals::INVALID) { priority = -1; } TGoalVec decompose() const override { return TGoalVec(); } virtual bool operator==(const Invalid & other) const override { return true; } virtual std::string toString() const override { return "Invalid"; } virtual void accept(AIGateway * ai) override { throw cannotFulfillGoalException("Can not fulfill Invalid goal!"); } }; }