diff options
author | Walter van Niftrik | 2009-10-30 03:54:50 +0000 |
---|---|---|
committer | Walter van Niftrik | 2009-10-30 03:54:50 +0000 |
commit | dba613ecd254906c1fb4128ddecfae3121dc39d5 (patch) | |
tree | dc9e2fc1bf33555e5a7b5a6e91da138ba21f23fb | |
parent | e36798585fae492e425fdf5697cd9c31bb42c1d7 (diff) | |
download | scummvm-rg350-dba613ecd254906c1fb4128ddecfae3121dc39d5.tar.gz scummvm-rg350-dba613ecd254906c1fb4128ddecfae3121dc39d5.tar.bz2 scummvm-rg350-dba613ecd254906c1fb4128ddecfae3121dc39d5.zip |
SCI: AvoidPath: Don't discard contained-access polygon when starting point
is right next to it.
svn-id: r45521
-rw-r--r-- | engines/sci/engine/kpathing.cpp | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index adb5b0075b..e64d24296e 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -1050,6 +1050,21 @@ static int nearest_intersection(PathfindingState *s, const Common::Point &p, con } /** + * Checks whether a point is nearby a contained-access polygon (distance 1 pixel) + * @param point the point + * @param polygon the contained-access polygon + * @return true when point is nearby polygon, false otherwise + */ +static bool nearbyPolygon(const Common::Point &point, Polygon *polygon) { + assert(polygon->type == POLY_CONTAINED_ACCESS); + + return ((contained(Common::Point(point.x, point.y + 1), polygon) != CONT_INSIDE) + || (contained(Common::Point(point.x, point.y - 1), polygon) != CONT_INSIDE) + || (contained(Common::Point(point.x + 1, point.y), polygon) != CONT_INSIDE) + || (contained(Common::Point(point.x - 1, point.y), polygon) != CONT_INSIDE)); +} + +/** * Checks that the start point is in a valid position, and takes appropriate action if it's not. * @param s the pathfinding state * @param start the start point @@ -1075,12 +1090,14 @@ static Common::Point *fixup_start_point(PathfindingState *s, const Common::Point case POLY_CONTAINED_ACCESS: // Remove contained access polygons that do not contain // the start point (containment test is inverted here). - if (cont == CONT_INSIDE) { + // SSCI appears to be using a small margin of error here, + // so we do the same. + if ((cont == CONT_INSIDE) && !nearbyPolygon(start, *it)) { delete *it; it = s->polygons.erase(it); continue; } - break; + // Fall through case POLY_BARRED_ACCESS: case POLY_NEAREST_ACCESS: if (cont == CONT_INSIDE) { @@ -1095,7 +1112,7 @@ static Common::Point *fixup_start_point(PathfindingState *s, const Common::Point return NULL; } - if (type == POLY_BARRED_ACCESS) + if ((type == POLY_BARRED_ACCESS) || (type == POLY_CONTAINED_ACCESS)) warning("AvoidPath: start position at unreachable location"); // The original start position is in an invalid location, so we |