Remove a side from carryover on all of its leaders loss.

These changes allow to pass a correct information about sides to
mp::connect.

Can be turned off by adding "remove_from_carryover_on_leaders_loss=no".
This commit is contained in:
Andrius Silinskas 2013-08-22 12:43:37 +01:00
parent abaa3944d7
commit fe3224e9b4
8 changed files with 33 additions and 4 deletions

View File

@ -303,6 +303,16 @@ void carryover_info::add_side(const config& cfg) {
carryover_sides_.push_back(carryover(cfg));
}
void carryover_info::remove_side(const std::string& id) {
for (std::vector<carryover>::iterator it = carryover_sides_.begin();
it != carryover_sides_.end(); ++it) {
if (it->get_save_id() == id) {
carryover_sides_.erase(it);
break;
}
}
}
const end_level_data& carryover_info::get_end_level() const{
return end_level_;

View File

@ -138,6 +138,7 @@ public:
std::vector<carryover>& get_all_sides();
void add_side(const config& cfg);
void add_side(const team& t, const int gold, const bool add);
void remove_side(const std::string& id);
void set_end_level(const end_level_data& end_level) { end_level_ = end_level; }
void transfer_from(const team& t, int carryover_gold);

View File

@ -124,6 +124,7 @@ play_controller::play_controller(const config& level, game_state& state_of_game,
savenames_(),
wml_commands_(),
victory_when_enemies_defeated_(true),
remove_from_carryover_on_leaders_loss_(true),
end_level_data_(),
victory_music_(),
defeat_music_()
@ -1356,7 +1357,8 @@ void play_controller::check_victory()
}
}
// Clear villages for teams that have no leader
// Clear villages for teams that have no leader and
// mark side as lost if it should be removed from carryover.
for (std::vector<team>::iterator tm_beg = teams_.begin(), tm = tm_beg,
tm_end = teams_.end(); tm != tm_end; ++tm)
{
@ -1365,6 +1367,10 @@ void play_controller::check_victory()
// invalidate_all() is overkill and expensive but this code is
// run rarely so do it the expensive way.
gui_->invalidate_all();
if (!tm->no_leader() && remove_from_carryover_on_leaders_loss_) {
tm->set_lost();
}
}
}

View File

@ -118,7 +118,9 @@ public:
virtual void process_oos(const std::string& msg) const;
void set_victory_when_enemies_defeated(bool e)
{ victory_when_enemies_defeated_ = e; }
{ victory_when_enemies_defeated_ = e; }
void set_remove_from_carryover_on_leaders_loss(bool e)
{ remove_from_carryover_on_leaders_loss_ = e; }
end_level_data& get_end_level_data() {
return end_level_data_;
}
@ -266,6 +268,7 @@ private:
static const size_t MAX_WML_COMMANDS = 7;
bool victory_when_enemies_defeated_;
bool remove_from_carryover_on_leaders_loss_;
end_level_data end_level_data_;
std::vector<std::string> victory_music_;
std::vector<std::string> defeat_music_;

View File

@ -141,6 +141,9 @@ static void store_carryover(game_state& gamestate, playsingle_controller& playco
{
if (!t.persistent()){
continue;
} else if (t.lost()) {
sides.remove_side(t.save_id());
continue;
}
int carryover_gold = div100rounded((t.gold() + finishing_bonus) * end_level.carryover_percentage);
sides.transfer_from(t, carryover_gold);

View File

@ -356,6 +356,7 @@ LEVEL_RESULT playsingle_controller::play_scenario(
}
set_victory_when_enemies_defeated(level_["victory_when_enemies_defeated"].to_bool(true));
set_remove_from_carryover_on_leaders_loss(level_["remove_from_carryover_on_leaders_loss"].to_bool(true));
end_level_data &end_level = get_end_level_data();
end_level.carryover_percentage = level_["carryover_percentage"].to_int(game_config::gold_carryover_percentage);
end_level.carryover_add = level_["carryover_add"].to_bool();

View File

@ -50,7 +50,7 @@ const int team::default_team_gold_ = 100;
const char * const team::attributes[] = {
"ai_config", "color", "controller", "current_player", "flag",
"flag_icon", "fog", "fog_data", "gold", "hidden", "income",
"no_leader", "objectives", "objectives_changed", "persistent",
"no_leader", "objectives", "objectives_changed", "persistent", "lost",
"recall_cost", "recruit", "save_id", "scroll_to_leader",
"share_maps", "share_view", "shroud", "shroud_data", "start_gold",
"suppress_end_turn_confirmation",
@ -104,7 +104,8 @@ team::team_info::team_info() :
no_turn_confirmation(false),
color(),
side(0),
persistent(false)
persistent(false),
lost(false)
{
}
@ -276,6 +277,7 @@ void team::team_info::write(config& cfg) const
cfg["color"] = color;
cfg["persistent"] = persistent;
cfg["lost"] = lost;
cfg.add_child("ai",ai::manager::to_config(side));
}

View File

@ -107,6 +107,7 @@ class team : public savegame::savegame_config
int side;
bool persistent;
bool lost;
};
static const int default_team_gold_;
@ -256,6 +257,8 @@ public:
bool hidden() const { return info_.hidden; }
void set_hidden(bool value) { info_.hidden=value; }
bool persistent() const {return info_.persistent;}
void set_lost(bool value=true) { info_.lost = value; }
bool lost() const { return info_.lost; }
bool no_turn_confirmation() const { return info_.no_turn_confirmation; }
void set_no_turn_confirmation(bool value) { info_.no_turn_confirmation = value; }