From 1630cf0e6c4c278bc4913ecc0ba7503c5ff8eb06 Mon Sep 17 00:00:00 2001 From: Peter Kohaut Date: Sat, 9 Mar 2019 19:03:18 +0100 Subject: 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. --- engines/bladerunner/obstacles.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) (limited to 'engines/bladerunner') 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]) { -- cgit v1.2.3