Inline BestLandPath(), BestDistPath() glue
Following commits will simplify the resulting code.
This commit is contained in:
parent
957a6a74df
commit
92e64d7638
6 changed files with 99 additions and 54 deletions
|
@ -82,10 +82,6 @@ extern void path_find_print_stats(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* src/lib/common/path.c */
|
/* 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 *BestShipPath(char *, int, int, int, int, int);
|
||||||
extern char *BestAirPath(char *, int, int, int, int);
|
extern char *BestAirPath(char *, int, int, int, int);
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
* best.c: Show the best path between two sectors
|
* best.c: Show the best path between two sectors
|
||||||
*
|
*
|
||||||
* Known contributors to this file:
|
* Known contributors to this file:
|
||||||
*
|
* Markus Armbruster, 2011
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
@ -43,6 +43,7 @@ best(void)
|
||||||
struct sctstr s1, s2;
|
struct sctstr s1, s2;
|
||||||
struct nstr_sect nstr, nstr2;
|
struct nstr_sect nstr, nstr2;
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
|
size_t len;
|
||||||
|
|
||||||
if (!snxtsct(&nstr, player->argp[1]))
|
if (!snxtsct(&nstr, player->argp[1]))
|
||||||
return RET_SYN;
|
return RET_SYN;
|
||||||
|
@ -57,7 +58,23 @@ best(void)
|
||||||
while (!player->aborted && nxtsct(&nstr2, &s2)) {
|
while (!player->aborted && nxtsct(&nstr2, &s2)) {
|
||||||
if (!player->owner)
|
if (!player->owner)
|
||||||
continue;
|
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)
|
if (path)
|
||||||
pr("Best path from %s to %s is %s (cost %1.3f)\n",
|
pr("Best path from %s to %s is %s (cost %1.3f)\n",
|
||||||
xyas(s1.sct_x, s1.sct_y, player->cnum),
|
xyas(s1.sct_x, s1.sct_y, player->cnum),
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
* Known contributors to this file:
|
* Known contributors to this file:
|
||||||
* David Muir Sharnoff, 1986
|
* David Muir Sharnoff, 1986
|
||||||
* (unknown rewrite), 1989
|
* (unknown rewrite), 1989
|
||||||
|
* Markus Armbruster, 2005-2011
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
@ -51,6 +52,7 @@ path(void)
|
||||||
int i;
|
int i;
|
||||||
int y;
|
int y;
|
||||||
char *pp, *p;
|
char *pp, *p;
|
||||||
|
size_t len;
|
||||||
/* Note this is not re-entrant anyway, so we keep the buffers
|
/* Note this is not re-entrant anyway, so we keep the buffers
|
||||||
around */
|
around */
|
||||||
static char *mapbuf = NULL;
|
static char *mapbuf = NULL;
|
||||||
|
@ -66,7 +68,23 @@ path(void)
|
||||||
return RET_FAIL;
|
return RET_FAIL;
|
||||||
}
|
}
|
||||||
getsect(sect.sct_dist_x, sect.sct_dist_y, &dsect);
|
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) {
|
if (!pp) {
|
||||||
pr("No path possible from %s to distribution sector %s\n",
|
pr("No path possible from %s to distribution sector %s\n",
|
||||||
xyas(sect.sct_x, sect.sct_y, player->cnum),
|
xyas(sect.sct_x, sect.sct_y, player->cnum),
|
||||||
|
|
|
@ -43,46 +43,6 @@
|
||||||
#include "sect.h"
|
#include "sect.h"
|
||||||
#include "xy.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 *
|
char *
|
||||||
BestShipPath(char *path, int fx, int fy, int tx, int ty, int owner)
|
BestShipPath(char *path, int fx, int fy, int tx, int ty, int owner)
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
* move.c: Move something somewhere.
|
* move.c: Move something somewhere.
|
||||||
*
|
*
|
||||||
* Known contributors to this file:
|
* Known contributors to this file:
|
||||||
*
|
* Markus Armbruster, 2004-2011
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
@ -58,6 +58,7 @@ move_ground(struct sctstr *start, struct sctstr *end,
|
||||||
double sect_mcost;
|
double sect_mcost;
|
||||||
double total_mcost;
|
double total_mcost;
|
||||||
double mv_cost;
|
double mv_cost;
|
||||||
|
size_t len;
|
||||||
double mobility = start->sct_mobil;
|
double mobility = start->sct_mobil;
|
||||||
int dir;
|
int dir;
|
||||||
int intcost;
|
int intcost;
|
||||||
|
@ -79,8 +80,24 @@ move_ground(struct sctstr *start, struct sctstr *end,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pr("Looking for best path to %s\n", path);
|
pr("Looking for best path to %s\n", path);
|
||||||
path = BestLandPath(buf2, start, &ending_sect, &total_mcost,
|
buf2[0] = 0;
|
||||||
MOB_MOVE);
|
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' */
|
if (exploring && path) /* take off the 'h' */
|
||||||
path[strlen(path) - 1] = '\0';
|
path[strlen(path) - 1] = '\0';
|
||||||
if (!path)
|
if (!path)
|
||||||
|
@ -120,8 +137,24 @@ move_ground(struct sctstr *start, struct sctstr *end,
|
||||||
}
|
}
|
||||||
if (movstr && sarg_xy(movstr, &dx, &dy)) {
|
if (movstr && sarg_xy(movstr, &dx, &dy)) {
|
||||||
if (getsect(dx, dy, &dsect)) {
|
if (getsect(dx, dy, &dsect)) {
|
||||||
movstr = BestLandPath(buf2, §, &dsect, &mv_cost,
|
buf2[0] = 0;
|
||||||
MOB_MOVE);
|
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 {
|
} else {
|
||||||
pr("Invalid destination sector!\n");
|
pr("Invalid destination sector!\n");
|
||||||
movstr = NULL;
|
movstr = NULL;
|
||||||
|
|
|
@ -139,8 +139,8 @@ unit_path(int together, struct empobj *unit, char *buf)
|
||||||
coord destx;
|
coord destx;
|
||||||
coord desty;
|
coord desty;
|
||||||
struct sctstr d_sect, sect;
|
struct sctstr d_sect, sect;
|
||||||
|
size_t len;
|
||||||
char *cp;
|
char *cp;
|
||||||
double dummy;
|
|
||||||
int mtype;
|
int mtype;
|
||||||
|
|
||||||
if (CANT_HAPPEN(unit->ef_type != EF_LAND && unit->ef_type != EF_SHIP))
|
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 {
|
} else {
|
||||||
getsect(unit->x, unit->y, §);
|
getsect(unit->x, unit->y, §);
|
||||||
mtype = lnd_mobtype((struct lndstr *)unit);
|
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) {
|
if (!cp) {
|
||||||
pr("No owned %s from %s to %s!\n",
|
pr("No owned %s from %s to %s!\n",
|
||||||
mtype == MOB_RAIL ? "railway" : "path",
|
mtype == MOB_RAIL ? "railway" : "path",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue