123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- /*
- * ExplorationBehavior.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 "ExplorationBehavior.h"
- #include "../AIGateway.h"
- #include "../AIUtility.h"
- #include "../Goals/Invalid.h"
- #include "../Goals/Composition.h"
- #include "../Goals/ExecuteHeroChain.h"
- #include "../Markers/ExplorationPoint.h"
- #include "../Goals/CaptureObject.h"
- #include "../Goals/ExploreNeighbourTile.h"
- #include "../Helpers/ExplorationHelper.h"
- namespace NKAI
- {
- using namespace Goals;
- std::string ExplorationBehavior::toString() const
- {
- return "Explore";
- }
- Goals::TGoalVec ExplorationBehavior::decompose(const Nullkiller * ai) const
- {
- Goals::TGoalVec tasks;
- for (auto obj : ai->memory->visitableObjs)
- {
- switch (obj->ID.num)
- {
- case Obj::REDWOOD_OBSERVATORY:
- case Obj::PILLAR_OF_FIRE:
- {
- auto rObj = dynamic_cast<const CRewardableObject*>(obj);
- if (!rObj->wasScouted(ai->playerID))
- tasks.push_back(sptr(Composition().addNext(ExplorationPoint(obj->visitablePos(), 200)).addNext(CaptureObject(obj))));
- break;
- }
- case Obj::MONOLITH_ONE_WAY_ENTRANCE:
- case Obj::MONOLITH_TWO_WAY:
- case Obj::SUBTERRANEAN_GATE:
- case Obj::WHIRLPOOL:
- {
- auto tObj = dynamic_cast<const CGTeleport*>(obj);
- for (auto exit : cb->getTeleportChannelExits(tObj->channel))
- {
- if (exit != tObj->id)
- {
- if (!cb->isVisible(cb->getObjInstance(exit)))
- tasks.push_back(sptr(Composition().addNext(ExplorationPoint(obj->visitablePos(), 50)).addNext(CaptureObject(obj))));
- }
- }
- }
- }
- }
- auto heroes = ai->cb->getHeroesInfo();
- for(const CGHeroInstance * hero : heroes)
- {
- ExplorationHelper scanResult(hero, ai);
- if(scanResult.scanSector(1))
- {
- tasks.push_back(scanResult.makeComposition());
- continue;
- }
- if(scanResult.scanSector(15))
- {
- tasks.push_back(scanResult.makeComposition());
- continue;
- }
- if(ai->getScanDepth() == ScanDepth::ALL_FULL)
- {
- if(scanResult.scanMap())
- {
- tasks.push_back(scanResult.makeComposition());
- }
- }
- }
- return tasks;
- }
- }
|