From 404a76f79e2af222849a1e4fd7fce71ac09b2065 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sun, 27 Mar 2011 08:44:30 +0200 Subject: [PATCH] Clean up path finding in getpath() Don't claim the destination sector is unreachable when the best path is longer than 99 characters or the complete path is longer than 1023 characters. Instead, report that the path is too long when the total path is longer than 1023 characters. --- src/lib/subs/paths.c | 57 ++++++++++---------------------------------- 1 file changed, 13 insertions(+), 44 deletions(-) diff --git a/src/lib/subs/paths.c b/src/lib/subs/paths.c index c1d740f4..eda00616 100644 --- a/src/lib/subs/paths.c +++ b/src/lib/subs/paths.c @@ -24,10 +24,10 @@ * * --- * - * path.c: Routines associated with paths, directions, etc. + * paths.c: Routines associated with paths, directions, etc. * * Known contributors to this file: - * Markus Armbruster, 2005-2009 + * Markus Armbruster, 2005-2011 */ #include @@ -113,51 +113,20 @@ getpath(char *buf, char *arg, coord x, coord y, int onlyown, int showdes, more: while (*p) { if (sarg_xy(p, &dx, &dy)) { - bp = NULL; - switch (mobtype) { - default: - CANT_REACH(); - pr("Destination sectors not allowed here!\n"); - break; - case MOB_FLY: - if (path_find(x, y, dx, dy, 0, MOB_FLY) < 0) - bp = NULL; - else { - len = path_find_route(buf2, 100, x, y, dx, dy); - if (len >= 100) - bp = NULL; - else { - if (len == 0) - strcpy(buf2, "h"); - bp = buf2; - } - } - break; - case MOB_SAIL: - if (path_find(x, y, dx, dy, player->cnum, MOB_SAIL) < 0) - bp = NULL; - else { - len = path_find_route(buf2, 100, x, y, dx, dy); - if (len >= 100) - bp = NULL; - else { - if (len == 0) - strcpy(buf2, "h"); - bp = buf2; - } - } - break; - } - if (bp && p + strlen(bp) + 1 < buf + MAX_PATH_LEN) { - strcpy(p, bp); - pr("Using best path '%s'\n", p); - pr("Using total path '%s'\n", buf); - return buf; - } else { + if (path_find(x, y, dx, dy, player->cnum, mobtype) < 0) { pr("Can't get to %s from here!\n", xyas(dx, dy, player->cnum)); + break; } - break; + len = path_find_route(p, buf + MAX_PATH_LEN - p, x, y, dx, dy); + if (p + len >= buf + MAX_PATH_LEN) { + pr("Can't handle path to %s, it's too long, sorry.\n", + xyas(dx, dy, player->cnum)); + break; + } + pr("Using best path '%s'\n", p); + pr("Using total path '%s'\n", buf); + return buf; } dir = chkdir(*p, DIR_STOP, DIR_LAST); if (dir < 0) {