diff -Nur -X/data/freeciv-dev/freeciv/diff_ignore freeciv/server/maphand.c codeciv/server/maphand.c --- freeciv/server/maphand.c Fri Jan 26 18:28:50 2001 +++ codeciv/server/maphand.c Fri Jan 26 22:23:24 2001 @@ -50,6 +50,7 @@ static void map_clear_sent(int x, int y, struct player *pplayer); static void set_unknown_tiles_to_unsent(struct player *pplayer); static void shared_vision_change_seen(int x, int y, struct player *pplayer, int change); +static int map_get_seen(int x, int y, int playerid); /************************************************************************** Used only in global_warming() and nuclear_winter() below. @@ -415,6 +416,55 @@ /************************************************************************** ... **************************************************************************/ +static int map_get_pending_seen(struct player *pplayer, int x, int y) +{ + return map_get_player_tile(x, y, pplayer->player_no)->pending_seen; +} + +/************************************************************************** +... +**************************************************************************/ +static void map_set_pending_seen(struct player *pplayer, int x, int y, int newv) +{ + map_get_player_tile(x, y, pplayer->player_no)->pending_seen = newv; +} + +/************************************************************************** +... +**************************************************************************/ +static void increment_pending_seen(struct player *pplayer, int x, int y) +{ + map_get_player_tile(x, y, pplayer->player_no)->pending_seen += 1; +} + +/************************************************************************** +... +**************************************************************************/ +static void decrement_pending_seen(struct player *pplayer, int x, int y) +{ + struct player_tile *plr_tile = map_get_player_tile(x, y, pplayer->player_no); + assert(plr_tile->pending_seen != 0); + map_get_player_tile(x, y, pplayer->player_no)->pending_seen -= 1; +} + +/************************************************************************** +... +**************************************************************************/ +void reveal_pending_seen(struct player *pplayer, int x, int y, int len) +{ + square_iterate(x, y, len, x_itr, y_itr) { + int pseen = map_get_pending_seen(pplayer, x_itr, y_itr); + map_set_pending_seen(pplayer, x_itr, y_itr, 0); + while (pseen > 0) { + unfog_area(pplayer, x_itr, y_itr, 0); + pseen--; + } + } square_iterate_end; +} + +/************************************************************************** +... +**************************************************************************/ static void really_unfog_area(struct player *pplayer, int x, int y) { struct city *pcity; @@ -484,6 +534,8 @@ really_unfog_area(pplayer2, abs_x, abs_y); } players_iterate_end; } square_iterate_end; + + reveal_pending_seen(pplayer, x, y, len); unbuffer_shared_vision(pplayer); } @@ -530,19 +582,23 @@ buffer_shared_vision(pplayer); square_iterate(x, y, len, abs_x, abs_y) { - /* the player himself */ - shared_vision_change_seen(abs_x, abs_y, pplayer, -1); - if (map_get_seen(abs_x, abs_y, playerid) == 0) - really_fog_area(pplayer, abs_x, abs_y); + if (map_get_known(abs_x, abs_y, pplayer)) { + /* the player himself */ + shared_vision_change_seen(abs_x, abs_y, pplayer, -1); + if (map_get_seen(abs_x, abs_y, playerid) == 0) + really_fog_area(pplayer, abs_x, abs_y); - /* players (s)he gives shared vision */ - players_iterate(pplayer2) { - int playerid2 = pplayer2->player_no; - if (!(pplayer->really_gives_vision & (1<player_no; + if (!(pplayer->really_gives_vision & (1<player_no, +1); - map_change_own_seen(x_itr, y_itr, pplayer->player_no, +1); - - players_iterate(pplayer2) { - int playerid2 = pplayer2->player_no; - if (!(pplayer->really_gives_vision & (1<player_no, -1); - map_change_own_seen(x_itr, y_itr, pplayer->player_no, -1); - - players_iterate(pplayer2) { - int playerid2 = pplayer2->player_no; - if (!(pplayer->really_gives_vision & (1<known)&(1u<player_no)); + return map_get_tile(x, y)->known & (1u<player_no); } /*************************************************************** @@ -750,7 +787,7 @@ /*************************************************************** Watch out - this can be true even if the tile is not known. ***************************************************************/ -int map_get_seen(int x, int y, int playerid) +static int map_get_seen(int x, int y, int playerid) { return map_get_player_tile(x, y, playerid)->seen; } @@ -766,11 +803,14 @@ } /*************************************************************** -Watch out - this can be true even if the tile is not known. +... ***************************************************************/ int map_get_own_seen(int x, int y, int playerid) { - return map_get_player_tile(x, y, playerid)->own_seen; + int own_seen = map_get_player_tile(x, y, playerid)->own_seen; + if (own_seen) + assert(map_get_known(x, y, get_player(playerid))); + return own_seen; } /*************************************************************** @@ -786,17 +826,15 @@ ***************************************************************/ void map_set_known(int x, int y, struct player *pplayer) { - (map.tiles+map_adjust_x(x)+ - map_adjust_y(y)*map.xsize)->known|=(1u<player_no); + map_get_tile(x, y)->known |= (1u<player_no); } /*************************************************************** -Not used +... ***************************************************************/ void map_clear_known(int x, int y, struct player *pplayer) { - (map.tiles+map_adjust_x(x)+ - map_adjust_y(y)*map.xsize)->known&=~(1u<player_no); + map_get_tile(x, y)->known &= ~(1u<player_no); } /*************************************************************** @@ -834,8 +872,7 @@ ***************************************************************/ static void map_set_sent(int x, int y, struct player *pplayer) { - (map.tiles+map_adjust_x(x)+ map_adjust_y(y)*map.xsize)->sent - |= (1u<player_no); + map_get_tile(x, y)->sent |= (1u<player_no); } /*************************************************************** @@ -843,8 +880,7 @@ ***************************************************************/ static void map_clear_sent(int x, int y, struct player *pplayer) { - (map.tiles+map_adjust_x(x)+ map_adjust_y(y)*map.xsize)->sent - &= ~(1u<player_no); + map_get_tile(x, y)->sent &= ~(1u<player_no); } /*************************************************************** @@ -852,8 +888,7 @@ ***************************************************************/ static int map_get_sent(int x, int y, struct player *pplayer) { - return (int) (((map.tiles+map_adjust_x(x)+ - map_adjust_y(y)*map.xsize)->sent)&(1u<player_no)); + return map_get_tile(x, y)->sent & (1u<player_no); } /*************************************************************** @@ -894,6 +929,7 @@ plrtile->seen = 1; plrtile->last_updated = GAME_START_YEAR; plrtile->own_seen = plrtile->seen; + plrtile->pending_seen = 0; } /*************************************************************** @@ -913,9 +949,9 @@ /*************************************************************** ... ***************************************************************/ -void update_tile_knowledge(struct player *pplayer,int x, int y) +void update_tile_knowledge(struct player *pplayer, int x, int y) { - struct tile *ptile = map_get_tile(x,y); + struct tile *ptile = map_get_tile(x, y); struct player_tile *plrtile = map_get_player_tile(x, y, pplayer->player_no); plrtile->terrain = ptile->terrain; @@ -986,6 +1022,8 @@ dest_city->owner = from_city->owner; send_city_info_at_tile(pdest, &pdest->connections, NULL, x, y); } + + reveal_pending_seen(pdest, x, y, 0); } } } @@ -1077,8 +1115,10 @@ int change = map_get_own_seen(x, y, pplayer->player_no); if (change) { map_change_seen(x, y, pplayer2->player_no, change); - if (map_get_seen(x, y, pplayer2->player_no) == change) + if (map_get_seen(x, y, pplayer2->player_no) == change) { really_unfog_area(pplayer2, x, y); + reveal_pending_seen(pplayer2, x, y, 0); + } } } whole_map_iterate_end; @@ -1156,4 +1196,67 @@ remove_shared_vision(pplayer, pplayer2); notify_player(pplayer2, _("%s no longer gives us shared vision!"), pplayer->name); +} + +/************************************************************************* +... +*************************************************************************/ +static void enable_fog_of_war_player(struct player *pplayer) +{ + int playerid = pplayer->player_no; + whole_map_iterate(x, y) { + if (map_get_known(x, y, pplayer)) { + map_change_seen(x, y, playerid, -1); + if (map_get_seen(x, y, playerid) == 0) + update_player_tile_last_seen(pplayer, x, y); + } else { + decrement_pending_seen(pplayer, x, y); + } + } whole_map_iterate_end; +} + +/************************************************************************* +... +*************************************************************************/ +void enable_fog_of_war(void) +{ + players_iterate(pplayer) { + enable_fog_of_war_player(pplayer); + } players_iterate_end; + + send_all_known_tiles(&game.game_connections); +} + +/************************************************************************* +... +*************************************************************************/ +static void disable_fog_of_war_player(struct player *pplayer) +{ + int playerid = pplayer->player_no; + whole_map_iterate(x, y) { + if (map_get_known(x, y, pplayer)) { + struct city *pcity = map_get_city(x, y); + map_change_seen(x, y, playerid, +1); + reality_check_city(pplayer, x, y); + if (pcity) { + update_dumb_city(pplayer, pcity); + } + } else { + increment_pending_seen(pplayer, x, y); + } + } whole_map_iterate_end; +} + +/************************************************************************* +... +*************************************************************************/ +void disable_fog_of_war(void) +{ + players_iterate(pplayer) { + disable_fog_of_war_player(pplayer); + } players_iterate_end; + + send_all_known_tiles(&game.game_connections); + send_all_known_units(&game.game_connections); + send_all_known_cities(&game.game_connections); } diff -Nur -X/data/freeciv-dev/freeciv/diff_ignore freeciv/server/maphand.h codeciv/server/maphand.h --- freeciv/server/maphand.h Fri Jan 26 18:28:50 2001 +++ codeciv/server/maphand.h Fri Jan 26 22:40:03 2001 @@ -33,6 +33,11 @@ enum tile_special_type special; unsigned short seen; unsigned short own_seen; + /* If you build a city with an unknown square within city radius + the square stays unknown. However, we still have to keep count + of the seen points, so they are kept in here. When the tile + then becomes known they are moved to seen. */ + unsigned short pending_seen; struct dumb_city* city; short last_updated; }; @@ -57,7 +62,6 @@ void map_fog_pseudo_city_area(struct player *pplayer, int x,int y); int map_get_known_and_seen(int x, int y, int playerid); -int map_get_seen(int x, int y, int playerid); void map_change_seen(int x, int y, int playerid, int change); int map_get_own_seen(int x, int y, int playerid); void map_change_own_seen(int x, int y, int playerid, int change); @@ -76,4 +80,7 @@ void remove_shared_vision(struct player *pfrom, struct player *pto); void handle_player_remove_vision(struct player *pplayer, struct packet_generic_integer *packet); + +void enable_fog_of_war(void); +void disable_fog_of_war(void); #endif /* FC__MAPHAND_H */ diff -Nur -X/data/freeciv-dev/freeciv/diff_ignore freeciv/server/srv_main.c codeciv/server/srv_main.c --- freeciv/server/srv_main.c Fri Jan 26 18:28:51 2001 +++ codeciv/server/srv_main.c Fri Jan 26 21:54:26 2001 @@ -107,10 +107,6 @@ struct packet_req_join_game *request); static void handle_turn_done(struct player *pplayer); static void send_select_nation(struct player *pplayer); -static void enable_fog_of_war_player(struct player *pplayer); -static void disable_fog_of_war_player(struct player *pplayer); -static void enable_fog_of_war(void); -static void disable_fog_of_war(void); static int check_for_full_turn_done(void); @@ -1912,65 +1908,4 @@ _("Game: %s rules the %s."), pplayer->name, get_nation_name_plural(pplayer->nation)); -} - -/************************************************************************* -... -*************************************************************************/ -static void enable_fog_of_war_player(struct player *pplayer) -{ - int x,y; - int playerid = pplayer->player_no; - struct tile *ptile; - for (x = 0; x < map.xsize; x++) - for (y = 0; y < map.ysize; y++) { - ptile = map_get_tile(x,y); - map_change_seen(x, y, playerid, -1); - if (map_get_seen(x, y, playerid) == 0) - update_player_tile_last_seen(pplayer, x, y); - } -} - -/************************************************************************* -... -*************************************************************************/ -static void enable_fog_of_war(void) -{ - int o; - for (o = 0; o < game.nplayers; o++) - enable_fog_of_war_player(&game.players[o]); - send_all_known_tiles(&game.game_connections); -} - -/************************************************************************* -... -*************************************************************************/ -static void disable_fog_of_war_player(struct player *pplayer) -{ - int x,y; - int playerid = pplayer->player_no; - for (x = 0; x < map.xsize; x++) { - for (y = 0; y < map.ysize; y++) { - map_change_seen(x, y, playerid, +1); - if (map_get_known(x, y, pplayer)) { - struct city *pcity = map_get_city(x,y); - reality_check_city(pplayer, x, y); - if (pcity) - update_dumb_city(pplayer, pcity); - } - } - } -} - -/************************************************************************* -... -*************************************************************************/ -static void disable_fog_of_war(void) -{ - int o; - for (o = 0; o < game.nplayers; o++) - disable_fog_of_war_player(&game.players[o]); - send_all_known_tiles(&game.game_connections); - send_all_known_units(&game.game_connections); - send_all_known_cities(&game.game_connections); }