<URL: http://bugs.freeciv.org/Ticket/Display.html?id=39876 >
Committed S2_1 revision 13993. Found S2_1 patch in PR#15609, ported for S2_2. Committed S2_2 revision 13994. Committed trunk revision 13995.
Index: server/srv_main.c =================================================================== --- server/srv_main.c (revision 13993) +++ server/srv_main.c (working copy) @@ -2116,13 +2116,22 @@ /* Free all the treaties that were left open when game finished. */ free_treaties(); + /* Free the vision data, without sending updates. */ players_iterate(pplayer) { unit_list_iterate(pplayer->units, punit) { + /* don't bother using vision_clear_sight() */ + vision_layer_iterate(v) { + punit->server.vision->radius_sq[v] = -1; + } vision_layer_iterate_end; vision_free(punit->server.vision); punit->server.vision = NULL; } unit_list_iterate_end; city_list_iterate(pplayer->cities, pcity) { + /* don't bother using vision_clear_sight() */ + vision_layer_iterate(v) { + pcity->server.vision->radius_sq[v] = -1; + } vision_layer_iterate_end; vision_free(pcity->server.vision); pcity->server.vision = NULL; } city_list_iterate_end; Index: server/savegame.c =================================================================== --- server/savegame.c (revision 13993) +++ server/savegame.c (working copy) @@ -140,46 +140,40 @@ * we let any map data type to be empty, and just print an * informative warning message about it. */ -#define LOAD_MAP_DATA(ch, nat_y, ptile, \ - SECFILE_LOOKUP_LINE, SET_XY_CHAR) \ -{ \ - int _nat_x, _nat_y; \ - \ - bool _warning_printed = FALSE; \ - for (_nat_y = 0; _nat_y < map.ysize; _nat_y++) { \ - const int nat_y = _nat_y; \ - const char *_line = (SECFILE_LOOKUP_LINE); \ - \ - if (!_line || strlen(_line) != map.xsize) { \ - if (!_warning_printed) { \ - /* TRANS: Error message. */ \ - freelog(LOG_ERROR, _("The save file contains incomplete " \ - "map data. This can happen with old saved " \ - "games, or it may indicate an invalid saved " \ - "game file. Proceed at your own risk.")); \ - if(!_line) { \ - /* TRANS: Error message. */ \ - freelog(LOG_ERROR, _("Reason: line not found")); \ - } else { \ - /* TRANS: Error message. */ \ - freelog(LOG_ERROR, _("Reason: line too short " \ - "(expected %d got %lu"), map.xsize, \ - (unsigned long) strlen(_line)); \ - } \ - /* Do not translate.. */ \ - freelog(LOG_ERROR, "secfile_lookup_line='%s'", \ - #SECFILE_LOOKUP_LINE); \ - _warning_printed = TRUE; \ - } \ - continue; \ - } \ - for (_nat_x = 0; _nat_x < map.xsize; _nat_x++) { \ - const char ch = _line[_nat_x]; \ - struct tile *ptile = native_pos_to_tile(_nat_x, _nat_y); \ - \ - (SET_XY_CHAR); \ - } \ - } \ +#define LOAD_MAP_DATA(ch, nat_y, ptile, \ + SECFILE_LOOKUP_LINE, SET_XY_CHAR) \ +{ \ + int _nat_x, _nat_y; \ + bool _printed_warning = FALSE; \ + for (_nat_y = 0; _nat_y < map.ysize; _nat_y++) { \ + const int nat_y = _nat_y; \ + const char *_line = (SECFILE_LOOKUP_LINE); \ + if (NULL == _line) { \ + freelog(LOG_VERBOSE, "Line not found='%s'", \ + #SECFILE_LOOKUP_LINE); \ + _printed_warning = TRUE; \ + continue; \ + } else if (strlen(_line) != map.xsize) { \ + freelog(LOG_VERBOSE, "Line too short (expected %d got %lu)='%s'", \ + map.xsize, (unsigned long) strlen(_line), \ + #SECFILE_LOOKUP_LINE); \ + _printed_warning = TRUE; \ + continue; \ + } \ + for (_nat_x = 0; _nat_x < map.xsize; _nat_x++) { \ + const char ch = _line[_nat_x]; \ + struct tile *ptile = native_pos_to_tile(_nat_x, _nat_y); \ + \ + (SET_XY_CHAR); \ + } \ + } \ + if (_printed_warning) { \ + /* TRANS: Minor error message. */ \ + freelog(LOG_ERROR, \ + _("Saved game contains incomplete map data. This can" \ + " happen with old saved games, or it may indicate an" \ + " invalid saved game file. Proceed at your own risk.")); \ + } \ } /* Iterate on the specials half-bytes */ @@ -2195,8 +2189,7 @@ pcity = create_city_virtual(plr, ptile, secfile_lookup_str(file, "player%d.c%d.name", plrno, i)); - ptile->owner_source = pcity->tile; - tile_set_owner(ptile, city_owner(pcity)); + tile_set_owner(ptile, plr); pcity->id=secfile_lookup_int(file, "player%d.c%d.id", plrno, i); alloc_id(pcity->id); @@ -2539,8 +2532,8 @@ (pcity->ai.founder_want < 0), "player%d.c%d.ai.founder_boat", plrno, i); + /* do after all the set_worker_city() are done. */ tile_set_city(pcity->tile, pcity); - city_list_append(plr->cities, pcity); } @@ -3558,11 +3551,13 @@ int technology_order_size = 0; int civstyle = 0; - game.version = secfile_lookup_int_default(file, 0, "game.version"); - tmp_server_state = (enum server_states) - secfile_lookup_int_default(file, RUN_GAME_STATE, "game.server_state"); + /* [savefile] */ + savefile_options = secfile_lookup_str(file, "savefile.options"); - savefile_options = secfile_lookup_str(file, "savefile.options"); + /* We don't need savefile.reason, but read it anyway to avoid + * warnings about unread secfile entries. */ + secfile_lookup_str_default(file, "None", "savefile.reason"); + if (has_capability("improvement_order", savefile_options)) { improvement_order = secfile_lookup_str_vec(file, &improvement_order_size, "savefile.improvement_order"); @@ -3590,16 +3585,19 @@ } } + /* [game] */ + game.version = secfile_lookup_int_default(file, 0, "game.version"); + /* we require at least version 1.9.0 */ if (10900 > game.version) { + /* TRANS: Fatal error message. */ freelog(LOG_FATAL, - _("Savegame too old, at least version 1.9.0 required.")); + _("Saved game is too old, at least version 1.9.0 required.")); exit(EXIT_FAILURE); } - /* We don't need savefile.reason, but read it anyway to avoid - * warnings about unread secfile entries. */ - secfile_lookup_str_default(file, "None", "savefile.reason"); + tmp_server_state = (enum server_states) + secfile_lookup_int_default(file, RUN_GAME_STATE, "game.server_state"); { set_meta_patches_string(secfile_lookup_str_default(file, @@ -3684,42 +3682,45 @@ game.info.heating = secfile_lookup_int_default(file, 0, "game.heating"); game.info.globalwarming = secfile_lookup_int(file, "game.globalwarming"); game.info.warminglevel = secfile_lookup_int(file, "game.warminglevel"); + game.info.nuclearwinter = secfile_lookup_int_default(file, 0, "game.nuclearwinter"); game.info.cooling = secfile_lookup_int_default(file, 0, "game.cooling"); - game.info.nuclearwinter = secfile_lookup_int_default(file, 0, "game.nuclearwinter"); - game.info.coolinglevel = secfile_lookup_int_default(file, 8, "game.coolinglevel"); - game.info.notradesize = secfile_lookup_int_default(file, 0, "game.notradesize"); - game.info.fulltradesize = secfile_lookup_int_default(file, 1, "game.fulltradesize"); - game.info.angrycitizen = secfile_lookup_bool_default(file, FALSE, "game.angrycitizen"); + game.info.coolinglevel = secfile_lookup_int_default(file, 8, "game.coolinglevel"); + game.info.notradesize = + secfile_lookup_int_default(file, GAME_DEFAULT_NOTRADESIZE, "game.notradesize"); + game.info.fulltradesize = + secfile_lookup_int_default(file, GAME_DEFAULT_FULLTRADESIZE, "game.fulltradesize"); + game.info.angrycitizen = + secfile_lookup_bool_default(file, GAME_DEFAULT_ANGRYCITIZEN, "game.angrycitizen"); + game.info.citymindist = + secfile_lookup_int_default(file, GAME_DEFAULT_CITYMINDIST, "game.citymindist"); + game.info.rapturedelay = + secfile_lookup_int_default(file, GAME_DEFAULT_RAPTUREDELAY, "game.rapturedelay"); + game.info.diplcost = + secfile_lookup_int_default(file, GAME_DEFAULT_DIPLCOST, "game.diplcost"); + game.info.freecost = + secfile_lookup_int_default(file, GAME_DEFAULT_FREECOST, "game.freecost"); + game.info.conquercost = + secfile_lookup_int_default(file, GAME_DEFAULT_CONQUERCOST, "game.conquercost"); - if (game.version >= 10100) { - game.info.diplcost = secfile_lookup_int(file, "game.diplcost"); - game.info.freecost = secfile_lookup_int(file, "game.freecost"); - game.info.conquercost = secfile_lookup_int(file, "game.conquercost"); - game.info.foodbox - = secfile_lookup_int_default(file, 0, "game.box_food"); - if (game.info.foodbox == 0) { - /* foodbox was used for 2.0 and earlier servers. */ - game.info.foodbox = 10 * secfile_lookup_int(file, "game.foodbox"); - } - game.info.techpenalty = secfile_lookup_int(file, "game.techpenalty"); - game.info.razechance = secfile_lookup_int(file, "game.razechance"); - - /* suppress warnings about unused entries in old savegames: */ - (void) section_file_lookup(file, "game.rail_food"); - (void) section_file_lookup(file, "game.rail_prod"); - (void) section_file_lookup(file, "game.rail_trade"); - (void) section_file_lookup(file, "game.farmfood"); + game.info.foodbox = secfile_lookup_int_default(file, 0, "game.box_food"); + if (game.info.foodbox == 0) { + /* foodbox was used for 2.0 and earlier servers. */ + game.info.foodbox = 10 * secfile_lookup_int_default(file, 100, "game.foodbox"); } - if (game.version >= 10300) { - civstyle = secfile_lookup_int_default(file, 2, "game.civstyle"); - game.info.save_nturns = secfile_lookup_int(file, "game.save_nturns"); - } + game.info.techpenalty = + secfile_lookup_int_default(file, GAME_DEFAULT_TECHPENALTY, "game.techpenalty"); + game.info.razechance = + secfile_lookup_int_default(file, GAME_DEFAULT_RAZECHANCE, "game.razechance"); - game.info.citymindist = secfile_lookup_int_default(file, - GAME_DEFAULT_CITYMINDIST, "game.citymindist"); + civstyle = secfile_lookup_int_default(file, 2, "game.civstyle"); + game.info.save_nturns = + secfile_lookup_int_default(file, GAME_DEFAULT_SAVETURNS, "game.save_nturns"); - game.info.rapturedelay = secfile_lookup_int_default(file, - GAME_DEFAULT_RAPTUREDELAY, "game.rapturedelay"); + /* suppress warnings about unused entries in old savegames: */ + (void) section_file_lookup(file, "game.rail_food"); + (void) section_file_lookup(file, "game.rail_prod"); + (void) section_file_lookup(file, "game.rail_trade"); + (void) section_file_lookup(file, "game.farmfood"); /* National borders setting. */ game.info.borders = secfile_lookup_int_default(file, 0, "game.borders"); @@ -3810,8 +3811,9 @@ if (strcmp("classic", secfile_lookup_str_default(file, "default", "game.info.t.terrain")) == 0) { - freelog(LOG_FATAL, _("The savegame uses the classic terrain " - "ruleset which is no longer supported.")); + /* TRANS: Fatal error message. */ + freelog(LOG_FATAL, _("Saved game uses the \"classic\" terrain" + " ruleset, and is no longer supported.")); exit(EXIT_FAILURE); } @@ -3864,7 +3866,7 @@ script_state_load(file); { - if (game.version >= 10300) { + { { if (!has_capability("startunits", savefile_options)) { int settlers = secfile_lookup_int(file, "game.settlers"); @@ -3985,7 +3987,10 @@ map_load(file, special_order); - if (!game.info.is_new_game) { + if (game.info.is_new_game) { + /* override previous load */ + game.info.nplayers = 0; + } else { /* destroyed wonders: */ string = secfile_lookup_str_default(file, NULL, "game.destroyed_wonders_new"); @@ -4035,13 +4040,16 @@ improvement_order_size, technology_order, technology_order_size); } players_iterate_end; + + /* Some players may have invalid nations in the ruleset. Once all + * players are loaded, pick one of the remaining nations for them. + */ players_iterate(pplayer) { - /* Some players may have invalid nations in the ruleset. Pick new - * nations for them. */ if (pplayer->nation == NO_NATION_SELECTED) { player_set_nation(pplayer, pick_a_nation(NULL, FALSE, TRUE, NOT_A_BARBARIAN)); - freelog(LOG_ERROR, "%s had invalid nation; changing to %s.", + /* TRANS: Minor error message. */ + freelog(LOG_ERROR, _("%s had invalid nation; changing to %s."), pplayer->name, nation_rule_name(nation_of_player(pplayer))); } @@ -4062,6 +4070,7 @@ && pplayers_allied(plr, aplayer) && pplayer_can_make_treaty(plr, aplayer, DS_ALLIANCE) == DIPL_ALLIANCE_PROBLEM) { + /* TRANS: Minor error message. */ freelog(LOG_ERROR, _("Illegal alliance structure detected: " "%s's alliance to %s reduced to peace treaty."), plr->name, aplayer->name); @@ -4092,6 +4101,7 @@ pplayer->really_gives_vision = 0; pplayer->gives_shared_vision = 0; } players_iterate_end; + players_iterate(pplayer) { char *vision; int plrno = player_number(pplayer); @@ -4124,8 +4134,6 @@ check_city(pcity); } city_list_iterate_end; } players_iterate_end; - } else { - game.info.nplayers = 0; } if (secfile_lookup_int_default(file, -1, @@ -4206,25 +4214,7 @@ char temp[B_LAST+1]; const char *user_message; - version = MAJOR_VERSION *10000 + MINOR_VERSION *100 + PATCH_VERSION; - secfile_insert_int(file, version, "game.version"); - - /* Game state: once the game is no longer a new game (ie, has been - * started the first time), it should always be considered a running - * game for savegame purposes: - */ - secfile_insert_int(file, (int) (game.info.is_new_game ? server_state : - RUN_GAME_STATE), "game.server_state"); - - secfile_insert_str(file, get_meta_patches_string(), "game.metapatches"); - secfile_insert_bool(file, game.meta_info.user_message_set, - "game.user_metamessage"); - user_message = get_user_meta_message_string(); - if (user_message != NULL) { - secfile_insert_str(file, user_message, "game.metamessage"); - } - secfile_insert_str(file, meta_addr_port(), "game.metaserver"); - + /* [savefile] */ sz_strlcpy(options, SAVEFILE_OPTIONS); if (game.info.is_new_game) { if (map.num_start_positions>0) { @@ -4239,6 +4229,7 @@ } secfile_insert_str(file, options, "savefile.options"); secfile_insert_str(file, save_reason, "savefile.reason"); + /* Save improvement order in savegame, so we are not dependent on * ruleset order. * If the game isn't started improvements aren't loaded @@ -4280,7 +4271,27 @@ free(modname); } + /* [game] */ + version = MAJOR_VERSION *10000 + MINOR_VERSION *100 + PATCH_VERSION; + secfile_insert_int(file, version, "game.version"); + + /* Game state: once the game is no longer a new game (ie, has been + * started the first time), it should always be considered a running + * game for savegame purposes: + */ + secfile_insert_int(file, (int) (game.info.is_new_game ? server_state : + RUN_GAME_STATE), "game.server_state"); + secfile_insert_str(file, get_meta_patches_string(), "game.metapatches"); + secfile_insert_bool(file, game.meta_info.user_message_set, + "game.user_metamessage"); + user_message = get_user_meta_message_string(); + if (user_message != NULL) { + secfile_insert_str(file, user_message, "game.metamessage"); + } + secfile_insert_str(file, meta_addr_port(), "game.metaserver"); + + secfile_insert_int(file, game.info.gold, "game.gold"); secfile_insert_int(file, game.info.tech, "game.tech"); secfile_insert_int(file, game.info.skill_level, "game.skill_level"); @@ -4358,18 +4369,7 @@ secfile_insert_int(file, game.info.diplomacy, "game.diplomacy"); secfile_insert_int(file, game.info.allowed_city_names, "game.allowed_city_names"); - /* old (1.14.1) servers need to have these server variables. The values - * don't matter, though. */ - secfile_insert_int(file, 2, "game.settlers"); - secfile_insert_int(file, 1, "game.explorer"); - secfile_insert_int(file, 30, "map.mountains"); - secfile_insert_int(file, 35, "map.grass"); - secfile_insert_int(file, 5, "map.swampsize"); - secfile_insert_int(file, 5, "map.deserts"); - secfile_insert_int(file, 5, "map.riverlength"); - secfile_insert_int(file, 20, "map.forestsize"); - - if (TRUE) { + { /* Now always save these, so the server options reflect the * actual values used at the start of the game. * The first two used to be saved as "map.xsize" and "map.ysize"
_______________________________________________ Freeciv-dev mailing list Freeciv-dev@gna.org https://mail.gna.org/listinfo/freeciv-dev