diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/common/city.h freeciv/common/city.h --- FreecivCVS/common/city.h Wed May 24 15:13:00 2000 +++ freeciv/common/city.h Mon Jun 26 10:00:21 2000 @@ -249,6 +249,26 @@ if (! ((dx == -(int)(CITY_MAP_SIZE/2) || dx == (int)(CITY_MAP_SIZE/2)) && \ (dy == -(int)(CITY_MAP_SIZE/2) || dy == (int)(CITY_MAP_SIZE/2))) ) +/* Iterate a city radius in map coordinates; skip non-existant squares */ + +#define map_city_radius_iterate(city_x, city_y, x_itr, y_itr) \ +{ \ + int MCMI_x, MCMI_y; \ + for (MCMI_x=0; MCMI_x= map.ysize) \ + continue; \ + x_itr = map_adjust_x(city_x + MCMI_x - CITY_MAP_SIZE/2); + +#define map_city_radius_iterate_end \ + } \ + } \ + } \ +} + struct ai_choice { diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/server/citytools.c freeciv/server/citytools.c --- FreecivCVS/server/citytools.c Fri Jun 16 13:01:30 2000 +++ freeciv/server/citytools.c Mon Jun 26 11:05:35 2000 @@ -1028,6 +1028,7 @@ unit_list_init(&pnewcity->units_supported); city_list_insert(&pplayer->cities, pnewcity); + give_citymap_from_player_to_player(pcity, cplayer, pplayer); map_unfog_city_area(pnewcity); /* transfer_city_units() destroys the city's units_supported diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/server/diplhand.c freeciv/server/diplhand.c --- FreecivCVS/server/diplhand.c Sat May 27 18:06:24 2000 +++ freeciv/server/diplhand.c Mon Jun 26 11:23:50 2000 @@ -289,7 +289,7 @@ if(packet->clause_type == CLAUSE_CITY){ struct city *pcity = find_city_by_id(packet->value); if (pcity && !map_get_known_and_seen(pcity->x, pcity->y, plr1->player_no)) - show_area(plr1, pcity->x, pcity->y,2); + give_citymap_from_player_to_player(pcity, plr0, plr1); } if((ptreaty=find_treaty(plr0, plr1))) { diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/server/maphand.c freeciv/server/maphand.c --- FreecivCVS/server/maphand.c Fri Jun 23 12:25:04 2000 +++ freeciv/server/maphand.c Mon Jun 26 11:56:53 2000 @@ -132,6 +132,21 @@ } /************************************************************************** +... +**************************************************************************/ +void give_citymap_from_player_to_player(struct city *pcity, + struct player *pfrom, struct player *pdest) +{ + int x, y; + + connection_do_buffer(pdest->conn); + map_city_radius_iterate(pcity->x, pcity->y, x, y) { + give_tile_info_from_player_to_player(pfrom, pdest, x, y); + } map_city_radius_iterate_end; + connection_do_unbuffer(pdest->conn); +} + +/************************************************************************** dest can be NULL meaning all players **************************************************************************/ void send_all_known_tiles(struct player *dest) @@ -740,51 +755,37 @@ } /************************************************************************** -There don't have to be a city. +There doesn't have to be a city. **************************************************************************/ void map_unfog_pseudo_city_area(struct player *pplayer, int x,int y) { - int i; + int x_itr, y_itr; - freelog(LOG_DEBUG, "Unfogging city area at %i,%i",x,y); + freelog(LOG_DEBUG, "Unfogging city area at %i,%i", x, y); - unfog_area(pplayer,x,y,1); - for (i = x-1;i<=x+1;i++) - if (is_real_tile(i,y+2)) - unfog_area(pplayer,map_adjust_x(i),y+2,0); - for (i = x-1;i<=x+1;i++) - if (is_real_tile(i,y-2)) - unfog_area(pplayer,map_adjust_x(i),y-2,0); - for (i = y-1;i<=y+1;i++) - if (is_real_tile(x+2,i)) - unfog_area(pplayer,map_adjust_x(x+2),i,0); - for (i = y-1;i<=y+1;i++) - if (is_real_tile(x+2,i)) - unfog_area(pplayer,map_adjust_x(x-2),i,0); + map_city_radius_iterate(x, y, x_itr, y_itr) { + if (map_get_known(x_itr, y_itr, pplayer)) + unfog_area(pplayer, x_itr, y_itr, 0); + else + map_change_seen(x_itr, y_itr, pplayer->player_no, +1); + } map_city_radius_iterate_end; } /************************************************************************** -There don't have to be a city. +There doesn't have to be a city. **************************************************************************/ void map_fog_pseudo_city_area(struct player *pplayer, int x,int y) { - int i; + int x_itr, y_itr; - freelog(LOG_DEBUG, "Fogging city area at %i,%i",x,y); + freelog(LOG_DEBUG, "Fogging city area at %i,%i", x, y); - fog_area(pplayer,x,y,1); - for (i = x-1;i<=x+1;i++) - if (is_real_tile(i,y+2)) - fog_area(pplayer,map_adjust_x(i),y+2,0); - for (i = x-1;i<=x+1;i++) - if (is_real_tile(i,y-2)) - fog_area(pplayer,map_adjust_x(i),y-2,0); - for (i = y-1;i<=y+1;i++) - if (is_real_tile(x+2,i)) - fog_area(pplayer,map_adjust_x(x+2),i,0); - for (i = y-1;i<=y+1;i++) - if (is_real_tile(x-2,i)) - fog_area(pplayer,map_adjust_x(x-2),i,0); + map_city_radius_iterate(x, y, x_itr, y_itr) { + if (map_get_known(x_itr, y_itr, pplayer)) + fog_area(pplayer, x_itr, y_itr, 0); + else + map_change_seen(x_itr, y_itr, pplayer->player_no, -1); + } map_city_radius_iterate_end; } /************************************************************************** diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/server/maphand.h freeciv/server/maphand.h --- FreecivCVS/server/maphand.h Fri Jun 23 12:25:04 2000 +++ freeciv/server/maphand.h Mon Jun 26 10:31:26 2000 @@ -37,6 +37,8 @@ void global_warming(int effect); void give_map_from_player_to_player(struct player *pfrom, struct player *pdest); void give_seamap_from_player_to_player(struct player *pfrom, struct player *pdest); +void give_citymap_from_player_to_player(struct city *pcity, + struct player *pfrom, struct player *pdest); void send_all_known_tiles(struct player *dest); void send_tile_info(struct player *dest, int x, int y); void unfog_area(struct player *pplayer, int x, int y, int len);