Fixed issue with old savegames and victory reports
Refactoring still WIP
This commit is contained in:
parent
552b6b0c7e
commit
823ddd6622
5 changed files with 66 additions and 127 deletions
|
@ -65,7 +65,7 @@ static lg::log_domain log_enginerefac("enginerefac");
|
|||
|
||||
carryover::carryover(const config& side)
|
||||
: save_id_(side["save_id"])
|
||||
, gold_(lexical_cast_default<int>(side["gold"]))
|
||||
, gold_(side["gold"].to_int())
|
||||
, add_(side["gold_add"].to_bool())
|
||||
, color_(side["color"])
|
||||
, current_player_(side["current_player"])
|
||||
|
@ -110,18 +110,26 @@ carryover::carryover(const team& t, const int gold, const bool add)
|
|||
// , recall_list_()
|
||||
// {}
|
||||
|
||||
void carryover::transfer_all_gold_to(config& side_cfg, int gold){
|
||||
if(gold_ == 0){
|
||||
return;
|
||||
static const int default_gold_qty = 100;
|
||||
|
||||
void carryover::transfer_all_gold_to(config& side_cfg){
|
||||
LOG_RG <<"config gold before default " <<side_cfg["gold"]<<"\n";
|
||||
int cfg_gold = side_cfg["gold"].to_int();
|
||||
if(cfg_gold == 0) {
|
||||
cfg_gold = default_gold_qty;
|
||||
side_cfg["gold"] = cfg_gold;
|
||||
}
|
||||
LOG_RG <<"config gold after default " <<side_cfg["gold"]<<"\n";
|
||||
|
||||
if(add_){
|
||||
side_cfg["gold"] = gold + gold_;
|
||||
side_cfg["gold"] = cfg_gold + gold_;
|
||||
gold_ = 0;
|
||||
}
|
||||
else{
|
||||
else if(gold_ > cfg_gold){
|
||||
side_cfg["gold"] = gold_;
|
||||
gold_ = 0;
|
||||
}
|
||||
gold_ = 0;
|
||||
|
||||
}
|
||||
|
||||
std::string carryover::get_recruits(bool erase){
|
||||
|
@ -151,6 +159,10 @@ void carryover::update_carryover(const team& t, const int gold, const bool add){
|
|||
LOG_RG << "gold after carryover store" << str_cast<int>(gold_) << "\n";
|
||||
}
|
||||
|
||||
void carryover::initialize_team(config& side_cfg){
|
||||
transfer_all_gold_to(side_cfg);
|
||||
}
|
||||
|
||||
//TODO: remove
|
||||
//void carryover::add_recruits(const std::set<std::string>& recruits){
|
||||
// previous_recruits_.insert(recruits.begin(), recruits.end());
|
||||
|
@ -172,7 +184,7 @@ const std::string carryover::to_string(){
|
|||
void carryover::to_config(config& cfg){
|
||||
config& side = cfg.add_child("side");
|
||||
side["save_id"] = save_id_;
|
||||
side["gold"] = str_cast<int>(gold_);
|
||||
side["gold"] = gold_;
|
||||
side["add"] = add_;
|
||||
side["color"] = color_;
|
||||
side["current_player"] = current_player_;
|
||||
|
@ -188,6 +200,7 @@ carryover_info::carryover_info(const config& cfg)
|
|||
: carryover_sides_()
|
||||
, end_level_()
|
||||
{
|
||||
if(cfg.empty()) { return; }
|
||||
end_level_.read(cfg.child("end_level_data"));
|
||||
foreach(const config& side, cfg.child_range("side")){
|
||||
this->carryover_sides_.push_back(carryover(side));
|
||||
|
@ -437,7 +450,7 @@ game_state::game_state(const config& cfg, bool show_replay) :
|
|||
starting_pos(),
|
||||
snapshot(),
|
||||
last_selected(map_location::null_location),
|
||||
carryover_sides(),
|
||||
carryover_sides(cfg.child_or_empty("carryover_sides")),
|
||||
rng_(cfg),
|
||||
variables_(),
|
||||
temporaries_(),
|
||||
|
@ -510,9 +523,6 @@ game_state::game_state(const config& cfg, bool show_replay) :
|
|||
statistics::read_stats(stats);
|
||||
}
|
||||
|
||||
const config& carryover_bank = cfg.child("carryover_bank");
|
||||
this->carryover_sides = carryover_info(carryover_bank);
|
||||
|
||||
}
|
||||
|
||||
void game_state::write_snapshot(config& cfg) const
|
||||
|
@ -879,34 +889,34 @@ protected:
|
|||
throw game::load_game_failed("Map not found");
|
||||
}
|
||||
|
||||
/*if(side_cfg_["controller"] == "human" ||
|
||||
side_cfg_["controller"] == "network" ||
|
||||
side_cfg_["controller"] == "network_ai" ||
|
||||
side_cfg_["controller"] == "human_ai" ||
|
||||
side_cfg_["persistent"].to_bool())
|
||||
{
|
||||
player_exists_ = true;
|
||||
|
||||
//if we have a snapshot, level contains team information
|
||||
//else, we look for [side] or [player] (deprecated) tags in starting_pos
|
||||
///@deprecated r37519 [player] instead of [side] in starting_pos
|
||||
if (snapshot_) {
|
||||
if (const config &c = level_.find_child("player","save_id",save_id_)) {
|
||||
player_cfg_ = &c;
|
||||
}
|
||||
} else {
|
||||
//at the start of scenario, get the persistence information from starting_pos
|
||||
if (const config &c = starting_pos_.find_child("player","save_id",save_id_)) {
|
||||
player_cfg_ = &c;
|
||||
} else if (const config &c = starting_pos_.find_child("side","save_id",save_id_)) {
|
||||
player_cfg_ = &c;
|
||||
player_exists_ = false; //there is only a [side] tag for this save_id in starting_pos
|
||||
} else {
|
||||
player_cfg_ = NULL;
|
||||
player_exists_ = false;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
// if(side_cfg_["controller"] == "human" ||
|
||||
// side_cfg_["controller"] == "network" ||
|
||||
// side_cfg_["controller"] == "network_ai" ||
|
||||
// side_cfg_["controller"] == "human_ai" ||
|
||||
// side_cfg_["persistent"].to_bool())
|
||||
// {
|
||||
// player_exists_ = true;
|
||||
//
|
||||
// //if we have a snapshot, level contains team information
|
||||
// //else, we look for [side] or [player] (deprecated) tags in starting_pos
|
||||
// ///@deprecated r37519 [player] instead of [side] in starting_pos
|
||||
// if (snapshot_) {
|
||||
// if (const config &c = level_.find_child("player","save_id",save_id_)) {
|
||||
// player_cfg_ = &c;
|
||||
// }
|
||||
// } else {
|
||||
// //at the start of scenario, get the persistence information from starting_pos
|
||||
// if (const config &c = starting_pos_.find_child("player","save_id",save_id_)) {
|
||||
// player_cfg_ = &c;
|
||||
// } else if (const config &c = starting_pos_.find_child("side","save_id",save_id_)) {
|
||||
// player_cfg_ = &c;
|
||||
// player_exists_ = false; //there is only a [side] tag for this save_id in starting_pos
|
||||
// } else {
|
||||
// player_cfg_ = NULL;
|
||||
// player_exists_ = false;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
DBG_NG_TC << "save id: "<< save_id_ <<std::endl;
|
||||
DBG_NG_TC << "snapshot: "<< (player_exists_ ? "true" : "false") <<std::endl;
|
||||
|
|
|
@ -59,11 +59,11 @@ public:
|
|||
~carryover(){};
|
||||
|
||||
const std::string& get_save_id() const{ return save_id_; };
|
||||
void transfer_all_gold_to(config& side_cfg, int gold);
|
||||
bool get_add() const { return add_; };
|
||||
void transfer_all_gold_to(config& side_cfg);
|
||||
std::string get_recruits(bool erase=false);
|
||||
std::vector<unit>& get_recall_list() { return recall_list_; };
|
||||
void update_carryover(const team& t, const int gold, const bool add);
|
||||
void initialize_team(config& side_cfg);
|
||||
//TODO: remove
|
||||
// void add_recruits(const std::set<std::string>& recruits);
|
||||
// void add_recall(const unit& u);
|
||||
|
|
|
@ -71,38 +71,13 @@ typedef std::map<std::string, player_controller> controller_map;
|
|||
|
||||
} // end anon namespace
|
||||
|
||||
static const std::string default_gold_qty = "100";
|
||||
|
||||
static void team_gold(config& level, game_state& gamestate)
|
||||
{
|
||||
foreach (config &side_cfg, level.child_range("side")) {
|
||||
|
||||
LOG_RG <<"config gold before default " <<str_cast<int>(side_cfg["gold"])<<"\n";
|
||||
std::string cfg_gold = side_cfg["gold"];
|
||||
if(cfg_gold.empty()) {
|
||||
cfg_gold = default_gold_qty;
|
||||
side_cfg["gold"] = cfg_gold;
|
||||
}
|
||||
LOG_RG <<"config gold after default " <<str_cast<int>(side_cfg["gold"])<<"\n";
|
||||
|
||||
int gold = lexical_cast_default<int>(cfg_gold);
|
||||
|
||||
LOG_RG <<"sides size "<<str_cast<int>(gamestate.carryover_sides.get_all_sides().size())<<"\n";
|
||||
|
||||
carryover* side = gamestate.carryover_sides.get_side(side_cfg["save_id"]);
|
||||
if(side != NULL ){
|
||||
LOG_RG << "loading side " << side->to_string() << "\n";
|
||||
side->transfer_all_gold_to(side_cfg, gold);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void team_recall(config& level, game_state& gamestate){
|
||||
static void team_init(config& level, game_state& gamestate){
|
||||
foreach(config& side_cfg, level.child_range("side")){
|
||||
carryover* side = gamestate.carryover_sides.get_side(side_cfg["save_id"]);
|
||||
|
||||
if(side == NULL ){ continue; }
|
||||
side->transfer_all_gold_to(side_cfg);
|
||||
std::string can_recruit_str = side->get_recruits(true);
|
||||
side_cfg["previous_recruits"] = can_recruit_str;
|
||||
|
||||
|
@ -164,21 +139,6 @@ static void store_carryover(game_state& gamestate, playsingle_controller& playco
|
|||
LOG_RG <<"carryover gold " << str_cast<int>(carryover_gold) <<"\n";
|
||||
gamestate.carryover_sides.transfer_from(t, carryover_gold);
|
||||
|
||||
//TODO: remove if transfer method works
|
||||
// //find side with team's save_id if it exists
|
||||
// carryover* side = gamestate.carryover_sides.get_side(t.save_id());
|
||||
// //if side exists, update info
|
||||
// if(side != NULL){
|
||||
// side->update_carryover(t, carryover_gold);
|
||||
// LOG_RG << "existing side " << side->to_string() << "\n";
|
||||
// }
|
||||
// //if side doesn't exist, add new side
|
||||
// else{
|
||||
// LOG_RG << "side doesn't exist \n";
|
||||
// gamestate.carryover_sides.add_side(t, carryover_gold);
|
||||
// }
|
||||
|
||||
// Only show the report for ourselves.
|
||||
if (!t.is_human()){
|
||||
continue;
|
||||
}
|
||||
|
@ -196,35 +156,6 @@ static void store_carryover(game_state& gamestate, playsingle_controller& playco
|
|||
}
|
||||
}
|
||||
|
||||
//TODO: remove if combining it in one transfer method with store_carryover works
|
||||
//static void store_recalls(game_state& gamestate, playsingle_controller& playcontroller){
|
||||
// std::vector<team> teams = playcontroller.get_teams_const();
|
||||
//
|
||||
// foreach (const team &t, teams)
|
||||
// {
|
||||
// if (!t.persistent()){
|
||||
// continue;
|
||||
// }
|
||||
//
|
||||
// //find side with team's save_id if it exists
|
||||
// carryover* side = gamestate.carryover_sides.get_side(t.save_id());
|
||||
// //if side exists, update info
|
||||
// if(side != NULL){
|
||||
// side->add_recruits(t.recruits());
|
||||
// LOG_RG << "existing side " << side->to_string() << "\n";
|
||||
// }
|
||||
// //if side doesn't exist, add new side
|
||||
// else{
|
||||
// gamestate.carryover_sides.add_side(t.save_id(), t.recruits());
|
||||
// side = gamestate.carryover_sides.get_side(t.save_id());
|
||||
// }
|
||||
//
|
||||
// foreach(const unit& u, t.recall_list()){
|
||||
// LOG_RG << "add unit " << u.name() << "\n";
|
||||
// side->add_recall(u);
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
void play_replay(display& disp, game_state& gamestate, const config& game_config,
|
||||
CVideo& video)
|
||||
|
@ -284,8 +215,7 @@ static LEVEL_RESULT playsingle_scenario(const config& game_config,
|
|||
LOG_RG << "before level init "<< str_cast<int>((*level)["carryover_percentage"]) << "\n";
|
||||
|
||||
config init_level = *level;
|
||||
team_gold(init_level, state_of_game);
|
||||
team_recall(init_level, state_of_game);
|
||||
team_init(init_level, state_of_game);
|
||||
|
||||
LOG_RG << "after level init "<< str_cast<int>((*level)["carryover_percentage"]) << "\n";
|
||||
|
||||
|
@ -295,9 +225,9 @@ static LEVEL_RESULT playsingle_scenario(const config& game_config,
|
|||
|
||||
LEVEL_RESULT res = playcontroller.play_scenario(story, skip_replay);
|
||||
end_level = playcontroller.get_end_level_data_const();
|
||||
LOG_RG<< "carrover percentage before " << str_cast<int>(end_level.carryover_percentage) << "\n";
|
||||
LOG_RG<< "carryover percentage before " << str_cast<int>(end_level.carryover_percentage) << "\n";
|
||||
state_of_game.carryover_sides.set_end_level(end_level);
|
||||
LOG_RG<< "carrover percentage after " << str_cast<int>(state_of_game.carryover_sides.get_end_level().carryover_percentage) << "\n";
|
||||
LOG_RG<< "carryover percentage after " << str_cast<int>(state_of_game.carryover_sides.get_end_level().carryover_percentage) << "\n";
|
||||
|
||||
if (res == DEFEAT) {
|
||||
if (resources::persist != NULL)
|
||||
|
@ -307,7 +237,7 @@ static LEVEL_RESULT playsingle_scenario(const config& game_config,
|
|||
_("You have been defeated!")
|
||||
);
|
||||
}
|
||||
else{
|
||||
else if(res == VICTORY){
|
||||
store_carryover(state_of_game, playcontroller, disp);
|
||||
}
|
||||
|
||||
|
@ -337,8 +267,7 @@ static LEVEL_RESULT playmp_scenario(const config& game_config,
|
|||
LOG_RG << "before level init "<< str_cast<int>((*level)["carryover_percentage"]) << "\n";
|
||||
|
||||
config init_level = *level;
|
||||
team_gold(init_level, state_of_game);
|
||||
team_recall(init_level, state_of_game);
|
||||
team_init(init_level, state_of_game);
|
||||
|
||||
LOG_RG << "after level init "<< str_cast<int>((*level)["carryover_percentage"]) << "\n";
|
||||
|
||||
|
@ -346,9 +275,9 @@ static LEVEL_RESULT playmp_scenario(const config& game_config,
|
|||
game_config, disp.video(), skip_replay, io_type == IO_SERVER);
|
||||
LEVEL_RESULT res = playcontroller.play_scenario(story, skip_replay);
|
||||
end_level = playcontroller.get_end_level_data_const();
|
||||
LOG_RG<< "carrover percentage before " << str_cast<int>(end_level.carryover_percentage) << "\n";
|
||||
LOG_RG<< "carryover percentage before " << str_cast<int>(end_level.carryover_percentage) << "\n";
|
||||
state_of_game.carryover_sides.set_end_level(end_level);
|
||||
LOG_RG<< "carrover percentage" << str_cast<int>(state_of_game.carryover_sides.get_end_level().carryover_percentage) << "\n";
|
||||
LOG_RG<< "carryover percentage" << str_cast<int>(state_of_game.carryover_sides.get_end_level().carryover_percentage) << "\n";
|
||||
|
||||
//Check if the player started as mp client and changed to host
|
||||
if (io_type == IO_CLIENT && playcontroller.is_host())
|
||||
|
@ -362,7 +291,7 @@ static LEVEL_RESULT playmp_scenario(const config& game_config,
|
|||
_("You have been defeated!")
|
||||
);
|
||||
}
|
||||
else{
|
||||
else if(res == VICTORY){
|
||||
store_carryover(state_of_game, playcontroller, disp);
|
||||
}
|
||||
|
||||
|
|
|
@ -786,7 +786,7 @@ void loadgame::copy_era(config &cfg)
|
|||
savegame::savegame(game_state& gamestate, const bool compress_saves, const std::string& title)
|
||||
: gamestate_(gamestate)
|
||||
, snapshot_()
|
||||
, carryover_bank_(gamestate.carryover_sides.to_config())
|
||||
, carryover_sides_(gamestate.carryover_sides.to_config())
|
||||
, filename_()
|
||||
, title_(title)
|
||||
, error_message_(_("The game could not be saved: "))
|
||||
|
@ -997,7 +997,7 @@ void savegame::write_game(config_writer &out) const
|
|||
out.write_key_val("next_underlying_unit_id", lexical_cast<std::string>(n_unit::id_manager::instance().get_save_id()));
|
||||
gamestate_.write_config(out, false);
|
||||
out.write_child("snapshot",snapshot_);
|
||||
out.write_child("carryover_bank",carryover_bank_);
|
||||
out.write_child("carryover_sides",carryover_sides_);
|
||||
out.open_child("statistics");
|
||||
statistics::write_stats(out);
|
||||
out.close_child("statistics");
|
||||
|
|
|
@ -170,7 +170,7 @@ protected:
|
|||
const std::string& title() const { return title_; }
|
||||
game_state& gamestate() const { return gamestate_; }
|
||||
config& snapshot() { return snapshot_; }
|
||||
config& carryover_bank() { return carryover_bank_; }
|
||||
config& carryover_sides() { return carryover_sides_; }
|
||||
|
||||
/** If there needs to be some data fiddling before saving the game, this is the place to go. */
|
||||
virtual void before_save();
|
||||
|
@ -205,7 +205,7 @@ private:
|
|||
even if it is empty the code relies on it to be there. */
|
||||
config snapshot_;
|
||||
|
||||
config carryover_bank_;
|
||||
config carryover_sides_;
|
||||
|
||||
std::string filename_; /** Filename of the savegame file on disk */
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue