Index: common/game.c =================================================================== RCS file: /home/freeciv/CVS/freeciv/common/game.c,v retrieving revision 1.155 diff -u -r1.155 game.c --- common/game.c 2003/01/09 02:36:37 1.155 +++ common/game.c 2003/01/27 22:35:53 @@ -656,6 +656,8 @@ game.pingtimeout = GAME_DEFAULT_PINGTIMEOUT; game.pingtime = GAME_DEFAULT_PINGTIME; game.end_year = GAME_DEFAULT_END_YEAR; + game.end_tech_id = GAME_DEFAULT_END_TECH_ID; + sz_strlcpy(game.end_tech,""); game.year = GAME_START_YEAR; game.turn = 0; game.min_players = GAME_DEFAULT_MIN_PLAYERS; Index: common/game.h =================================================================== RCS file: /home/freeciv/CVS/freeciv/common/game.h,v retrieving revision 1.118 diff -u -r1.118 game.h --- common/game.h 2003/01/05 23:24:52 1.118 +++ common/game.h 2003/01/27 22:35:53 @@ -75,6 +75,8 @@ int pingtime; time_t turn_start; int end_year; + char end_tech[MAX_LEN_NAME]; + Tech_Type_id end_tech_id; int year; int turn; int researchcost; /* Multiplier on cost of new research */ @@ -289,6 +291,8 @@ #define GAME_DEFAULT_END_YEAR 2000 #define GAME_MIN_END_YEAR GAME_START_YEAR #define GAME_MAX_END_YEAR 5000 + +#define GAME_DEFAULT_END_TECH_ID A_UNSET #define GAME_DEFAULT_MIN_PLAYERS 1 #define GAME_MIN_MIN_PLAYERS 1 Index: server/savegame.c =================================================================== RCS file: /home/freeciv/CVS/freeciv/server/savegame.c,v retrieving revision 1.105 diff -u -r1.105 savegame.c --- server/savegame.c 2003/01/16 18:23:36 1.105 +++ server/savegame.c 2003/01/27 22:35:54 @@ -1774,6 +1774,10 @@ secfile_lookup_int_default(file, 1, "game.timeoutcounter"); game.end_year = secfile_lookup_int(file, "game.end_year"); + game.end_tech_id = + secfile_lookup_int_default(file, GAME_DEFAULT_END_TECH_ID, + "game.end_tech_id"); + game.researchcost = secfile_lookup_int_default(file, 0, "game.researchcost"); if (game.researchcost == 0) game.researchcost = secfile_lookup_int(file, "game.techlevel"); @@ -2163,6 +2167,7 @@ secfile_insert_int(file, game.timeoutincmult, "game.timeoutincmult"); secfile_insert_int(file, game.timeoutcounter, "game.timeoutcounter"); secfile_insert_int(file, game.end_year, "game.end_year"); + secfile_insert_int(file, game.end_tech_id, "game.end_tech_id"); secfile_insert_int(file, game.year, "game.year"); secfile_insert_int(file, game.turn, "game.turn"); secfile_insert_int(file, game.researchcost, "game.researchcost"); Index: server/srv_main.c =================================================================== RCS file: /home/freeciv/CVS/freeciv/server/srv_main.c,v retrieving revision 1.112 diff -u -r1.112 srv_main.c --- server/srv_main.c 2003/01/05 23:24:52 1.112 +++ server/srv_main.c 2003/01/27 22:35:55 @@ -204,6 +204,17 @@ return TRUE; } + /* we end the game after someone has the tech from tech_end */ + players_iterate(pplayer) { + /* tech??? */ + if ((game.end_tech_id >= 0) && + (base_total_bulbs_required(pplayer,game.end_tech_id) <= 0)) + { + freelog(LOG_ERROR,"Endyear: %d, %d",game.year, game.end_tech_id); + return TRUE; + } + } players_iterate_end; + /* count barbarians */ players_iterate(pplayer) { if (is_barbarian(pplayer)) { @@ -2111,6 +2122,16 @@ } players_iterate_end; } + /* Because we can't lookup this before the game has been started we do it + * here */ + game.end_tech_id = find_tech_by_name(game.end_tech); + if (game.end_tech_id == A_LAST) { + game.end_tech_id = A_UNSET; + } + if (game.end_tech_id != A_UNSET) { + sz_strlcpy(game.end_tech,get_tech_name(NULL,game.end_tech_id)); + } + /* We want to reset the timer as late as possible but before the info is * sent to the clients */ game.turn_start = time(NULL); Index: server/stdinhand.c =================================================================== RCS file: /home/freeciv/CVS/freeciv/server/stdinhand.c,v retrieving revision 1.270 diff -u -r1.270 stdinhand.c --- server/stdinhand.c 2003/01/20 15:44:28 1.270 +++ server/stdinhand.c 2003/01/27 22:35:57 @@ -691,7 +691,11 @@ GEN_INT("endyear", game.end_year, SSET_META, SSET_TO_CLIENT, N_("Year the game ends"), "", NULL, GAME_MIN_END_YEAR, GAME_MAX_END_YEAR, GAME_DEFAULT_END_YEAR) - +/* + GEN_INT("endtechid", game.end_tech_id, SSET_META, SSET_TO_CLIENT, + N_("Tech with that the game ends"), "", + NULL, A_UNSET, A_LAST, GAME_DEFAULT_END_TECH_ID) +*/ #ifndef NDEBUG GEN_INT( "timeout", game.timeout, SSET_META, SSET_TO_CLIENT, N_("Maximum seconds per turn"), @@ -959,6 +963,7 @@ CMD_METAINFO, CMD_METACONN, CMD_METASERVER, + CMD_ENDTECH, CMD_AITOGGLE, CMD_CREATE, CMD_EASY, @@ -1124,6 +1129,12 @@ N_("metaserver
"), N_("Set address for metaserver to report to."), NULL }, + {"endtech",ALLOW_CTRL, + /* TRANS: translate text between <> only */ + N_("endtech techname"), + N_("Set the tech with that the game will end.\n" + "It must be written like the Rulesettechname."), NULL + }, {"aitoggle", ALLOW_CTRL, /* TRANS: translate text between <> only */ N_("aitoggle "), @@ -1740,6 +1751,28 @@ } /************************************************************************** +This function gets the Name of a written tech. +Only works after the game has been started. +**************************************************************************/ +static void set_end_tech(struct connection *caller, char *arg) +{ + sz_strlcpy(game.end_tech, arg); + game.end_tech_id = find_tech_by_name(game.end_tech); + freelog(LOG_VERBOSE,"Endtech_id %d from %s",game.end_tech_id, game.end_tech); + if (game.end_tech_id == A_LAST) { + game.end_tech_id = A_UNSET; + } + if (game.end_tech_id != A_UNSET) { + sz_strlcpy(game.end_tech,get_tech_name(NULL,game.end_tech_id)); + cmd_reply(CMD_ENDTECH, caller, C_OK, + _("Endtech set to: %s."), game.end_tech); + } else { + cmd_reply(CMD_ENDTECH, caller, C_OK, + _("Error finding endtech: %s. (Could be because techs.ruleset isn't loaded already)"), game.end_tech); + } +} + +/************************************************************************** ... **************************************************************************/ static void create_ai_player(struct connection *caller, char *arg) @@ -3195,6 +3228,9 @@ break; case CMD_LIST: show_list(caller, arg); + break; + case CMD_ENDTECH: + set_end_tech(caller, arg); break; case CMD_AITOGGLE: toggle_ai_player(caller,arg);