Index: common/nation.c =================================================================== RCS file: /home/freeciv/CVS/freeciv/common/nation.c,v retrieving revision 1.25 diff -u -r1.25 nation.c --- common/nation.c 2002/08/07 11:21:47 1.25 +++ common/nation.c 2002/11/02 03:03:52 @@ -201,6 +201,7 @@ } nation_city_names_free(p->city_names); + p->city_names = NULL; } /*************************************************************** Index: server/sernet.c =================================================================== RCS file: /home/freeciv/CVS/freeciv/server/sernet.c,v retrieving revision 1.96 diff -u -r1.96 sernet.c --- server/sernet.c 2002/10/18 09:58:49 1.96 +++ server/sernet.c 2002/11/02 03:03:52 @@ -362,8 +362,7 @@ return 2; } - - /* quit server if no players for 'srvarg.quitidle' seconds */ + /* end server if no players for 'srvarg.quitidle' seconds */ if (srvarg.quitidle != 0 && server_state != PRE_GAME_STATE) { static time_t last_noplayers; if(conn_list_size(&game.est_connections) == 0) { @@ -374,8 +373,11 @@ freelog(LOG_NORMAL, srvarg.metaserver_info_line); (void) send_server_info_to_metaserver(TRUE, FALSE); - close_connections_and_socket(); - exit(EXIT_SUCCESS); + server_state = GAME_OVER_STATE; + conn_list_iterate(game.est_connections, pconn) { + lost_connection_to_client(pconn); + close_connection(pconn); + } conn_list_iterate_end; } } else { last_noplayers = time(NULL); Index: server/srv_main.c =================================================================== RCS file: /home/freeciv/CVS/freeciv/server/srv_main.c,v retrieving revision 1.99 diff -u -r1.99 srv_main.c --- server/srv_main.c 2002/11/02 00:42:56 1.99 +++ server/srv_main.c 2002/11/02 03:03:52 @@ -1781,8 +1781,9 @@ conn_list_do_unbuffer(&game.game_connections); - if (is_game_over()) + if (is_game_over()) { server_state=GAME_OVER_STATE; + } } /* @@ -1792,67 +1793,20 @@ } /************************************************************************** - Server initialization. + Server loop, run to set up one game. **************************************************************************/ -void srv_main(void) +static void srv_loop(void) { int i; - /* make sure it's initialized */ - if (!has_been_srv_init) { - srv_init(); - } - - my_init_network(); - - con_log_init(srvarg.log_filename, srvarg.loglevel); - gamelog_init(srvarg.gamelog_filename); - gamelog_set_level(GAMELOG_FULL); - gamelog(GAMELOG_NORMAL, _("Starting new log")); - -#if IS_BETA_VERSION - con_puts(C_COMMENT, ""); - con_puts(C_COMMENT, beta_message()); - con_puts(C_COMMENT, ""); -#endif - - con_flush(); - - game_init(); - - /* init network */ - init_connections(); - server_open_socket(); - - /* load a saved game */ - if (srvarg.load_filename) { - load_command(NULL, srvarg.load_filename); - } - - if(!(srvarg.metaserver_no_send)) { - freelog(LOG_NORMAL, _("Sending info to metaserver [%s]"), - meta_addr_port()); - server_open_udp(); /* open socket for meta server */ - } - - (void) send_server_info_to_metaserver(TRUE, FALSE); - - /* accept new players, wait for serverop to start..*/ - server_state=PRE_GAME_STATE; - - /* load a script file */ - if (srvarg.script_filename - && !read_init_script(NULL, srvarg.script_filename)) { - exit(EXIT_FAILURE); - } - freelog(LOG_NORMAL, _("Now accepting new client connections.")); - while(server_state==PRE_GAME_STATE) + while(server_state == PRE_GAME_STATE) { sniff_packets(); /* Accepting commands. */ + } (void) send_server_info_to_metaserver(TRUE, FALSE); - if(game.is_new_game) { + if (game.is_new_game) { load_rulesets(); /* otherwise rulesets were loaded when savegame was loaded */ } @@ -1865,9 +1819,9 @@ send_rulesets(&game.est_connections); num_nations_avail = game.playable_nation_count; - for(i=0; i 0) { - server_state=RUN_GAME_STATE; + server_state = RUN_GAME_STATE; } else { con_write(C_COMMENT, _("Last player has disconnected: will need to restart.")); - server_state=PRE_GAME_STATE; - while(server_state==PRE_GAME_STATE) { + server_state = PRE_GAME_STATE; + while(server_state == PRE_GAME_STATE) { sniff_packets(); } goto main_start_players; @@ -1917,25 +1871,27 @@ } } - if(game.randseed == 0) { + if (game.randseed == 0) { /* We strip the high bit for now because neither game file nor server options can handle unsigned ints yet. - Cedric */ game.randseed = time(NULL) & (MAX_UINT32 >> 1); } - - if(!myrand_is_init()) + + if (!myrand_is_init()) { mysrand(game.randseed); + } -#ifdef TEST_RANDOM /* not defined anywhere, set it if you want it */ +#ifdef TEST_RANDOM /* not defined anywhere, set it if you want it */ test_random1(200); test_random1(2000); test_random1(20000); test_random1(200000); #endif - - if(game.is_new_game) + + if (game.is_new_game) { generate_ai_players(); - + } + /* if we have a tile map, and map.generator==0, call map_fractal_generate anyway, to make the specials and huts */ if(map_is_empty() || (map.generator == 0 && game.is_new_game)) @@ -1949,7 +1905,7 @@ gamelog_map(); /* start the game */ - server_state=RUN_GAME_STATE; + server_state = RUN_GAME_STATE; (void) send_server_info_to_metaserver(TRUE, FALSE); if(game.is_new_game) { @@ -1960,13 +1916,13 @@ player_map_allocate(pplayer); init_tech(pplayer, game.tech); player_limit_to_government_rates(pplayer); - pplayer->economic.gold=game.gold; + pplayer->economic.gold = game.gold; } players_iterate_end; - game.max_players=game.nplayers; + game.max_players = game.nplayers; /* we don't want random start positions in a scenario which already - provides them. -- Gudy */ - if(map.num_start_positions==0) { + provides them. -- Gudy */ + if (map.num_start_positions == 0) { create_start_positions(); } } @@ -1992,8 +1948,9 @@ send_all_info(&game.game_connections); lsend_packet_generic_empty(&game.est_connections, PACKET_THAW_HINT); - if(game.is_new_game) + if (game.is_new_game) { init_new_game(); + } game.is_new_game = FALSE; @@ -2001,22 +1958,89 @@ /*** Where the action is. ***/ main_loop(); +} - send_game_state(&game.est_connections, CLIENT_GAME_OVER_STATE); +/************************************************************************** + Server initialization. +**************************************************************************/ +void srv_main(void) +{ + /* make sure it's initialized */ + if (!has_been_srv_init) { + srv_init(); + } - report_scores(TRUE); - show_map_to_all(); - notify_player(NULL, _("Game: The game is over...")); - gamelog(GAMELOG_NORMAL, _("The game is over!")); - if (game.save_nturns > 0) save_game_auto(); + my_init_network(); - while (server_state == GAME_OVER_STATE) { - force_end_of_sniff = FALSE; - sniff_packets(); + con_log_init(srvarg.log_filename, srvarg.loglevel); + gamelog_init(srvarg.gamelog_filename); + gamelog_set_level(GAMELOG_FULL); + gamelog(GAMELOG_NORMAL, _("Starting new log")); + +#if IS_BETA_VERSION + con_puts(C_COMMENT, ""); + con_puts(C_COMMENT, beta_message()); + con_puts(C_COMMENT, ""); +#endif + + con_flush(); + + game_init(); + + /* init network */ + init_connections(); + server_open_socket(); + + /* load a saved game */ + if (srvarg.load_filename) { + load_command(NULL, srvarg.load_filename); + } + + if(!(srvarg.metaserver_no_send)) { + freelog(LOG_NORMAL, _("Sending info to metaserver [%s]"), + meta_addr_port()); + server_open_udp(); /* open socket for meta server */ + } + + (void) send_server_info_to_metaserver(TRUE, FALSE); + + /* load a script file */ + if (srvarg.script_filename + && !read_init_script(NULL, srvarg.script_filename)) { + exit(EXIT_FAILURE); + } + + /* accept new players, wait for serverop to start..*/ + server_state = PRE_GAME_STATE; + + /* Run server loop */ + while (TRUE) { + srv_loop(); + + send_game_state(&game.est_connections, CLIENT_GAME_OVER_STATE); + report_scores(TRUE); + show_map_to_all(); + notify_player(NULL, _("Game: The game is over...")); + gamelog(GAMELOG_NORMAL, _("The game is over!")); + if (game.save_nturns > 0) { + save_game_auto(); + } + + /* Remain in GAME_OVER_STATE until players log out */ + while (conn_list_size(&game.est_connections) > 0) { + (void) sniff_packets(); + } + + /* Reset server */ + server_game_free(); + game_init(); + game.is_new_game = TRUE; + server_state = PRE_GAME_STATE; } + /* Technically, we won't ever get here... */ + game_free(); close_connections_and_socket(); - server_game_free(); } /************************************************************************** @@ -2029,5 +2053,6 @@ } players_iterate_end; nation_city_names_free(misc_city_names); + misc_city_names = NULL; game_free(); }