| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- /*
- * Conquer.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 "Goals.h"
- #include "../VCAI.h"
- #include "../AIUtility.h"
- #include "../AIhelper.h"
- #include "../FuzzyHelper.h"
- #include "../ResourceManager.h"
- #include "../BuildingManager.h"
- #include "../../../lib/StringConstants.h"
- using namespace Goals;
- bool Conquer::operator==(const Conquer & other) const
- {
- return other.hero.h == hero.h;
- }
- TSubgoal Conquer::whatToDoToAchieve()
- {
- logAi->trace("Entering goal CONQUER");
- return fh->chooseSolution(getAllPossibleSubgoals());
- }
- TGoalVec Conquer::getAllPossibleSubgoals()
- {
- TGoalVec ret;
- auto conquerable = [](const CGObjectInstance * obj) -> bool
- {
- if(cb->getPlayerRelations(ai->playerID, obj->tempOwner) == PlayerRelations::ENEMIES)
- {
- switch(obj->ID.num)
- {
- case Obj::TOWN:
- case Obj::HERO:
- case Obj::CREATURE_GENERATOR1:
- case Obj::MINE: //TODO: check ai->knownSubterraneanGates
- return true;
- }
- }
- return false;
- };
- std::vector<const CGObjectInstance *> objs;
- for(auto obj : ai->visitableObjs)
- {
- if(conquerable(obj))
- objs.push_back(obj);
- }
- for(auto h : cb->getHeroesInfo())
- {
- std::vector<const CGObjectInstance *> ourObjs(objs); //copy common objects
- for(auto obj : ai->reservedHeroesMap[h]) //add objects reserved by this hero
- {
- if(conquerable(obj))
- ourObjs.push_back(obj);
- }
- for(auto obj : ourObjs)
- {
- auto waysToGo = ai->ah->howToVisitObj(h, ObjectIdRef(obj));
- vstd::concatenate(ret, waysToGo);
- }
- }
- if(!objs.empty() && ai->canRecruitAnyHero()) //probably no point to recruit hero if we see no objects to capture
- ret.push_back(sptr(RecruitHero()));
- if(ret.empty())
- ret.push_back(sptr(Explore())); //we need to find an enemy
- return ret;
- }
|