diff options
author | Peter Kohaut | 2019-03-09 19:03:18 +0100 |
---|---|---|
committer | Peter Kohaut | 2019-03-09 19:20:28 +0100 |
commit | 1630cf0e6c4c278bc4913ecc0ba7503c5ff8eb06 (patch) | |
tree | a984c3a5ac60c24b122e817a5a6216ef772722e1 | |
parent | 664dd4a8aab66452c997facb8bd547f307415330 (diff) | |
download | scummvm-rg350-1630cf0e6c4c278bc4913ecc0ba7503c5ff8eb06.tar.gz scummvm-rg350-1630cf0e6c4c278bc4913ecc0ba7503c5ff8eb06.tar.bz2 scummvm-rg350-1630cf0e6c4c278bc4913ecc0ba7503c5ff8eb06.zip |
BLADERUNNER: Better fix for bug in pathfinding
Basically just more robust (but slower) fix to the intermittent assert
in pathfinding code when polygons were touching only by a single corner.
-rw-r--r-- | engines/bladerunner/obstacles.cpp | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/engines/bladerunner/obstacles.cpp b/engines/bladerunner/obstacles.cpp index a0e9d7ab11..66f3f73382 100644 --- a/engines/bladerunner/obstacles.cpp +++ b/engines/bladerunner/obstacles.cpp @@ -191,7 +191,6 @@ bool Obstacles::mergePolygons(Polygon &polyA, Polygon &polyB) { bool flagAddVertexToVertexList = true; bool flagDidFindIntersection = false; int vertIndex = 0; - int lastIntersectionIndex = -1; Polygon *startingPolygon = polyPrimary; int flagDone = false; @@ -205,7 +204,12 @@ bool Obstacles::mergePolygons(Polygon &polyA, Polygon &polyB) { polyPrimaryType = polyPrimary->vertexType[vertIndex]; if (flagAddVertexToVertexList) { - assert(polyMerged.verticeCount < kPolygonVertexCount); + // In some cases polygons will have only one intersection (touching corners) and because of that second SWAP never occure, + // algorithm will stop only when the merged polygon is full. + if (polyMerged.verticeCount >= kPolygonVertexCount) { + flagDidMergePolygons = false; + break; + } polyMerged.vertices[polyMerged.verticeCount] = polyLine.start; polyMerged.vertexType[polyMerged.verticeCount] = polyPrimaryType; polyMerged.verticeCount++; @@ -227,15 +231,8 @@ bool Obstacles::mergePolygons(Polygon &polyA, Polygon &polyB) { SWAP(polyPrimary, polySecondary); flagDidMergePolygons = true; - lastIntersectionIndex = polySecondaryIntersectionIndex; } else { vertIndex = (vertIndex + 1) % polyPrimary->verticeCount; - // In some cases polygons will have only one intersection (touching corners) and because of that second SWAP never occure and algorithm will never stop. - // This can be avoided by stopping the algorithm after looping over whole polygon. Such polygons will not merge. - if (vertIndex == lastIntersectionIndex) { - flagDidMergePolygons = false; - break; - } flagDidFindIntersection = false; } if (polyPrimary->vertices[vertIndex] == startingPolygon->vertices[0]) { |