|
|
@@ -32,6 +32,7 @@ CPathfinder::PathfinderOptions::PathfinderOptions()
|
|
|
|
|
|
lightweightFlyingMode = false;
|
|
|
oneTurnSpecialLayersLimit = true;
|
|
|
+ originalMovementRules = true;
|
|
|
}
|
|
|
|
|
|
CPathfinder::CPathfinder(CPathsInfo &_out, CGameState *_gs, const CGHeroInstance *_hero)
|
|
|
@@ -304,10 +305,19 @@ bool CPathfinder::isLayerTransitionPossible() const
|
|
|
}
|
|
|
else if(cp->layer == ELayer::AIR && dp->layer == ELayer::LAND)
|
|
|
{
|
|
|
- /// Hero that fly can only land on accessible tiles
|
|
|
- if(cp->accessible != CGPathNode::ACCESSIBLE &&
|
|
|
- dp->accessible != CGPathNode::ACCESSIBLE)
|
|
|
+ if(options.originalMovementRules)
|
|
|
{
|
|
|
+ if ((cp->accessible != CGPathNode::ACCESSIBLE &&
|
|
|
+ cp->accessible != CGPathNode::VISITABLE) &&
|
|
|
+ (dp->accessible != CGPathNode::VISITABLE &&
|
|
|
+ dp->accessible != CGPathNode::ACCESSIBLE))
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(cp->accessible != CGPathNode::ACCESSIBLE && dp->accessible != CGPathNode::ACCESSIBLE)
|
|
|
+ {
|
|
|
+ /// Hero that fly can only land on accessible tiles
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
@@ -344,9 +354,14 @@ bool CPathfinder::isMovementToDestPossible()
|
|
|
case ELayer::LAND:
|
|
|
if(!canMoveBetween(cp->coord, dp->coord) || dp->accessible == CGPathNode::BLOCKED)
|
|
|
return false;
|
|
|
- if(isSourceGuarded() && !isDestinationGuardian()) // Can step into tile of guard
|
|
|
- return false;
|
|
|
-
|
|
|
+ if(isSourceGuarded())
|
|
|
+ {
|
|
|
+ if(!(options.originalMovementRules && cp->layer == ELayer::AIR) &&
|
|
|
+ !isDestinationGuardian()) // Can step into tile of guard
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
if(cp->layer == ELayer::SAIL)
|
|
|
destAction = CGPathNode::DISEMBARK;
|
|
|
|
|
|
@@ -418,7 +433,12 @@ bool CPathfinder::isMovementToDestPossible()
|
|
|
|
|
|
|
|
|
if(destAction == CGPathNode::NORMAL)
|
|
|
- destAction = CGPathNode::VISIT;
|
|
|
+ {
|
|
|
+ if(options.originalMovementRules && isDestinationGuarded())
|
|
|
+ destAction = CGPathNode::BATTLE;
|
|
|
+ else
|
|
|
+ destAction = CGPathNode::VISIT;
|
|
|
+ }
|
|
|
}
|
|
|
else if(isDestinationGuarded())
|
|
|
destAction = CGPathNode::BATTLE;
|