Following commits will simplify the resulting code.
#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);
* best.c: Show the best path between two sectors
*
* Known contributors to this file:
- *
+ * Markus Armbruster, 2011
*/
#include <config.h>
struct sctstr s1, s2;
struct nstr_sect nstr, nstr2;
char buf[1024];
+ size_t len;
if (!snxtsct(&nstr, player->argp[1]))
return RET_SYN;
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),
* Known contributors to this file:
* David Muir Sharnoff, 1986
* (unknown rewrite), 1989
+ * Markus Armbruster, 2005-2011
*/
#include <config.h>
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;
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),
#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)
{
* move.c: Move something somewhere.
*
* Known contributors to this file:
- *
+ * Markus Armbruster, 2004-2011
*/
#include <config.h>
double sect_mcost;
double total_mcost;
double mv_cost;
+ size_t len;
double mobility = start->sct_mobil;
int dir;
int intcost;
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)
}
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;
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))
} 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",