diff --git a/include/path.h b/include/path.h index eb0d950e..b061426c 100644 --- a/include/path.h +++ b/include/path.h @@ -82,10 +82,6 @@ extern void path_find_print_stats(void); #endif /* src/lib/common/path.c */ -extern char *BestDistPath(char *, struct sctstr *, struct sctstr *, - double *); -extern char *BestLandPath(char *, struct sctstr *, struct sctstr *, - double *, int); extern char *BestShipPath(char *, int, int, int, int, int); extern char *BestAirPath(char *, int, int, int, int); diff --git a/src/lib/commands/best.c b/src/lib/commands/best.c index fa18ed2e..42e41c0c 100644 --- a/src/lib/commands/best.c +++ b/src/lib/commands/best.c @@ -27,7 +27,7 @@ * best.c: Show the best path between two sectors * * Known contributors to this file: - * + * Markus Armbruster, 2011 */ #include @@ -43,6 +43,7 @@ best(void) struct sctstr s1, s2; struct nstr_sect nstr, nstr2; char buf[1024]; + size_t len; if (!snxtsct(&nstr, player->argp[1])) return RET_SYN; @@ -57,7 +58,23 @@ best(void) while (!player->aborted && nxtsct(&nstr2, &s2)) { if (!player->owner) continue; - path = BestLandPath(buf, &s1, &s2, &cost, MOB_MOVE); + buf[0] = 0; + cost = path_find(s1.sct_x, s1.sct_y, s2.sct_x, s2.sct_y, + s1.sct_own, MOB_MOVE); + if (cost < 0) { + cost = 0; + path = NULL; + } else { + len = path_find_route(buf, 1024, + s1.sct_x, s1.sct_y, + s2.sct_x, s2.sct_y); + if (len + 1 >= 1024) + path = NULL; + else { + strcpy(buf + len, "h"); + path = buf; + } + } if (path) pr("Best path from %s to %s is %s (cost %1.3f)\n", xyas(s1.sct_x, s1.sct_y, player->cnum), diff --git a/src/lib/commands/path.c b/src/lib/commands/path.c index 018502ec..aefe298c 100644 --- a/src/lib/commands/path.c +++ b/src/lib/commands/path.c @@ -29,6 +29,7 @@ * Known contributors to this file: * David Muir Sharnoff, 1986 * (unknown rewrite), 1989 + * Markus Armbruster, 2005-2011 */ #include @@ -51,6 +52,7 @@ path(void) int i; int y; char *pp, *p; + size_t len; /* Note this is not re-entrant anyway, so we keep the buffers around */ static char *mapbuf = NULL; @@ -66,7 +68,23 @@ path(void) return RET_FAIL; } getsect(sect.sct_dist_x, sect.sct_dist_y, &dsect); - pp = BestDistPath(buf, §, &dsect, &move_cost); + 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) { pr("No path possible from %s to distribution sector %s\n", xyas(sect.sct_x, sect.sct_y, player->cnum), diff --git a/src/lib/common/path.c b/src/lib/common/path.c index ecd91c30..178d7ffb 100644 --- a/src/lib/common/path.c +++ b/src/lib/common/path.c @@ -43,46 +43,6 @@ #include "sect.h" #include "xy.h" -char * -BestLandPath(char *path, - struct sctstr *from, - struct sctstr *to, double *cost, int mob_type) -{ - double c; - size_t len; - - *cost = 0.0; - *path = 0; - - /* - * Note: passing from->sct_own for actor is funny, but works: its - * only effect is to confine the search to that nation's land. It - * doesn't affect mobility costs. The real actor is different for - * marching in allied land, and passing it would break path - * finding there. - */ - c = path_find(from->sct_x, from->sct_y, to->sct_x, to->sct_y, - from->sct_own, mob_type); - if (c < 0) - return NULL; - len = path_find_route(path, 1024, - from->sct_x, from->sct_y, - to->sct_x, to->sct_y); - if (len + 1 >= 1024) - return NULL; - strcpy(path + len, "h"); - *cost = c; - return path; -} - -char * -BestDistPath(char *path, - struct sctstr *from, - struct sctstr *to, double *cost) -{ - return BestLandPath(path, from, to, cost, MOB_MOVE); -} - char * BestShipPath(char *path, int fx, int fy, int tx, int ty, int owner) { diff --git a/src/lib/subs/move.c b/src/lib/subs/move.c index 57abc754..5c3af8dd 100644 --- a/src/lib/subs/move.c +++ b/src/lib/subs/move.c @@ -27,7 +27,7 @@ * move.c: Move something somewhere. * * Known contributors to this file: - * + * Markus Armbruster, 2004-2011 */ #include @@ -58,6 +58,7 @@ move_ground(struct sctstr *start, struct sctstr *end, double sect_mcost; double total_mcost; double mv_cost; + size_t len; double mobility = start->sct_mobil; int dir; int intcost; @@ -79,8 +80,24 @@ move_ground(struct sctstr *start, struct sctstr *end, return -1; } pr("Looking for best path to %s\n", path); - path = BestLandPath(buf2, start, &ending_sect, &total_mcost, - MOB_MOVE); + buf2[0] = 0; + total_mcost = path_find(start->sct_x, start->sct_y, + ending_sect.sct_x, ending_sect.sct_y, + start->sct_own, MOB_MOVE); + if (total_mcost < 0) { + total_mcost = 0; + path = NULL; + } else { + len = path_find_route(buf2, 1024, + start->sct_x, start->sct_y, + ending_sect.sct_x, ending_sect.sct_y); + if (len + 1 >= 1024) + path = NULL; + else { + strcpy(buf2 + len, "h"); + path = buf2; + } + } if (exploring && path) /* take off the 'h' */ path[strlen(path) - 1] = '\0'; if (!path) @@ -120,8 +137,24 @@ move_ground(struct sctstr *start, struct sctstr *end, } if (movstr && sarg_xy(movstr, &dx, &dy)) { if (getsect(dx, dy, &dsect)) { - movstr = BestLandPath(buf2, §, &dsect, &mv_cost, - MOB_MOVE); + buf2[0] = 0; + mv_cost = path_find(sect.sct_x, sect.sct_y, + dsect.sct_x, dsect.sct_y, + sect.sct_own, MOB_MOVE); + if (mv_cost < 0) { + mv_cost = 0; + movstr = NULL; + } else { + len = path_find_route(buf2, 1024, + sect.sct_x, sect.sct_y, + dsect.sct_x, dsect.sct_y); + if (len + 1 >= 1024) + movstr = NULL; + else { + strcpy(buf2 + len, "h"); + movstr = buf2; + } + } } else { pr("Invalid destination sector!\n"); movstr = NULL; diff --git a/src/lib/subs/unitsub.c b/src/lib/subs/unitsub.c index d85281f3..fec85c04 100644 --- a/src/lib/subs/unitsub.c +++ b/src/lib/subs/unitsub.c @@ -139,8 +139,8 @@ unit_path(int together, struct empobj *unit, char *buf) coord destx; coord desty; struct sctstr d_sect, sect; + size_t len; char *cp; - double dummy; int mtype; if (CANT_HAPPEN(unit->ef_type != EF_LAND && unit->ef_type != EF_SHIP)) @@ -167,7 +167,28 @@ unit_path(int together, struct empobj *unit, char *buf) } else { getsect(unit->x, unit->y, §); mtype = lnd_mobtype((struct lndstr *)unit); - cp = BestLandPath(buf, §, &d_sect, &dummy, mtype); + 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 + * land. It doesn't affect mobility costs. The real actor is + * 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) { pr("No owned %s from %s to %s!\n", mtype == MOB_RAIL ? "railway" : "path",