From ac9628e3cff7709460c702a4735e15ad933ad704 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Fri, 13 Jun 2014 00:44:23 +0200 Subject: [PATCH] fix servergenerated replays I also removed 'mp_game_title' because if i leave it, it casues an 'attributes not in order' error since level_ contains attributes. Idk what it does so i removed it. if we want it we should write in into level_ --- src/saved_game.cpp | 9 ++++++++- src/server/game.cpp | 12 +++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/saved_game.cpp b/src/saved_game.cpp index 15f31f7d60c3..1137993b9786 100644 --- a/src/saved_game.cpp +++ b/src/saved_game.cpp @@ -81,8 +81,15 @@ saved_game::saved_game(const config& cfg) carryover_sides = cfg.child_or_empty("carryover_sides"); carryover_sides_start = cfg.child_or_empty("carryover_sides_start"); + + //Serversided replays can contain multiple [replay] replay_start_ = cfg.child_or_empty("replay_start"); - replay_data = cfg.child_or_empty("replay"); + replay_data = config(); //cfg.child_or_empty("replay"); + BOOST_FOREACH(const config& replay, cfg.child_range("replay")) + { + replay_data.append_children(replay); + } + if(const config& snapshot = cfg.child("snapshot")) { this->starting_pos_type_ = STARTINGPOS_SNAPSHOT; diff --git a/src/server/game.cpp b/src/server/game.cpp index 4c31525244bb..a1e7f6a78afb 100644 --- a/src/server/game.cpp +++ b/src/server/game.cpp @@ -1470,11 +1470,13 @@ void game::save_replay() { history_.clear(); std::stringstream name; - name << level_["name"] << " Turn " << current_turn(); + name << (*starting_pos( level_.root()))["name"] << " Turn " << current_turn(); std::stringstream replay_data; try { +#if 0 replay_data << "campaign_type=\"multiplayer\"\n" + //why did we save difficulcy here ? esp in scmapogn difficulacy = normal is not bguaranteed << "difficulty=\"NORMAL\"\n" << "label=\"" << name.str() << "\"\n" << "mp_game_title=\"" << name_ << "\"\n" @@ -1485,7 +1487,15 @@ void game::save_replay() { << replay_commands << "[/replay]\n" << "[replay_start]\n" << level_.output() << "[/replay_start]\n"; +#else + replay_data << level_.output() + //This can result in having 2 [replay] at toplevel since level_ can contain one already. But the client can handle this (simply merges them). + << "[replay]\n" + << "\t[command]\n\t\t[start]\n\t\t[/start]\n\t[/command]\n" //this is required by gfgtdf's sync mechanism, in PR 121 + << replay_commands + << "[/replay]\n"; +#endif name << " (" << id_ << ").bz2"; std::string replay_data_str = replay_data.str();