Author: sveinung Date: Sat Oct 24 23:33:23 2015 New Revision: 30202 URL: http://svn.gna.org/viewcvs/freeciv?rev=30202&view=rev Log: savegame: use stored diplstate_type order
when loading save games. See patch #6468 Modified: trunk/server/savecompat.c trunk/server/savecompat.h trunk/server/savegame2.c trunk/server/savegame3.c Modified: trunk/server/savecompat.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/savecompat.c?rev=30202&r1=30201&r2=30202&view=diff ============================================================================== --- trunk/server/savecompat.c (original) +++ trunk/server/savecompat.c Sat Oct 24 23:33:23 2015 @@ -1035,6 +1035,27 @@ } secfile_insert_int(loading->file, count, "research.count"); } + + /* Add diplstate type order. */ + secfile_insert_int(loading->file, DS_LAST, + "savefile.diplstate_type_size"); + if (DS_LAST > 0) { + const char **modname; + int i; + int j; + + i = 0; + modname = fc_calloc(DS_LAST, sizeof(*modname)); + + for (j = 0; j < DS_LAST; j++) { + modname[i++] = diplstate_type_name(j); + } + + secfile_insert_str_vec(loading->file, modname, + DS_LAST, + "savefile.diplstate_type_vector"); + free(modname); + } } /**************************************************************************** Modified: trunk/server/savecompat.h URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/savecompat.h?rev=30202&r1=30201&r2=30202&view=diff ============================================================================== --- trunk/server/savecompat.h (original) +++ trunk/server/savecompat.h Sat Oct 24 23:33:23 2015 @@ -95,6 +95,11 @@ struct specialist **order; size_t size; } specialist; + /* loaded in sg_load_savefile(); needed in sg_load_player_main(), ... */ + struct { + enum diplstate_type *order; + size_t size; + } ds_t; /* loaded in sg_load_game(); needed in sg_load_random(), ... */ enum server_states server_state; Modified: trunk/server/savegame2.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/savegame2.c?rev=30202&r1=30201&r2=30202&view=diff ============================================================================== --- trunk/server/savegame2.c (original) +++ trunk/server/savegame2.c Sat Oct 24 23:33:23 2015 @@ -504,6 +504,8 @@ loading->road.size = -1; loading->specialist.order = NULL; loading->specialist.size = -1; + loading->ds_t.order = NULL; + loading->ds_t.size = -1; loading->server_state = S_S_INITIAL; loading->rstate = fc_rand_state(); @@ -551,6 +553,10 @@ if (loading->specialist.order != NULL) { free(loading->specialist.order); + } + + if (loading->ds_t.order != NULL) { + free(loading->ds_t.order); } if (loading->worked_tiles != NULL) { @@ -1364,6 +1370,33 @@ loading->specialist.order[j] = NULL; } } + + /* Load diplomatic state type order. */ + loading->ds_t.size + = secfile_lookup_int_default(loading->file, 0, + "savefile.diplstate_type_size"); + + sg_failure_ret(loading->ds_t.size > 0, + "Failed to load diplomatic state type order: %s", + secfile_error()); + + if (loading->ds_t.size) { + const char **modname; + int j; + + modname = secfile_lookup_str_vec(loading->file, &loading->ds_t.size, + "savefile.diplstate_type_vector"); + + loading->ds_t.order = fc_calloc(loading->ds_t.size, + sizeof(*loading->ds_t.order)); + + for (j = 0; j < loading->ds_t.size; j++) { + loading->ds_t.order[j] = diplstate_type_by_name(modname[j], + fc_strcasecmp); + } + + free(modname); + } } /* ======================================================================= @@ -2698,16 +2731,37 @@ BV_CLR_ALL(plr->real_embassy); players_iterate(pplayer) { char buf[32]; + int unconverted; struct player_diplstate *ds = player_diplstate_get(plr, pplayer); i = player_index(pplayer); /* load diplomatic status */ fc_snprintf(buf, sizeof(buf), "player%d.diplstate%d", plrno, i); - ds->type = - secfile_lookup_int_default(loading->file, DS_WAR, "%s.type", buf); - ds->max_state = - secfile_lookup_int_default(loading->file, DS_WAR, "%s.max_state", buf); + unconverted = + secfile_lookup_int_default(loading->file, -1, "%s.type", buf); + if (unconverted >= 0 && unconverted < loading->ds_t.size) { + /* Look up what state the unconverted number represents. */ + ds->type = loading->ds_t.order[unconverted]; + } else { + log_sg("No valid diplomatic state type between players %d and %d", + plrno, i); + + ds->type = DS_WAR; + } + + unconverted = + secfile_lookup_int_default(loading->file, -1, "%s.max_state", buf); + if (unconverted >= 0 && unconverted < loading->ds_t.size) { + /* Look up what state the unconverted number represents. */ + ds->max_state = loading->ds_t.order[unconverted]; + } else { + log_sg("No valid diplomatic max_state between players %d and %d", + plrno, i); + + ds->max_state = DS_WAR; + } + ds->first_contact_turn = secfile_lookup_int_default(loading->file, 0, "%s.first_contact_turn", buf); Modified: trunk/server/savegame3.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/savegame3.c?rev=30202&r1=30201&r2=30202&view=diff ============================================================================== --- trunk/server/savegame3.c (original) +++ trunk/server/savegame3.c Sat Oct 24 23:33:23 2015 @@ -623,6 +623,8 @@ loading->multiplier.size = -1; loading->specialist.order = NULL; loading->specialist.size = -1; + loading->ds_t.order = NULL; + loading->ds_t.size = -1; loading->server_state = S_S_INITIAL; loading->rstate = fc_rand_state(); @@ -658,6 +660,10 @@ if (loading->specialist.order != NULL) { free(loading->specialist.order); + } + + if (loading->ds_t.order != NULL) { + free(loading->ds_t.order); } if (loading->worked_tiles != NULL) { @@ -1484,6 +1490,33 @@ loading->specialist.order[j] = NULL; } } + + /* Load diplomatic state type order. */ + loading->ds_t.size + = secfile_lookup_int_default(loading->file, 0, + "savefile.diplstate_type_size"); + + sg_failure_ret(loading->ds_t.size > 0, + "Failed to load diplomatic state type order: %s", + secfile_error()); + + if (loading->ds_t.size) { + const char **modname; + int j; + + modname = secfile_lookup_str_vec(loading->file, &loading->ds_t.size, + "savefile.diplstate_type_vector"); + + loading->ds_t.order = fc_calloc(loading->ds_t.size, + sizeof(*loading->ds_t.order)); + + for (j = 0; j < loading->ds_t.size; j++) { + loading->ds_t.order[j] = diplstate_type_by_name(modname[j], + fc_strcasecmp); + } + + free(modname); + } } /**************************************************************************** @@ -3587,16 +3620,37 @@ BV_CLR_ALL(plr->real_embassy); players_iterate(pplayer) { char buf[32]; + int unconverted; struct player_diplstate *ds = player_diplstate_get(plr, pplayer); i = player_index(pplayer); /* load diplomatic status */ fc_snprintf(buf, sizeof(buf), "player%d.diplstate%d", plrno, i); - ds->type = - secfile_lookup_int_default(loading->file, DS_WAR, "%s.type", buf); - ds->max_state = - secfile_lookup_int_default(loading->file, DS_WAR, "%s.max_state", buf); + unconverted = + secfile_lookup_int_default(loading->file, -1, "%s.type", buf); + if (unconverted >= 0 && unconverted < loading->ds_t.size) { + /* Look up what state the unconverted number represents. */ + ds->type = loading->ds_t.order[unconverted]; + } else { + log_sg("No valid diplomatic state type between players %d and %d", + plrno, i); + + ds->type = DS_WAR; + } + + unconverted = + secfile_lookup_int_default(loading->file, -1, "%s.max_state", buf); + if (unconverted >= 0 && unconverted < loading->ds_t.size) { + /* Look up what state the unconverted number represents. */ + ds->max_state = loading->ds_t.order[unconverted]; + } else { + log_sg("No valid diplomatic max_state between players %d and %d", + plrno, i); + + ds->max_state = DS_WAR; + } + ds->first_contact_turn = secfile_lookup_int_default(loading->file, 0, "%s.first_contact_turn", buf); _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits