Index: common/map.h =================================================================== RCS file: /home/freeciv/CVS/freeciv/common/map.h,v retrieving revision 1.79 diff -u -r1.79 map.h --- common/map.h 2001/07/01 20:54:00 1.79 +++ common/map.h 2001/07/29 19:58:41 @@ -364,6 +364,34 @@ } \ } +/* Iterate through all tiles adjacent to a tile. dir_itr is the + directional value (see DIR_D[XY]). This assumes that center_x and + center_y are normalized. --JDS */ +#define adjc_dir_iterate(center_x, center_y, x_itr, y_itr, dir_itr) \ +{ \ + int x_itr, y_itr, dir_itr, border; \ + assert(0 <= center_y && center_y <= map.ysize \ + && 0 <= center_x && center_x <= map.xsize); \ + border = (center_y == 0 \ + || center_x == 0 \ + || center_y == map.ysize-1 \ + || center_x == map.xsize-1); \ + for (dir_itr = 0; dir_itr < 8; dir_itr++) { \ + y_itr = center_y + DIR_DY[dir_itr]; \ + x_itr = center_x + DIR_DX[dir_itr]; \ + if (border) { \ + if (y_itr < 0 || y_itr > map.ysize) \ + continue; \ + if (x_itr < 0) \ + x_itr += map.xsize; \ + else if (x_itr >= map.xsize) \ + x_itr -= map.xsize; \ + } + +#define adjc_iterate_dir_end \ + } \ +} + /* iterating y, x for cache efficiency */ #define whole_map_iterate(WMI_x_itr, WMI_y_itr) \ { \ Index: server/gotohand.c =================================================================== RCS file: /home/freeciv/CVS/freeciv/server/gotohand.c,v retrieving revision 1.99 diff -u -r1.99 gotohand.c --- server/gotohand.c 2001/06/29 19:39:06 1.99 +++ server/gotohand.c 2001/07/26 17:32:44 @@ -273,7 +273,7 @@ void really_generate_warmap(struct city *pcity, struct unit *punit, enum unit_move_type move_type) { - int x, y, move_cost, dir, x1, y1; + int x, y, move_cost; int orig_x, orig_y; int igter; int maxcost = THRESHOLD * 6 + 2; /* should be big enough without being TOO big */ @@ -307,12 +307,7 @@ while (get_from_mapqueue(&x, &y)) { ptile = map_get_tile(x, y); - for (dir = 0; dir < 8; dir++) { - x1 = x + DIR_DX[dir]; - y1 = y + DIR_DY[dir]; - if (!normalize_map_pos(&x1, &y1)) - continue; - + adjc_dir_iterate(x, y, x1, y1, dir) { switch (move_type) { case LAND_MOVING: if (warmap.cost[x1][y1] <= warmap.cost[x][y]) @@ -363,7 +358,7 @@ freelog(LOG_FATAL, "Bad/unimplemented move_type in really_generate_warmap()."); abort(); } - } /* end for */ + } adjc_iterate_dir_end; } freelog(LOG_DEBUG, "Generated warmap for (%d,%d).",