diff options
Diffstat (limited to 'src/map/path.c')
-rw-r--r-- | src/map/path.c | 86 |
1 files changed, 76 insertions, 10 deletions
diff --git a/src/map/path.c b/src/map/path.c index b2e0a78a8..c2b852469 100644 --- a/src/map/path.c +++ b/src/map/path.c @@ -168,17 +168,13 @@ static int add_path(int *heap,struct tmp_path *tp,int x,int y,int dist,int dir,i */ static int can_place(struct map_data *m,int x,int y,int flag) { - int c; - nullpo_retr(0, m); - c=read_gatp(m,x,y); - - if(c==1) - return 0; - if(!(flag&0x10000) && c==5) - return 0; - return 1; + if(map_getcellp(m,x,y,CELL_CHKPASS)) + return 1; + else if((flag&0x10000)&&map_getcellp(m,x,y,CELL_CHKGROUND)) + return 1; + return 0; } /*========================================== @@ -246,6 +242,76 @@ int path_blownpos(int m,int x0,int y0,int dx,int dy,int count) } /*========================================== + * ?ʦɪ + *------------------------------------------ + */ +#define swap(x,y) { int t; t = x; x = y; y = t; } +int path_search_long(struct shootpath_data *spd,int m,int x0,int y0,int x1,int y1) +{ + int dx, dy; + int wx = 0, wy = 0; + int weight; + struct map_data *md; + + if (!map[m].gat) + return 0; + md = &map[m]; + + dx = (x1 - x0); + if (dx < 0) { + swap(x0, x1); + swap(y0, y1); + dx = -dx; + } + dy = (y1 - y0); + + if (spd) { + spd->rx = spd->ry = 0; + spd->len = 1; + spd->x[0] = x0; + spd->y[0] = y0; + } + + if (map_getcellp(md,x1,y1,CELL_CHKWALL)) + return 0; + + if (dx > abs(dy)) { + weight = dx; + if (spd) + spd->ry=1; + } else { + weight = abs(y1 - y0); + if (spd) + spd->rx=1; + } + + while (x0 != x1 || y0 != y1) { + if (map_getcellp(md,x0,y0,CELL_CHKWALL)) + return 0; + wx += dx; + wy += dy; + if (wx >= weight) { + wx -= weight; + x0 ++; + } + if (wy >= weight) { + wy -= weight; + y0 ++; + } else if (wy < 0) { + wy += weight; + y0 --; + } + if (spd && spd->len<MAX_WALKPATH) { + spd->x[spd->len] = x0; + spd->y[spd->len] = y0; + spd->len++; + } + } + + return 1; +} + +/*========================================== * pathT (x0,y0)->(x1,y1) *------------------------------------------ */ @@ -262,7 +328,7 @@ int path_search(struct walkpath_data *wpd,int m,int x0,int y0,int x1,int y1,int if(!map[m].gat) return -1; md=&map[m]; - if(x1<0 || x1>=md->xs || y1<0 || y1>=md->ys || (i=read_gatp(md,x1,y1))==1 || i==5) + if(x1<0 || x1>=md->xs || y1<0 || y1>=md->ys || map_getcellp(md,x1,y1,CELL_CHKNOPASS)) return -1; // easy |