/* * AIPathfinder.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 "AIPathfinder.h" #include "AIPathfinderConfig.h" #include "../../../CCallback.h" #include "../../../lib/mapping/CMap.h" std::vector> AIPathfinder::storagePool; std::map> AIPathfinder::storageMap; boost::mutex AIPathfinder::storageMutex; AIPathfinder::AIPathfinder(CPlayerSpecificInfoCallback * cb, VCAI * ai) :cb(cb), ai(ai) { } void AIPathfinder::clear() { boost::unique_lock storageLock(storageMutex); storageMap.clear(); } void AIPathfinder::init() { boost::unique_lock storageLock(storageMutex); storagePool.clear(); storageMap.clear(); } bool AIPathfinder::isTileAccessible(const HeroPtr & hero, const int3 & tile) { boost::unique_lock storageLock(storageMutex); std::shared_ptr nodeStorage = getOrCreateStorage(hero); return nodeStorage->isTileAccessible(tile, EPathfindingLayer::LAND) || nodeStorage->isTileAccessible(tile, EPathfindingLayer::SAIL); } std::vector AIPathfinder::getPathInfo(HeroPtr hero, int3 tile) { boost::unique_lock storageLock(storageMutex); std::shared_ptr nodeStorage = getOrCreateStorage(hero); const TerrainTile * tileInfo = cb->getTile(tile, false); if(!tileInfo) { return std::vector(); } return nodeStorage->getChainInfo(tile, !tileInfo->isWater()); } std::shared_ptr AIPathfinder::getOrCreateStorage(const HeroPtr & hero) { std::shared_ptr nodeStorage; if(!vstd::contains(storageMap, hero)) { logAi->debug("Recalculate paths for %s", hero->name); if(storageMap.size() < storagePool.size()) { nodeStorage = storagePool.at(storageMap.size()); } else { nodeStorage = std::make_shared(cb->getMapSize()); storagePool.push_back(nodeStorage); } storageMap[hero] = nodeStorage; nodeStorage->setHero(hero.get()); auto config = std::make_shared(cb, ai, nodeStorage); cb->calculatePaths(config, hero.get()); } else { nodeStorage = storageMap.at(hero); } return nodeStorage; }