diff --git a/include/path.h b/include/path.h index 497dbe7f..25c57b2b 100644 --- a/include/path.h +++ b/include/path.h @@ -51,7 +51,7 @@ #define DIR_FIRST 1 #define DIR_LAST 6 -extern int dirindex[]; +extern signed char dirindex['z'-'a'+1]; extern int diroff[][2]; extern s_char dirch[]; diff --git a/src/lib/common/path.c b/src/lib/common/path.c index 98d55b2b..b6e33e9c 100644 --- a/src/lib/common/path.c +++ b/src/lib/common/path.c @@ -307,8 +307,9 @@ bp_clear_cachepath(void) double pathcost(struct sctstr *start, s_char *path, int mob_type) { - register int o; - register int cx, cy; + unsigned i; + int o; + int cx, cy; double cost = 0.0; struct sctstr *sp; int sx, sy, offset; @@ -321,7 +322,12 @@ pathcost(struct sctstr *start, s_char *path, int mob_type) path++; continue; } - o = dirindex[(int)((*path) - 'a')]; + i = *path - 'a'; + if (CANT_HAPPEN(i >= sizeof(dirindex) / sizeof(*dirindex))) + break; + o = dirindex[i]; + if (CANT_HAPPEN(o) < 0) + break; cx += diroff[o][0]; cy += diroff[o][1]; sx = XNORM(cx); diff --git a/src/lib/global/dir.c b/src/lib/global/dir.c index 27807778..3c503242 100644 --- a/src/lib/global/dir.c +++ b/src/lib/global/dir.c @@ -55,8 +55,9 @@ int diroff[][2] = { /* this maps a character from a to z into the diroff mappings. It keeps us from having to loop if we don't want to */ -int dirindex[] = { 0, 4, 0, 0, 0, 0, 5, 0, 0, 2, 0, 0, 8, - 3, 0, 0, 0, 0, 0, 0, 1, 7, 0, 0, 6, 0 +signed char dirindex[] = { + -1, 4, -1, -1, -1, -1, 5, 0, -1, 2, -1, -1, 8, + 3, -1, -1, -1, -1, -1, -1, 1, 7, -1, -1, 6, -1 }; /* must agree with dirch[] and DIR_ defines */