From 9e40b2621958e4dc00f585eefd196739b878d418 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Wed, 11 Jun 2014 21:54:44 +0200 Subject: [PATCH] load replay from [scenario] if [replay_start] is not present the intention is to change the serverside generated replays to contain [scenario] & [carryover_sides_start] & [replay]. [replay_start] would be wrong because carryover isn't expanded in these servergenerated saves. Servergenerated saves from reloaded (non start of scenario) games will then contain [replay_start] & [carryover_sides] & [replay] --- src/playcampaign.cpp | 3 ++- src/replay_controller.cpp | 4 +--- src/save_index.cpp | 3 ++- src/saved_game.cpp | 20 ++++++++++++++++++++ src/saved_game.hpp | 3 ++- 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/playcampaign.cpp b/src/playcampaign.cpp index 34f6908fcb91..445681e3b6b9 100644 --- a/src/playcampaign.cpp +++ b/src/playcampaign.cpp @@ -162,7 +162,8 @@ LEVEL_RESULT play_replay(display& disp, saved_game& gamestate, const config& gam const std::string campaign_type_str = lexical_cast (gamestate.classification().campaign_type); // 'starting_pos' will contain the position we start the game from. - const config& starting_pos = gamestate.replay_start(); + // this call also might expand [scenario] in case thatt there is no replay_start + const config& starting_pos = gamestate.get_replay_starting_pos(); try { // Preserve old label eg. replay diff --git a/src/replay_controller.cpp b/src/replay_controller.cpp index 29c4725cb6d9..8df590974d8d 100644 --- a/src/replay_controller.cpp +++ b/src/replay_controller.cpp @@ -50,14 +50,12 @@ LEVEL_RESULT play_replay_level(const config& game_config, { const int ticks = SDL_GetTicks(); - config init_level = state_of_game.replay_start(); - DBG_NG << "creating objects... " << (SDL_GetTicks() - ticks) << std::endl; boost::scoped_ptr rc; try { - rc.reset(new replay_controller(init_level, state_of_game, ticks, game_config, video)); + rc.reset(new replay_controller(state_of_game.get_replay_starting_pos(), state_of_game, ticks, game_config, video)); } catch (end_level_exception & e){ return e.result; } catch (end_turn_exception &) { diff --git a/src/save_index.cpp b/src/save_index.cpp index 869e3a77a6fe..31c0b3eff5e8 100644 --- a/src/save_index.cpp +++ b/src/save_index.cpp @@ -397,7 +397,8 @@ save_info create_save_info::operator()(const std::string& filename) const void extract_summary_from_config(config& cfg_save, config& cfg_summary) { const config &cfg_snapshot = cfg_save.child("snapshot"); - const config &cfg_replay_start = cfg_save.child("replay_start"); + //Servergenerated replays contain [scenario] and no [replay_start] + const config &cfg_replay_start = cfg_save.child("replay_start") ? cfg_save.child("replay_start") : cfg_save.child("scenario") ; const config &cfg_replay = cfg_save.child("replay"); const bool has_replay = cfg_replay && !cfg_replay.empty(); diff --git a/src/saved_game.cpp b/src/saved_game.cpp index 771b3b0e18e7..2ae2f8c00b3f 100644 --- a/src/saved_game.cpp +++ b/src/saved_game.cpp @@ -247,6 +247,26 @@ config& saved_game::get_starting_pos() return starting_pos_; } + +const config& saved_game::get_replay_starting_pos() +{ + if(!this->replay_start_.empty()) + { + return replay_start_; + } + if(!this->carryover_sides_start.empty()) + { + //Try to load the scenario form game config or from [scenario] if there is no [replay_start] + expand_scenario(); + expand_carryover(); + } + if(starting_pos_type_ == STARTINGPOS_SCENARIO) + { + return starting_pos_; + } + return this->replay_start_.child("some_non_existet_invalid"); +} + void saved_game::remove_old_scenario() { remove_snapshot(); diff --git a/src/saved_game.hpp b/src/saved_game.hpp index 779ca9edb7fb..4c90b5a6f2ac 100644 --- a/src/saved_game.hpp +++ b/src/saved_game.hpp @@ -51,7 +51,8 @@ class saved_game return starting_pos_type_ == STARTINGPOS_SNAPSHOT; } void convert_to_start_save(); - + const config& get_replay_starting_pos(); + config& get_starting_pos(); config& replay_start() { return replay_start_; } /**