From b73a3f52e57a1b6c43e107c10a2b33eb85a77c79 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 26 Mar 2011 08:15:08 +0100 Subject: [PATCH] Clean up path finding in path() Don't claim the destination sector is unreachable when the best path is longer than 1023 characters. Instead, report that the path is too long. --- src/lib/commands/path.c | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/src/lib/commands/path.c b/src/lib/commands/path.c index aefe298c4..70f4df03b 100644 --- a/src/lib/commands/path.c +++ b/src/lib/commands/path.c @@ -47,7 +47,7 @@ path(void) struct natstr *natp; struct range absrange; struct range relrange; - struct sctstr sect, dsect; + struct sctstr sect; coord cx, cy; int i; int y; @@ -57,7 +57,6 @@ path(void) around */ static char *mapbuf = NULL; static char **map = NULL; - double move_cost; char buf[1024]; if (!(p = getstarg(player->argp[1], "from sector : ", buf)) || @@ -67,28 +66,19 @@ path(void) pr("Not yours\n"); return RET_FAIL; } - getsect(sect.sct_dist_x, sect.sct_dist_y, &dsect); - buf[0] = 0; - move_cost = path_find(sect.sct_x, sect.sct_y, dsect.sct_x, dsect.sct_y, - sect.sct_own, MOB_MOVE); - if (move_cost < 0) { - move_cost = 0; - pp = NULL; - } else { - len = path_find_route(buf, 1024, - sect.sct_x, sect.sct_y, - dsect.sct_x, dsect.sct_y); - if (len + 1 >= 1024) - pp = NULL; - else { - strcpy(buf + len, "h"); - pp = buf; - } - } - if (!pp) { + if (path_find(sect.sct_x, sect.sct_y, sect.sct_dist_x, sect.sct_dist_y, + player->cnum, MOB_MOVE) < 0) { pr("No path possible from %s to distribution sector %s\n", xyas(sect.sct_x, sect.sct_y, player->cnum), - xyas(dsect.sct_x, dsect.sct_y, player->cnum)); + xyas(sect.sct_dist_x, sect.sct_dist_y, player->cnum)); + return RET_FAIL; + } + len = path_find_route(buf, sizeof(buf), sect.sct_x, sect.sct_y, + sect.sct_dist_x, sect.sct_dist_y); + if (len >= sizeof(buf)) { + pr("Can't handle path from %s to distribution sector %s, it's too long, sorry.\n", + xyas(sect.sct_x, sect.sct_y, player->cnum), + xyas(sect.sct_dist_x, sect.sct_dist_y, player->cnum)); return RET_FAIL; } if (!mapbuf) @@ -108,14 +98,14 @@ path(void) logerror("malloc failed in path\n"); return RET_FAIL; } - pathrange(cx, cy, pp, 1, &absrange); + pathrange(cx, cy, buf, 1, &absrange); snxtsct_area(&ns, &absrange); natp = getnatp(player->cnum); xyrelrange(natp, &absrange, &relrange); blankfill(mapbuf, &ns.range, 3); - for (; *pp; ++pp) { + for (pp = buf; *pp; ++pp) { i = diridx(*pp); - if (i == DIR_STOP) + if (CANT_HAPPEN(i == DIR_STOP)) break; memcpy(&map[delty(&ns.range, cy)][deltx(&ns.range, cx) * 2], routech[i], 3); -- 2.43.0