(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 *,
|
||||
double (*)(struct sctstr * sp, natid own));
|
||||
extern int chkdir(s_char, int, int);
|
||||
extern int diridx(char);
|
||||
extern void direrr(s_char *, s_char *, s_char *);
|
||||
extern void pathrange(register coord, register coord, register s_char *,
|
||||
int, struct range *);
|
||||
|
|
|
@ -101,7 +101,10 @@ path(void)
|
|||
natp = getnatp(player->cnum);
|
||||
xyrelrange(natp, &absrange, &relrange);
|
||||
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],
|
||||
routech[i][0],
|
||||
3);
|
||||
|
|
|
@ -129,7 +129,7 @@ ac_encounter(struct emp_qelem *bomb_list, struct emp_qelem *esc_list,
|
|||
|
||||
pln_removedupes(bomb_list, esc_list);
|
||||
while ((dir = mypath[myp++]) && !QEMPTY(bomb_list)) {
|
||||
if ((val = chkdir(dir, DIR_STOP, DIR_LAST)) == 0)
|
||||
if ((val = diridx(dir)) == DIR_STOP)
|
||||
break;
|
||||
/* XXX using xnorm is probably bad */
|
||||
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]);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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
|
||||
* 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;
|
||||
int val;
|
||||
double m;
|
||||
int c;
|
||||
|
||||
x = *xp;
|
||||
y = *yp;
|
||||
m = 0.0;
|
||||
for (pp = path; *pp; pp++) {
|
||||
if ((val = chkdir(*pp, DIR_STOP, DIR_LAST)) == 0)
|
||||
if ((val = diridx(*pp)) == DIR_STOP)
|
||||
break;
|
||||
x += diroff[val][0];
|
||||
y += diroff[val][1];
|
||||
c = dirch[val];
|
||||
if (c == DIR_STOP)
|
||||
break;
|
||||
if (!getsect(x, y, &s))
|
||||
return -1.0;
|
||||
m += cost(&s, s.sct_own);
|
||||
|
@ -236,8 +247,7 @@ pathtoxy(s_char *path, coord *xp, coord *yp,
|
|||
}
|
||||
|
||||
void
|
||||
pathrange(register coord cx, register coord cy, register s_char *pp,
|
||||
int border, struct range *range)
|
||||
pathrange(coord cx, coord cy, s_char *pp, int border, struct range *range)
|
||||
{
|
||||
int dir;
|
||||
|
||||
|
@ -247,8 +257,10 @@ pathrange(register coord cx, register coord cy, register s_char *pp,
|
|||
range->hy = cy;
|
||||
range->width = 0;
|
||||
range->height = 0;
|
||||
while ((dir = chkdir(*pp, DIR_FIRST, DIR_LAST)) >= 0) {
|
||||
pp++;
|
||||
for (; *pp; pp++) {
|
||||
dir = diridx(*pp);
|
||||
if (dir == DIR_STOP)
|
||||
break;
|
||||
cx += diroff[dir][0];
|
||||
cy += diroff[dir][1];
|
||||
if (cx < range->lx)
|
||||
|
|
|
@ -303,14 +303,11 @@ nav_ship(struct shpstr *sp)
|
|||
stopping = 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,
|
||||
sp->shp_own, 0);
|
||||
}
|
||||
|
||||
/* sp->shp_mobil = (int) mobil;
|
||||
*/
|
||||
/* Ship not sunk */
|
||||
if (sp->shp_own)
|
||||
nav_check_atdest(sp);
|
||||
|
|
|
@ -262,10 +262,10 @@ sail_nav_fleet(struct fltheadstr *fltp)
|
|||
own = sp->shp_own;
|
||||
fltp_to_list(fltp, &ship_list); /* hack -KHS 1995 */
|
||||
for (s = sp->shp_path; (*s) && (fltp->maxmoves > 0); s++) {
|
||||
dir = chkdir(*s, DIR_STOP, DIR_LAST);
|
||||
if (0 != (error = shp_nav_one_sector(&ship_list, dir, own, 0)))
|
||||
dir = diridx(*s);
|
||||
if (0 != shp_nav_one_sector(&ship_list, dir, own, 0))
|
||||
fltp->maxmoves = 1;
|
||||
--(fltp->maxmoves);
|
||||
--fltp->maxmoves;
|
||||
}
|
||||
shp_put(&ship_list, own);
|
||||
getship(sp->shp_uid, &ship);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue