Author: cazfi Date: Sat Nov 21 11:12:36 2015 New Revision: 30726 URL: http://svn.gna.org/viewcvs/freeciv?rev=30726&view=rev Log: Load terrains using terrain mapping in savegame.
See patch #6607 Modified: trunk/common/terrain.h trunk/server/savecompat.c trunk/server/savegame2.c trunk/server/savegame3.c Modified: trunk/common/terrain.h URL: http://svn.gna.org/viewcvs/freeciv/trunk/common/terrain.h?rev=30726&r1=30725&r2=30726&view=diff ============================================================================== --- trunk/common/terrain.h (original) +++ trunk/common/terrain.h Sat Nov 21 11:12:36 2015 @@ -177,7 +177,9 @@ char graphic_str[MAX_LEN_NAME]; /* add tile_ prefix */ char graphic_alt[MAX_LEN_NAME]; - char identifier; /* Single-character identifier used in savegames. */ + char identifier; /* Single-character identifier used in games saved. */ + char identifier_load; /* Single-character identifier that was used in the savegame + * loaded. */ #define TERRAIN_UNKNOWN_IDENTIFIER 'u' Modified: trunk/server/savecompat.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/savecompat.c?rev=30726&r1=30725&r2=30726&view=diff ============================================================================== --- trunk/server/savecompat.c (original) +++ trunk/server/savecompat.c Sat Nov 21 11:12:36 2015 @@ -602,11 +602,24 @@ int plrno; bool team_pooled_research = GAME_DEFAULT_TEAM_POOLED_RESEARCH; int tsize; + int ti; /* Check status and return if not OK (sg_success != TRUE). */ sg_check_ret(); log_debug("Upgrading data from savegame to version 2.6.0"); + + /* Terrain mapping table - use current ruleset as we have no way to know + * any other old values. */ + ti = 0; + terrain_type_iterate(pterr) { + char buf[2]; + + secfile_insert_str(loading->file, terrain_rule_name(pterr), "savefile.terrident%d.name", ti); + buf[0] = terrain_identifier(pterr); + buf[1] = '\0'; + secfile_insert_str(loading->file, buf, "savefile.terrident%d.identifier", ti++); + } terrain_type_iterate_end; /* Server setting migration. */ { Modified: trunk/server/savegame2.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/savegame2.c?rev=30726&r1=30725&r2=30726&view=diff ============================================================================== --- trunk/server/savegame2.c (original) +++ trunk/server/savegame2.c Sat Nov 21 11:12:36 2015 @@ -1134,6 +1134,9 @@ ****************************************************************************/ static void sg_load_savefile(struct loaddata *loading) { + int i; + const char *terr_name; + /* Check status and return if not OK (sg_success != TRUE). */ sg_check_ret(); @@ -1406,6 +1409,43 @@ free(modname); } + + terrain_type_iterate(pterr) { + pterr->identifier_load = '\0'; + } terrain_type_iterate_end; + + i = 0; + while ((terr_name = secfile_lookup_str_default(loading->file, NULL, + "savefile.terrident%d.name", i)) != NULL) { + struct terrain *pterr = terrain_by_rule_name(terr_name); + + if (pterr != NULL) { + const char *iptr = secfile_lookup_str_default(loading->file, NULL, + "savefile.terrident%d.identifier", i); + + pterr->identifier_load = *iptr; + } else { + log_error("Identifier for unknown terrain type %s.", terr_name); + } + i++; + } + + terrain_type_iterate(pterr) { + if (pterr->identifier_load == '\0') { + /* Use the current identifier for unknown ones. */ + pterr->identifier_load = pterr->identifier; + } + } terrain_type_iterate_end; + + terrain_type_iterate(pterr) { + terrain_type_iterate(pterr2) { + if (pterr != pterr2) { + sg_failure_ret((pterr->identifier_load != pterr2->identifier_load), + "%s and %s share a saved identifier", + terrain_rule_name(pterr), terrain_rule_name(pterr2)); + } + } terrain_type_iterate_end; + } terrain_type_iterate_end; } /* ======================================================================= Modified: trunk/server/savegame3.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/savegame3.c?rev=30726&r1=30725&r2=30726&view=diff ============================================================================== --- trunk/server/savegame3.c (original) +++ trunk/server/savegame3.c Sat Nov 21 11:12:36 2015 @@ -1226,7 +1226,7 @@ return T_UNKNOWN; } terrain_type_iterate(pterrain) { - if (pterrain->identifier == ch) { + if (pterrain->identifier_load == ch) { return pterrain; } } terrain_type_iterate_end; @@ -1327,6 +1327,9 @@ ****************************************************************************/ static void sg_load_savefile(struct loaddata *loading) { + int i; + const char *terr_name; + /* Check status and return if not OK (sg_success != TRUE). */ sg_check_ret(); @@ -1484,6 +1487,43 @@ loading->specialist.order[j] = NULL; } } + + terrain_type_iterate(pterr) { + pterr->identifier_load = '\0'; + } terrain_type_iterate_end; + + i = 0; + while ((terr_name = secfile_lookup_str_default(loading->file, NULL, + "savefile.terrident%d.name", i)) != NULL) { + struct terrain *pterr = terrain_by_rule_name(terr_name); + + if (pterr != NULL) { + const char *iptr = secfile_lookup_str_default(loading->file, NULL, + "savefile.terrident%d.identifier", i); + + pterr->identifier_load = *iptr; + } else { + log_error("Identifier for unknown terrain type %s.", terr_name); + } + i++; + } + + terrain_type_iterate(pterr) { + if (pterr->identifier_load == '\0') { + /* Use the current identifier for unknown ones. */ + pterr->identifier_load = pterr->identifier; + } + } terrain_type_iterate_end; + + terrain_type_iterate(pterr) { + terrain_type_iterate(pterr2) { + if (pterr != pterr2) { + sg_failure_ret((pterr->identifier_load != pterr2->identifier_load), + "%s and %s share a saved identifier", + terrain_rule_name(pterr), terrain_rule_name(pterr2)); + } + } terrain_type_iterate_end; + } terrain_type_iterate_end; } /**************************************************************************** _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits