diff -Nur -X/home/thue/freeciv-dev/freeciv/diff_ignore freeciv/common/shared.h workdir/common/shared.h --- freeciv/common/shared.h Tue May 16 15:45:04 2000 +++ workdir/common/shared.h Tue May 16 19:07:25 2000 @@ -47,6 +47,9 @@ #define BOOL_VAL(x) ((x)!=0) +/* Used to update bitvectors when a player is removed. + Deletes bit no in val, moves all bits larger than no one down, + and inserts a zero at the top. */ #define WIPEBIT(val, no) ( ((~(-1<<(no)))&(val)) \ | (( (-1<<((no)+1)) & (val)) >>1) ) diff -Nur -X/home/thue/freeciv-dev/freeciv/diff_ignore freeciv/server/maphand.c workdir/server/maphand.c --- freeciv/server/maphand.c Tue May 16 16:06:22 2000 +++ workdir/server/maphand.c Tue May 16 20:42:27 2000 @@ -1008,6 +1008,57 @@ } /*************************************************************** +... +****************************************************************/ +static void player_map_deallocate(int playerid) +{ + int x,y; + + if (player_tiles[playerid]) { + for (y=0; ycity) + free(plrtile->city); + } + + free(player_tiles[playerid]); + player_tiles[playerid] = NULL; + } +} + +/*************************************************************** +... +****************************************************************/ +void player_map_renumber(int deleted_player) +{ + int o, x, y; + + if (player_tiles[deleted_player]) + player_map_deallocate(deleted_player); + + for (o = deleted_player; o < MAX_NUM_PLAYERS+MAX_NUM_BARBARIANS-1; o++) { + player_tiles[o] = player_tiles[o+1]; + } + + player_tiles[MAX_NUM_PLAYERS+MAX_NUM_BARBARIANS-1] = NULL; + + for (o = 0; o < game.nplayers; o++) + if (player_tiles[o]) + for(y=0; ycity; + if (dcity && dcity->owner == deleted_player) { + reality_check_city(get_player(o), x, y); + } + if (dcity && dcity->owner > deleted_player) { + dcity->owner--; + } + } +} + +/*************************************************************** We need to use use fogofwar_old here, so the player's tiles get in the same state as the other players' tiles. ***************************************************************/ diff -Nur -X/home/thue/freeciv-dev/freeciv/diff_ignore freeciv/server/maphand.h workdir/server/maphand.h --- freeciv/server/maphand.h Tue May 16 16:06:22 2000 +++ workdir/server/maphand.h Tue May 16 16:51:15 2000 @@ -73,6 +73,7 @@ void map_know_and_see_all(struct player *pplayer); void set_unknown_tiles_to_unsent(struct player *pplayer); void player_map_allocate(struct player *pplayer); +void player_map_renumber(int deleted_player); struct player_tile *map_get_player_tile(int x, int y, int playerid); void update_tile_knowledge(struct player *pplayer,int x, int y); void update_player_tile_last_seen(struct player *pplayer, int x, int y); diff -Nur -X/home/thue/freeciv-dev/freeciv/diff_ignore freeciv/server/plrhand.c workdir/server/plrhand.c --- freeciv/server/plrhand.c Tue May 16 16:06:22 2000 +++ workdir/server/plrhand.c Tue May 16 17:06:15 2000 @@ -2819,13 +2819,15 @@ game_remove_player(pplayer->player_no); game_renumber_players(pplayer->player_no); + player_map_renumber(idx); - if(map.tiles) { + if (map.tiles) { for(y=0; yknown=WIPEBIT(ptile->known, idx); + struct tile *ptile = map_get_tile(x, y); + ptile->known = WIPEBIT(ptile->known, idx); + ptile->sent = WIPEBIT(ptile->known, idx); + ptile->assigned = WIPEBIT(ptile->known, idx); } } }