diff -Nur -X/home/thue/freeciv-dev/freeciv/diff_ignore freeciv/client/climisc.c workdir/client/climisc.c --- freeciv/client/climisc.c Wed May 31 14:34:23 2000 +++ workdir/client/climisc.c Wed May 31 18:58:26 2000 @@ -54,13 +54,6 @@ **************************************************************************/ void client_remove_player(int plrno) { - struct player *pplayer=&game.players[plrno]; - unit_list_iterate(pplayer->units, punit) - client_remove_unit(punit->id); - unit_list_iterate_end; - city_list_iterate(pplayer->cities, pcity) - client_remove_city(pcity); - city_list_iterate_end; game_renumber_players(plrno); } diff -Nur -X/home/thue/freeciv-dev/freeciv/diff_ignore freeciv/common/game.c workdir/common/game.c --- freeciv/common/game.c Wed May 31 14:34:44 2000 +++ workdir/common/game.c Wed May 31 18:50:37 2000 @@ -892,14 +892,6 @@ struct player *pplayer=&game.players[plrno]; if (is_barbarian(pplayer)) game.nbarbarians--; - - unit_list_iterate(pplayer->units, punit) - game_remove_unit(punit->id); - unit_list_iterate_end; - - city_list_iterate(pplayer->cities, pcity) - game_remove_city(pcity); - city_list_iterate_end; } /*************************************************************** @@ -908,41 +900,18 @@ void game_renumber_players(int plrno) { int i; - + for(i=plrno; iowner=i; - unit_list_iterate_end; - - city_list_iterate(game.players[i].cities, pcity) { - pcity->owner=i; - pcity->original= (pcity->originaloriginal : pcity->original-1; - } - city_list_iterate_end; } if(game.player_idx>plrno) { game.player_idx--; game.player_ptr=&game.players[game.player_idx]; } - - game.nplayers--; - - for (i=0; idiplstates[j] = pplayer->diplstates[j+1]; - } - pplayer->diplstates[game.nplayers].type = DS_NEUTRAL; - pplayer->diplstates[game.nplayers].has_reason_to_cancel = 0; - } - for(i=0; icity) - 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 th 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 Wed May 31 14:34:53 2000 +++ workdir/server/maphand.h Wed May 31 18:48:04 2000 @@ -73,7 +73,6 @@ 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 Wed May 31 14:34:53 2000 +++ workdir/server/plrhand.c Wed May 31 19:56:19 2000 @@ -2943,15 +2943,21 @@ void server_remove_player(struct player *pplayer) { struct packet_generic_integer pack; - int o, x, y, idx; - + int o, idx; + + /* Not allowed after a game has started */ + if (!(game.is_new_game && (server_state==PRE_GAME_STATE || + server_state==SELECT_RACES_STATE))) { + freelog(LOG_FATAL, "You can't remove players after the game has started!"); + abort(); + } + notify_player(pplayer, _("Game: You've been removed from the game!")); if(pplayer->conn) close_connection(pplayer->conn); pplayer->conn=NULL; notify_player(0, _("Game: %s has been removed from the game."), pplayer->name); - check_for_full_turn_done(); idx=pplayer->player_no; pack.value=pplayer->player_no; @@ -2959,29 +2965,7 @@ for(o=0; ocities, pcity) - city_map_iterate(x,y) { - set_worker_city(pcity, x, y, C_TILE_EMPTY); - } - remove_city_from_minimap(x, y); - /* same stupid problem as above, related to the citycache. - Thanks, Anders. */ - /* idex_unregister_city() will happen in game_remove_player() */ - city_list_iterate_end; game_remove_player(pplayer->player_no); game_renumber_players(pplayer->player_no); - player_map_renumber(idx); - - if (map.tiles) { - for(y=0; yknown = WIPEBIT(ptile->known, idx); - ptile->sent = WIPEBIT(ptile->sent, idx); - ptile->assigned = WIPEBIT(ptile->assigned, idx); - } - } } diff -Nur -X/home/thue/freeciv-dev/freeciv/diff_ignore freeciv/server/stdinhand.c workdir/server/stdinhand.c --- freeciv/server/stdinhand.c Wed May 31 14:34:54 2000 +++ workdir/server/stdinhand.c Wed May 31 19:48:31 2000 @@ -1506,6 +1506,13 @@ return; } + if (!(game.is_new_game && (server_state==PRE_GAME_STATE || + server_state==SELECT_RACES_STATE))) { + cmd_reply(CMD_REMOVE, caller, C_FAIL, + _("Players cannot be removed once the game has started")); + return; + } + sz_strlcpy(name, pplayer->name); server_remove_player(pplayer); cmd_reply(CMD_REMOVE, caller, C_OK,