? dead-player1.diff Index: server/plrhand.c =================================================================== RCS file: /home/freeciv/CVS/freeciv/server/plrhand.c,v retrieving revision 1.246 diff -u -r1.246 plrhand.c --- server/plrhand.c 2002/10/09 14:10:17 1.246 +++ server/plrhand.c 2002/10/12 21:21:01 @@ -1639,6 +1639,81 @@ return cplayer; } +/********************************************************************** +This function creates a dead player after the game has started. + - Thomas Strub +***********************************************************************/ +struct player *dead_player(char *name) +{ + int *nations_used, i, num_nations_avail=game.playable_nation_count, pick; + int newplayer = game.nplayers; + struct player *cplayer = &game.players[newplayer]; + + nations_used = fc_calloc(game.playable_nation_count,sizeof(int)); + + /* make a new player */ + + server_player_init(cplayer, TRUE); + + /* select a nation for the dead player. */ + + for(i=0; ination < game.playable_nation_count) { + nations_used[other_player->nation] = -1; + num_nations_avail--; + } + } players_iterate_end; + + pick = myrand(num_nations_avail); + + for(i=0; ination = nations_used[i]; + free(nations_used); + nations_used = NULL; + + /* Name the new player name */ + + sz_strlcpy(cplayer->name, name); + sz_strlcpy(cplayer->username, name); + + cplayer->is_connected = FALSE; + cplayer->capital = TRUE; + + cplayer->turn_done = TRUE; /* Have other things to think about - paralysis*/ + cplayer->embassy = 0; /* no embassys */ + + /* Create the dead under human control */ + + cplayer->ai.control = FALSE; + + /* The player is dead */ + + cplayer->is_alive = FALSE; + map_know_and_see_all(cplayer); + + /* increase the number of players */ + + game.nplayers++; + game.max_players = game.nplayers; + + /* So that clients get the correct game.nplayers: */ + send_game_info(NULL); + + /* Sending the other players the new player */ + send_player_info(cplayer, NULL); + + return cplayer; +} + /********************************************************************** civil_war_triggered: * The capture of a capital is not a sure fire way to throw Index: server/plrhand.h =================================================================== RCS file: /home/freeciv/CVS/freeciv/server/plrhand.h,v retrieving revision 1.50 diff -u -r1.50 plrhand.h --- server/plrhand.h 2002/10/09 20:54:20 1.50 +++ server/plrhand.h 2002/10/12 21:21:01 @@ -98,6 +98,7 @@ bool civil_war_triggered(struct player *pplayer); void civil_war(struct player *pplayer); struct player *split_player(struct player *pplayer); +struct player *dead_player(char *arg); enum plr_info_level player_info_level(struct player *plr, struct player *receiver); Index: server/stdinhand.c =================================================================== RCS file: /home/freeciv/CVS/freeciv/server/stdinhand.c,v retrieving revision 1.256 diff -u -r1.256 stdinhand.c --- server/stdinhand.c 2002/10/11 22:11:04 1.256 +++ server/stdinhand.c 2002/10/12 21:21:03 @@ -955,6 +955,7 @@ CMD_METASERVER, CMD_AITOGGLE, CMD_CREATE, + CMD_DEAD, CMD_EASY, CMD_NORMAL, CMD_HARD, @@ -1121,6 +1122,13 @@ N_("The 'create' command is only available before the game has " "been started.") }, + {"dead", ALLOW_CTRL, + /* TRANS: translate text between <> only */ + N_("dead "), + N_("Create a dead \"player\" with a given name."), + N_("The 'dead' command is only working after the game has " + "been started.") + }, {"easy", ALLOW_CTRL, /* TRANS: translate text between <> only */ N_("easy\n" @@ -1778,7 +1786,65 @@ set_ai_level_directer(pplayer, game.skill_level); } +/************************************************************************** +... +**************************************************************************/ +static void create_dead(struct connection *caller, char *arg) +{ + struct player *pplayer; + PlayerNameStatus PNameStatus; + + if ((PNameStatus = test_player_name(arg)) == PNameEmpty) + { + cmd_reply(CMD_DEAD, caller, C_SYNTAX, _("Can't use an empty name.")); + return; + } + + if (PNameStatus == PNameTooLong) + { + cmd_reply(CMD_DEAD, caller, C_SYNTAX, + _("That name exceeds the maximum of %d chars."), MAX_LEN_NAME-1); + return; + } + if ((find_player_by_user(arg))) + { + cmd_reply(CMD_DEAD, caller, C_BOUNCE, + _("A connection with that name already exists.")); + return; + } + + if ((pplayer=find_player_by_name(arg))) + { + cmd_reply(CMD_DEAD, caller, C_BOUNCE, + _("A player already exists by that name.")); + return; + } + + /* This creates the dead player after the game has started */ + if (!(game.is_new_game && (server_state==PRE_GAME_STATE || + server_state==SELECT_RACES_STATE))) + { + pplayer = dead_player(arg); + } else { + /* no idea how to create a dead player before starting the game */ + } + + if (!pplayer) + { + cmd_reply(CMD_DEAD, caller, C_FAIL, + _("Error creating new dead player: %s."), arg); + return; + } + + cmd_reply(CMD_DEAD, caller, C_OK, + _("%s as new dead player created."), pplayer->name); + + + freelog(LOG_DEBUG, "create dead player: %s", arg); + return; +} + /************************************************************************** ... **************************************************************************/ @@ -3120,6 +3186,9 @@ break; case CMD_CREATE: create_ai_player(caller,arg); + break; + case CMD_DEAD: + create_dead(caller,arg); break; case CMD_EASY: set_ai_level(caller, arg, 3);