From 8f008bf84970a008f910dd4d079f87db72e0ea89 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 26 Mar 2011 14:34:53 +0100 Subject: [PATCH] Clean up path finding in unit_sub() Don't claim the destination sector is unreachable when the best path is longer than 1023 characters for land units or 99 characters for ships. Instead, report that the path is too long. Up the limit for ships to 1023 characters. --- src/lib/subs/unitsub.c | 67 ++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 42 deletions(-) diff --git a/src/lib/subs/unitsub.c b/src/lib/subs/unitsub.c index 4d2d3d99..ee8376bf 100644 --- a/src/lib/subs/unitsub.c +++ b/src/lib/subs/unitsub.c @@ -28,7 +28,7 @@ * * Known contributors to this file: * Ron Koenderink, 2007 - * Markus Armbruster, 2009 + * Markus Armbruster, 2009-2011 */ #include @@ -138,9 +138,9 @@ unit_path(int together, struct empobj *unit, char *buf) { coord destx; coord desty; - struct sctstr d_sect, sect; + struct sctstr sect; size_t len; - char *cp; + double c; int mtype; if (CANT_HAPPEN(unit->ef_type != EF_LAND && unit->ef_type != EF_SHIP)) @@ -152,34 +152,17 @@ unit_path(int together, struct empobj *unit, char *buf) pr("Cannot go to a destination sector if not all starting in the same sector\n"); return NULL; } - if (!getsect(destx, desty, &d_sect)) { - pr("%d,%d is not a sector\n", destx, desty); - return NULL; - } if (unit->ef_type == EF_SHIP) { - if (path_find(unit->x, unit->y, d_sect.sct_x, d_sect.sct_y, - player->cnum, MOB_SAIL) < 0) - cp = NULL; - else { - len = path_find_route(buf, 100, unit->x, unit->y, - d_sect.sct_x, d_sect.sct_y); - if (len >= 100) - cp = NULL; - else { - if (len == 0) - strcpy(buf, "h"); - cp = buf; - } - } - if (!cp || unit->mobil <= 0) { + c = path_find(unit->x, unit->y, destx, desty, + player->cnum, MOB_SAIL); + if (c < 0 || unit->mobil <= 0) { pr("Can't get to '%s' right now.\n", - xyas(d_sect.sct_x, d_sect.sct_y, player->cnum)); + xyas(destx, desty, player->cnum)); return NULL; } } else { getsect(unit->x, unit->y, §); mtype = lnd_mobtype((struct lndstr *)unit); - buf[0] = 0; /* * Note: passing sect.sct_own for actor is funny, but works: * its only effect is to confine the search to that nation's @@ -187,30 +170,30 @@ unit_path(int together, struct empobj *unit, char *buf) * different for marching in allied land, and passing it would * break path finding there. */ - if (path_find(sect.sct_x, sect.sct_y, d_sect.sct_x, d_sect.sct_y, - sect.sct_own, mtype) < 0) - cp = NULL; - else { - len = path_find_route(buf, 1024, - sect.sct_x, sect.sct_y, - d_sect.sct_x, d_sect.sct_y); - if (len + 1 >= 1024) - cp = NULL; - else { - strcpy(buf + len, "h"); - cp = buf; - } - } - if (!cp) { + c = path_find(unit->x, unit->y, destx, desty, sect.sct_own, mtype); + if (c < 0) { + buf[0] = 0; pr("No owned %s from %s to %s!\n", mtype == MOB_RAIL ? "railway" : "path", xyas(unit->x, unit->y, player->cnum), - xyas(d_sect.sct_x, d_sect.sct_y, player->cnum)); + xyas(destx, desty, player->cnum)); return NULL; } - pr("Using path '%s'\n", cp); } - return cp; + len = path_find_route(buf, sizeof(buf), unit->x, unit->y, destx, desty); + if (len == 0 || unit->ef_type == EF_LAND) { + if (len + 1 < sizeof(buf)) + strcpy(buf + len, "h"); + len++; + } + if (len >= sizeof(buf)) { + pr("Can't handle path to %s, it's too long, sorry\n", + xyas(destx, desty, player->cnum)); + return NULL; + } + if (unit->ef_type == EF_LAND) + pr("Using path '%s'\n", buf); + return buf; } void