1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-02-03 13:01:33 +02:00

Do not allow moving through most of visitable objects

This commit is contained in:
Ivan Savenko 2023-11-27 23:19:19 +02:00
parent faead7739a
commit 8cbc2c01ad
2 changed files with 37 additions and 2 deletions

View File

@ -24,11 +24,45 @@
VCMI_LIB_NAMESPACE_BEGIN
bool CPathfinderHelper::canMoveFromNode(const PathNodeInfo & source) const
{
// we can always make the first step, even when standing on object
if(source.node->theNodeBefore == nullptr)
return true;
if (!source.nodeObject)
return true;
if (!source.isNodeObjectVisitable())
return true;
// we can always move from visitable object if hero has teleported here (e.g. went through monolith)
if (source.node->isTeleportAction())
return true;
// we can go through garrisons
if (source.nodeObject->ID == MapObjectID::GARRISON || source.nodeObject->ID == MapObjectID::GARRISON2)
return true;
// or through border gate (if we stand on it then we already have the key)
if (source.nodeObject->ID == MapObjectID::BORDER_GATE)
return true;
// or "through" boat, but only if this is embarking
if (source.nodeObject->ID == MapObjectID::BOAT && source.node->action == EPathNodeAction::EMBARK)
return true;
return false;
}
std::vector<int3> CPathfinderHelper::getNeighbourTiles(const PathNodeInfo & source) const
{
std::vector<int3> neighbourTiles;
neighbourTiles.reserve(8);
if (!canMoveFromNode(source))
return neighbourTiles;
neighbourTiles.reserve(8);
getNeighbours(
*source.tile,
source.node->coord,
@ -38,7 +72,7 @@ std::vector<int3> CPathfinderHelper::getNeighbourTiles(const PathNodeInfo & sour
if(source.isNodeObjectVisitable())
{
vstd::erase_if(neighbourTiles, [&](const int3 & tile) -> bool
vstd::erase_if(neighbourTiles, [&](const int3 & tile) -> bool
{
return !canMoveBetween(tile, source.nodeObject->visitablePos());
});

View File

@ -79,6 +79,7 @@ public:
virtual ~CPathfinderHelper();
void initializePatrol();
bool isHeroPatrolLocked() const;
bool canMoveFromNode(const PathNodeInfo & source) const;
bool isPatrolMovementAllowed(const int3 & dst) const;
void updateTurnInfo(const int turn = 0);
bool isLayerAvailable(const EPathfindingLayer & layer) const;