fix different carryover when loading startofscenario-save

this removes a hack in connect_engine.cpp that set save_id to a value to make sure that other connect_engine.cpp code does not chnge it later to the plyers id, (it did so at some point iirc).

Instead we update carryover.cpp to make sure that a side with no save_id  (or id since save_id defaults to id) is not carried over to the next scenario,

fixes #3152
This commit is contained in:
gfgtdf 2018-05-23 23:08:30 +02:00 committed by Charles Dang
parent fb54b0376d
commit fef4254c84
2 changed files with 9 additions and 7 deletions

View file

@ -15,10 +15,15 @@
#include "carryover.hpp"
#include "config.hpp"
#include "log.hpp"
#include "team.hpp"
#include "units/unit.hpp"
#include <cassert>
static lg::log_domain log_engine("engine");
#define LOG_NG LOG_STREAM(info, log_engine)
#define ERR_NG LOG_STREAM(err, log_engine)
carryover::carryover(const config& side)
: add_(!side["carryover_add"].empty() ? side["carryover_add"].to_bool() : side["add"].to_bool())
, current_player_(side["current_player"])
@ -128,10 +133,12 @@ carryover_info::carryover_info(const config& cfg, bool from_snpashot)
{
for(const config& side : cfg.child_range("side"))
{
if(side["lost"].to_bool(false) || !side["persistent"].to_bool(true))
if(side["lost"].to_bool(false) || !side["persistent"].to_bool(true) || side["save_id"].empty())
{
//this shouldn't happen outside a snpshot.
assert(from_snpashot);
if(!from_snpashot) {
ERR_NG << "found invalid carryover data in saved game, lost='" << side["lost"] << "' persistent='" << side["persistent"] << "' save_id='" << side["save_id"] << "'\n";
}
continue;
}
this->carryover_sides_.emplace_back(side);

View file

@ -910,11 +910,6 @@ side_engine::side_engine(const config& cfg, connect_engine& parent_engine, const
ERR_MP << "controller=<number> is deperecated\n";
}
if(!parent_.params_.saved_game && cfg_["save_id"].str().empty()) {
assert(cfg_["id"].empty()); // we already set "save_id" to "id" if "id" existed.
cfg_["save_id"] = parent_.scenario()["id"].str() + "_" + std::to_string(index);
}
if(cfg_["controller"] != "human" && cfg_["controller"] != "ai" && cfg_["controller"] != "null") {
//an invalid controller type was specified. Remove it to prevent asertion failures later.
cfg_.remove_attribute("controller");