(diridx): New. Use instead of chkdir() where direction characters
must be valid. Oopses on bad direction characters. (pathtoxy, ac_encounter): Bad direction characters used to lead to bad array subscript and potential disaster. (pathrange, path): Stop on DIR_STOP as well as on bad direction characters. This is just for consistency with other code; DIR_STOP should occur only last in a path here. (sail_nav_fleet, nav_ship): No change except for the oops.
This commit is contained in:
parent
a88f12017e
commit
dfa56cb0ef
6 changed files with 31 additions and 18 deletions
|
@ -63,6 +63,7 @@ extern double ncost(struct sctstr *, natid);
|
||||||
extern double pathtoxy(s_char *, coord *, coord *,
|
extern double pathtoxy(s_char *, coord *, coord *,
|
||||||
double (*)(struct sctstr * sp, natid own));
|
double (*)(struct sctstr * sp, natid own));
|
||||||
extern int chkdir(s_char, int, int);
|
extern int chkdir(s_char, int, int);
|
||||||
|
extern int diridx(char);
|
||||||
extern void direrr(s_char *, s_char *, s_char *);
|
extern void direrr(s_char *, s_char *, s_char *);
|
||||||
extern void pathrange(register coord, register coord, register s_char *,
|
extern void pathrange(register coord, register coord, register s_char *,
|
||||||
int, struct range *);
|
int, struct range *);
|
||||||
|
|
|
@ -101,7 +101,10 @@ path(void)
|
||||||
natp = getnatp(player->cnum);
|
natp = getnatp(player->cnum);
|
||||||
xyrelrange(natp, &absrange, &relrange);
|
xyrelrange(natp, &absrange, &relrange);
|
||||||
blankfill((s_char *)mapbuf, &ns.range, 3);
|
blankfill((s_char *)mapbuf, &ns.range, 3);
|
||||||
while (*pp && (i = chkdir(*pp, DIR_STOP, DIR_LAST)) >= 0) {
|
for (; *pp; ++pp) {
|
||||||
|
i = diridx(*pp);
|
||||||
|
if (i == DIR_STOP)
|
||||||
|
break;
|
||||||
memcpy(&map[deltay(cy, ns.range.ly)][deltax(cx, ns.range.lx) * 2],
|
memcpy(&map[deltay(cy, ns.range.ly)][deltax(cx, ns.range.lx) * 2],
|
||||||
routech[i][0],
|
routech[i][0],
|
||||||
3);
|
3);
|
||||||
|
|
|
@ -129,7 +129,7 @@ ac_encounter(struct emp_qelem *bomb_list, struct emp_qelem *esc_list,
|
||||||
|
|
||||||
pln_removedupes(bomb_list, esc_list);
|
pln_removedupes(bomb_list, esc_list);
|
||||||
while ((dir = mypath[myp++]) && !QEMPTY(bomb_list)) {
|
while ((dir = mypath[myp++]) && !QEMPTY(bomb_list)) {
|
||||||
if ((val = chkdir(dir, DIR_STOP, DIR_LAST)) == 0)
|
if ((val = diridx(dir)) == DIR_STOP)
|
||||||
break;
|
break;
|
||||||
/* XXX using xnorm is probably bad */
|
/* XXX using xnorm is probably bad */
|
||||||
x = xnorm(x + diroff[val][0]);
|
x = xnorm(x + diroff[val][0]);
|
||||||
|
|
|
@ -66,6 +66,21 @@ direrr(s_char *stop_msg, s_char *view_msg, s_char *map_msg)
|
||||||
pr(map_msg, dirch[DIR_MAP]);
|
pr(map_msg, dirch[DIR_MAP]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Map direction DIR to a direction index DIR_STOP..DIR_LAST.
|
||||||
|
* DIR must be a valid direction.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
diridx(char dir)
|
||||||
|
{
|
||||||
|
unsigned i = dir - 'a';
|
||||||
|
|
||||||
|
if (CANT_HAPPEN(i >= sizeof(dirindex) / sizeof(*dirindex)
|
||||||
|
|| dirindex[i] < 0))
|
||||||
|
return DIR_STOP;
|
||||||
|
return dirindex[i];
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* return pointer to path; prompt user until a stop char
|
* return pointer to path; prompt user until a stop char
|
||||||
* or a bomb char have been entered. A "bomb" char in
|
* or a bomb char have been entered. A "bomb" char in
|
||||||
|
@ -213,19 +228,15 @@ pathtoxy(s_char *path, coord *xp, coord *yp,
|
||||||
coord y;
|
coord y;
|
||||||
int val;
|
int val;
|
||||||
double m;
|
double m;
|
||||||
int c;
|
|
||||||
|
|
||||||
x = *xp;
|
x = *xp;
|
||||||
y = *yp;
|
y = *yp;
|
||||||
m = 0.0;
|
m = 0.0;
|
||||||
for (pp = path; *pp; pp++) {
|
for (pp = path; *pp; pp++) {
|
||||||
if ((val = chkdir(*pp, DIR_STOP, DIR_LAST)) == 0)
|
if ((val = diridx(*pp)) == DIR_STOP)
|
||||||
break;
|
break;
|
||||||
x += diroff[val][0];
|
x += diroff[val][0];
|
||||||
y += diroff[val][1];
|
y += diroff[val][1];
|
||||||
c = dirch[val];
|
|
||||||
if (c == DIR_STOP)
|
|
||||||
break;
|
|
||||||
if (!getsect(x, y, &s))
|
if (!getsect(x, y, &s))
|
||||||
return -1.0;
|
return -1.0;
|
||||||
m += cost(&s, s.sct_own);
|
m += cost(&s, s.sct_own);
|
||||||
|
@ -236,8 +247,7 @@ pathtoxy(s_char *path, coord *xp, coord *yp,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pathrange(register coord cx, register coord cy, register s_char *pp,
|
pathrange(coord cx, coord cy, s_char *pp, int border, struct range *range)
|
||||||
int border, struct range *range)
|
|
||||||
{
|
{
|
||||||
int dir;
|
int dir;
|
||||||
|
|
||||||
|
@ -247,8 +257,10 @@ pathrange(register coord cx, register coord cy, register s_char *pp,
|
||||||
range->hy = cy;
|
range->hy = cy;
|
||||||
range->width = 0;
|
range->width = 0;
|
||||||
range->height = 0;
|
range->height = 0;
|
||||||
while ((dir = chkdir(*pp, DIR_FIRST, DIR_LAST)) >= 0) {
|
for (; *pp; pp++) {
|
||||||
pp++;
|
dir = diridx(*pp);
|
||||||
|
if (dir == DIR_STOP)
|
||||||
|
break;
|
||||||
cx += diroff[dir][0];
|
cx += diroff[dir][0];
|
||||||
cy += diroff[dir][1];
|
cy += diroff[dir][1];
|
||||||
if (cx < range->lx)
|
if (cx < range->lx)
|
||||||
|
|
|
@ -303,14 +303,11 @@ nav_ship(struct shpstr *sp)
|
||||||
stopping = 0;
|
stopping = 0;
|
||||||
|
|
||||||
while (*cp && !stopping && sp->shp_own && mlp->mobil > 0.0) {
|
while (*cp && !stopping && sp->shp_own && mlp->mobil > 0.0) {
|
||||||
dir = chkdir(*cp++, DIR_STOP, DIR_LAST);
|
dir = diridx(*cp++);
|
||||||
|
|
||||||
stopping |= shp_nav_one_sector(&ship_list, dir,
|
stopping |= shp_nav_one_sector(&ship_list, dir,
|
||||||
sp->shp_own, 0);
|
sp->shp_own, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sp->shp_mobil = (int) mobil;
|
|
||||||
*/
|
|
||||||
/* Ship not sunk */
|
/* Ship not sunk */
|
||||||
if (sp->shp_own)
|
if (sp->shp_own)
|
||||||
nav_check_atdest(sp);
|
nav_check_atdest(sp);
|
||||||
|
|
|
@ -262,10 +262,10 @@ sail_nav_fleet(struct fltheadstr *fltp)
|
||||||
own = sp->shp_own;
|
own = sp->shp_own;
|
||||||
fltp_to_list(fltp, &ship_list); /* hack -KHS 1995 */
|
fltp_to_list(fltp, &ship_list); /* hack -KHS 1995 */
|
||||||
for (s = sp->shp_path; (*s) && (fltp->maxmoves > 0); s++) {
|
for (s = sp->shp_path; (*s) && (fltp->maxmoves > 0); s++) {
|
||||||
dir = chkdir(*s, DIR_STOP, DIR_LAST);
|
dir = diridx(*s);
|
||||||
if (0 != (error = shp_nav_one_sector(&ship_list, dir, own, 0)))
|
if (0 != shp_nav_one_sector(&ship_list, dir, own, 0))
|
||||||
fltp->maxmoves = 1;
|
fltp->maxmoves = 1;
|
||||||
--(fltp->maxmoves);
|
--fltp->maxmoves;
|
||||||
}
|
}
|
||||||
shp_put(&ship_list, own);
|
shp_put(&ship_list, own);
|
||||||
getship(sp->shp_uid, &ship);
|
getship(sp->shp_uid, &ship);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue