Fixed issue with old savegames and victory reports

Refactoring still WIP
This commit is contained in:
Anja Keicher 2012-06-22 18:34:18 +00:00
parent 552b6b0c7e
commit 823ddd6622
5 changed files with 66 additions and 127 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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);
}

View file

@ -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");

View file

@ -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 */