| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- /*
- * AIMovementToDestinationRule.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 "AIMovementToDestinationRule.h"
- namespace NKAI
- {
- namespace AIPathfinding
- {
- AIMovementToDestinationRule::AIMovementToDestinationRule(
- std::shared_ptr<AINodeStorage> nodeStorage,
- bool allowBypassObjects)
- : nodeStorage(nodeStorage), allowBypassObjects(allowBypassObjects)
- {
- }
- void AIMovementToDestinationRule::process(
- const PathNodeInfo & source,
- CDestinationNodeInfo & destination,
- const PathfinderConfig * pathfinderConfig,
- CPathfinderHelper * pathfinderHelper) const
- {
- auto blocker = getBlockingReason(source, destination, pathfinderConfig, pathfinderHelper);
- if(blocker == BlockingReason::NONE)
- return;
- if(blocker == BlockingReason::DESTINATION_BLOCKED
- && destination.action == EPathNodeAction::EMBARK
- && nodeStorage->getAINode(destination.node)->specialAction)
- {
- return;
- }
- if(blocker == BlockingReason::SOURCE_GUARDED)
- {
- auto actor = nodeStorage->getAINode(source.node)->actor;
- if(!allowBypassObjects)
- {
- if (source.node->getCost() < 0.0001f)
- return;
- // when actor represents moster graph node, we need to let him escape monster
- if(cb->getGuardingCreaturePosition(source.coord) == actor->initialPosition)
- return;
- }
- if(actor->allowBattle)
- {
- #if NKAI_PATHFINDER_TRACE_LEVEL >= 1
- logAi->trace(
- "Bypass src guard while moving from %s to %s",
- source.coord.toString(),
- destination.coord.toString());
- #endif
- return;
- }
- }
- destination.blocked = true;
- }
- }
- }
|