2
0
Эх сурвалжийг харах

CPathfinder: fix and improve sail-land transition checks

Arseniy Shestakov 9 жил өмнө
parent
commit
30189a386f

+ 14 - 5
lib/CPathfinder.cpp

@@ -133,6 +133,7 @@ void CPathfinder::calculatePaths()
 				if(!hlp->isLayerAvailable(i))
 				if(!hlp->isLayerAvailable(i))
 					continue;
 					continue;
 
 
+				/// Check transition without tile accessability rules
 				if(cp->layer != i && !isLayerTransitionPossible(i))
 				if(cp->layer != i && !isLayerTransitionPossible(i))
 					continue;
 					continue;
 
 
@@ -143,6 +144,7 @@ void CPathfinder::calculatePaths()
 				if(dp->accessible == CGPathNode::NOT_SET)
 				if(dp->accessible == CGPathNode::NOT_SET)
 					continue;
 					continue;
 
 
+				/// Check transition using tile accessability rules
 				if(cp->layer != i && !isLayerTransitionPossible())
 				if(cp->layer != i && !isLayerTransitionPossible())
 					continue;
 					continue;
 
 
@@ -302,16 +304,23 @@ bool CPathfinder::isLayerTransitionPossible(const ELayer destLayer) const
 	switch(cp->layer)
 	switch(cp->layer)
 	{
 	{
 	case ELayer::LAND:
 	case ELayer::LAND:
-		if(destLayer != ELayer::AIR)
-			return true;
-
-		if(!options.lightweightFlyingMode || isSourceInitialPosition())
+		if(destLayer == ELayer::AIR)
+		{
+			if(!options.lightweightFlyingMode || isSourceInitialPosition())
+				return true;
+		}
+		else if(destLayer == ELayer::SAIL)
+		{
+			if(dt->isWater())
+				return true;
+		}
+		else
 			return true;
 			return true;
 
 
 		break;
 		break;
 
 
 	case ELayer::SAIL:
 	case ELayer::SAIL:
-		if(destLayer == ELayer::LAND && gs->map->isCoastalTile(dp->coord))
+		if(destLayer == ELayer::LAND && !dt->isWater())
 			return true;
 			return true;
 
 
 		break;
 		break;