| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 | 
							- /*
 
- * AbstractGoal.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 "../../../lib/GameLibrary.h"
 
- #include "../../../lib/CCreatureHandler.h"
 
- #include "../AIUtility.h"
 
- struct HeroPtr;
 
- class VCAI;
 
- class FuzzyHelper;
 
- namespace Goals
 
- {
 
- 	class AbstractGoal;
 
- 	class Explore;
 
- 	class RecruitHero;
 
- 	class VisitTile;
 
- 	class VisitObj;
 
- 	class VisitHero;
 
- 	class BuildThis;
 
- 	class DigAtTile;
 
- 	class CollectRes;
 
- 	class Build;
 
- 	class BuyArmy;
 
- 	class BuildBoat;
 
- 	class GatherArmy;
 
- 	class ClearWayTo;
 
- 	class Invalid;
 
- 	class Trade;
 
- 	class CompleteQuest;
 
- 	class AdventureSpellCast;
 
- 	enum EGoals
 
- 	{
 
- 		INVALID = -1,
 
- 		WIN, CONQUER, BUILD, //build needs to get a real reasoning
 
- 		EXPLORE, GATHER_ARMY,
 
- 		BOOST_HERO,
 
- 		RECRUIT_HERO,
 
- 		BUILD_STRUCTURE, //if hero set, then in visited town
 
- 		COLLECT_RES,
 
- 		GATHER_TROOPS, // val of creatures with objid
 
- 		VISIT_OBJ, //visit or defeat or collect the object
 
- 		FIND_OBJ, //find and visit any obj with objid + resid //TODO: consider universal subid for various types (aid, bid)
 
- 		VISIT_HERO, //heroes can move around - set goal abstract and track hero every turn
 
- 		GET_ART_TYPE,
 
- 		VISIT_TILE, //tile, in conjunction with hero elementar; assumes tile is reachable
 
- 		CLEAR_WAY_TO,
 
- 		DIG_AT_TILE,//elementar with hero on tile
 
- 		BUY_ARMY, //at specific town
 
- 		TRADE, //val resID at object objid
 
- 		BUILD_BOAT,
 
- 		COMPLETE_QUEST,
 
- 		ADVENTURE_SPELL_CAST
 
- 	};
 
- 	class DLL_EXPORT TSubgoal : public std::shared_ptr<AbstractGoal>
 
- 	{
 
- 	public:
 
- 		bool operator==(const TSubgoal & rhs) const;
 
- 		bool operator<(const TSubgoal & rhs) const;
 
- 	};
 
- 	using TGoalVec = std::vector<TSubgoal>;
 
- 	//method chaining + clone pattern
 
- #define VSETTER(type, field) virtual AbstractGoal & set ## field(const type &rhs) {field = rhs; return *this;};
 
- #define OSETTER(type, field) CGoal<T> & set ## field(const type &rhs) override { field = rhs; return *this; };
 
- #if 0
 
- #define SETTER
 
- #endif // _DEBUG
 
- 	enum { LOW_PR = -1 };
 
- 	DLL_EXPORT TSubgoal sptr(const AbstractGoal & tmp);
 
- 	struct DLL_EXPORT EvaluationContext
 
- 	{
 
- 		float movementCost;
 
- 		int manaCost;
 
- 		uint64_t danger;
 
- 		EvaluationContext()
 
- 			: movementCost(0.0),
 
- 			manaCost(0),
 
- 			danger(0)
 
- 		{
 
- 		}
 
- 	};
 
- 	class DLL_EXPORT AbstractGoal
 
- 	{
 
- 	public:
 
- 		bool isElementar; VSETTER(bool, isElementar)
 
- 			bool isAbstract; VSETTER(bool, isAbstract)
 
- 			float priority; VSETTER(float, priority)
 
- 			int value; VSETTER(int, value)
 
- 			int resID; VSETTER(int, resID)
 
- 			int objid; VSETTER(int, objid)
 
- 			int aid; VSETTER(int, aid)
 
- 			int3 tile; VSETTER(int3, tile)
 
- 			HeroPtr hero; VSETTER(HeroPtr, hero)
 
- 			const CGTownInstance *town; VSETTER(CGTownInstance *, town)
 
- 			int bid; VSETTER(int, bid)
 
- 			TSubgoal parent; VSETTER(TSubgoal, parent)
 
- 			EvaluationContext evaluationContext; VSETTER(EvaluationContext, evaluationContext)
 
- 		AbstractGoal(EGoals goal = EGoals::INVALID): goalType(goal)
 
- 		{
 
- 			priority = 0;
 
- 			isElementar = false;
 
- 			isAbstract = false;
 
- 			value = 0;
 
- 			aid = -1;
 
- 			resID = -1;
 
- 			objid = -1;
 
- 			tile = int3(-1, -1, -1);
 
- 			town = nullptr;
 
- 			bid = -1;
 
- 		}
 
- 		virtual ~AbstractGoal() {}
 
- 		//FIXME: abstract goal should be abstract, but serializer fails to instantiate subgoals in such case
 
- 		virtual AbstractGoal * clone() const
 
- 		{
 
- 			return const_cast<AbstractGoal *>(this);
 
- 		}
 
- 		virtual TGoalVec getAllPossibleSubgoals()
 
- 		{
 
- 			return TGoalVec();
 
- 		}
 
- 		virtual TSubgoal whatToDoToAchieve()
 
- 		{
 
- 			return sptr(AbstractGoal());
 
- 		}
 
- 		EGoals goalType;
 
- 		virtual std::string name() const;
 
- 		virtual std::string completeMessage() const
 
- 		{
 
- 			return "This goal is unspecified!";
 
- 		}
 
- 		bool invalid() const;
 
- 		///Visitor pattern
 
- 		//TODO: make accept work for std::shared_ptr... somehow
 
- 		virtual void accept(VCAI * ai); //unhandled goal will report standard error
 
- 		virtual float accept(FuzzyHelper * f);
 
- 		virtual bool operator==(const AbstractGoal & g) const;
 
- //		bool operator<(AbstractGoal & g); //final
 
- 		virtual bool fulfillsMe(Goals::TSubgoal goal) //TODO: multimethod instead of type check
 
- 		{
 
- 			return false; //use this method to check if goal is fulfilled by another (not equal) goal, operator == is handled spearately
 
- 		}
 
- //		bool operator!=(const AbstractGoal & g) const
 
- //		{
 
- //			return !(*this == g);
 
- //		}
 
- 	};
 
- }
 
 
  |