add side specific results in [endlevel]
adds [result] tags in [endlevel] as suggested in http://gna.org/bugs/?4960 the following [endlevel] attributes can now be given side spcific: 'result', 'bonus', 'carryover_precentage', 'carryover_add' In the normnal case we show a victory message on a client if any of the local humans is victorious, but we have to watch out for border cases like when there are no human sides and behave just like we did previously in this case. This also fixes a bug that the calculated carryover could be different from what is shown in the message (see comment in playcampaign.cpp that was removed by this commit) This also removes some unused functions in carryover.cpp that were incompatible with this commit.
This commit is contained in:
parent
92bf33174b
commit
7471b4eeec
13 changed files with 167 additions and 109 deletions
|
@ -24,9 +24,9 @@
|
|||
#include <cassert>
|
||||
|
||||
carryover::carryover(const config& side)
|
||||
: add_(side["add"].to_bool())
|
||||
: add_(!side["carryover_add"].empty() ? side["carryover_add"].to_bool() : side["add"].to_bool())
|
||||
, current_player_(side["current_player"])
|
||||
, gold_(side["gold"].to_int())
|
||||
, gold_(!side["carryover_gold"].empty() ? side["carryover_gold"].to_int() : side["gold"].to_int())
|
||||
// if we load it from a snapshot we need to read the recruits from "recruits" and not from "previous_recruits".
|
||||
, previous_recruits_(side.has_attribute("recruit") ? utils::set_split(side["recruit"]) :utils::set_split(side["previous_recruits"]))
|
||||
, recall_list_()
|
||||
|
@ -112,10 +112,6 @@ void carryover::update_carryover(const team& t, const int gold, const bool add){
|
|||
}
|
||||
}
|
||||
|
||||
void carryover::initialize_team(config& side_cfg){
|
||||
transfer_all_gold_to(side_cfg);
|
||||
}
|
||||
|
||||
const std::string carryover::to_string(){
|
||||
std::string side = "";
|
||||
side.append("Side " + save_id_ + ": gold " + str_cast<int>(gold_) + " recruits " + get_recruits(false) + " units ");
|
||||
|
@ -125,11 +121,6 @@ const std::string carryover::to_string(){
|
|||
return side;
|
||||
}
|
||||
|
||||
void carryover::set_gold(int gold, bool add){
|
||||
gold_ = gold;
|
||||
add_ = add;
|
||||
}
|
||||
|
||||
void carryover::to_config(config& cfg){
|
||||
config& side = cfg.add_child("side");
|
||||
side["save_id"] = save_id_;
|
||||
|
@ -150,7 +141,6 @@ carryover_info::carryover_info(const config& cfg, bool from_snpashot)
|
|||
, next_scenario_(cfg["next_scenario"])
|
||||
, next_underlying_unit_id_(cfg["next_underlying_unit_id"].to_int(0))
|
||||
{
|
||||
int turns_left = std::max(0, cfg["turns"].to_int() - cfg["turn_at"].to_int());
|
||||
end_level_.read(cfg.child_or_empty("end_level_data"));
|
||||
BOOST_FOREACH(const config& side, cfg.child_range("side"))
|
||||
{
|
||||
|
@ -161,13 +151,6 @@ carryover_info::carryover_info(const config& cfg, bool from_snpashot)
|
|||
continue;
|
||||
}
|
||||
this->carryover_sides_.push_back(carryover(side));
|
||||
if(from_snpashot)
|
||||
{
|
||||
//adjust gold
|
||||
//base_income is side["income"] + game_config::base_income;
|
||||
int finishing_bonus_per_turn = end_level_.gold_bonus ? cfg["map_villages_num"] * side["village_gold"] + side["income"] + game_config::base_income : 0;
|
||||
carryover_sides_.back().set_gold(div100rounded((finishing_bonus_per_turn * turns_left + side["gold"]) * end_level_.carryover_percentage), end_level_.carryover_add);
|
||||
}
|
||||
}
|
||||
|
||||
wml_menu_items_.set_menu_items(cfg);
|
||||
|
@ -196,18 +179,6 @@ const end_level_data& carryover_info::get_end_level() const{
|
|||
return end_level_;
|
||||
}
|
||||
|
||||
void carryover_info::transfer_from(const team& t, int carryover_gold){
|
||||
BOOST_FOREACH(carryover& side, carryover_sides_){
|
||||
if(side.get_save_id() == t.save_id()){
|
||||
side.update_carryover(t, carryover_gold, end_level_.carryover_add);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
carryover_sides_.push_back(carryover(t, carryover_gold, end_level_.carryover_add));
|
||||
}
|
||||
|
||||
|
||||
struct save_id_equals
|
||||
{
|
||||
save_id_equals(std::string val) : value (val) {}
|
||||
|
@ -245,13 +216,6 @@ void carryover_info::transfer_all_to(config& side_cfg){
|
|||
}
|
||||
}
|
||||
|
||||
void carryover_info::transfer_from(game_data& gamedata){
|
||||
variables_ = gamedata.get_variables();
|
||||
wml_menu_items_ = gamedata.get_wml_menu_items();
|
||||
rng_ = gamedata.rng();
|
||||
next_scenario_ = gamedata.next_scenario();
|
||||
}
|
||||
|
||||
void carryover_info::transfer_to(config& level){
|
||||
if(!level.has_attribute("next_underlying_unit_id"))
|
||||
{
|
||||
|
|
|
@ -34,12 +34,8 @@ public:
|
|||
void transfer_all_recruits_to(config& side_cfg);
|
||||
void transfer_all_recalls_to(config& side_cfg);
|
||||
void update_carryover(const team& t, const int gold, const bool add);
|
||||
void initialize_team(config& side_cfg);
|
||||
const std::string to_string();
|
||||
void to_config(config& cfg);
|
||||
/// @param gold sets the gold of the team, always overwrites current gold.
|
||||
/// @param add whether the gold should be added to the next scenario gold.
|
||||
void set_gold(int gold, bool add);
|
||||
private:
|
||||
bool add_;
|
||||
std::string current_player_;
|
||||
|
@ -76,10 +72,8 @@ public:
|
|||
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);
|
||||
void transfer_all_to(config& side_cfg);
|
||||
|
||||
void transfer_from(game_data& gamedata);
|
||||
void transfer_to(config& level);
|
||||
|
||||
void set_variables(const config& vars) { variables_ = vars; }
|
||||
|
|
|
@ -182,6 +182,7 @@ public:
|
|||
{
|
||||
/// A wrapper for bool to get the correct streaming ("true"/"false").
|
||||
/// Most visitors can simply treat this as bool.
|
||||
public:
|
||||
class true_false
|
||||
{
|
||||
bool value_;
|
||||
|
@ -209,7 +210,7 @@ public:
|
|||
config::attribute_value::s_no; }
|
||||
};
|
||||
friend std::ostream& operator<<(std::ostream &os, const yes_no &v);
|
||||
|
||||
private:
|
||||
/// Visitor for checking equality.
|
||||
class equality_visitor;
|
||||
/// Visitor for converting a variant to a string.
|
||||
|
|
|
@ -29,9 +29,6 @@ transient_end_level::transient_end_level()
|
|||
end_level_data::end_level_data()
|
||||
: prescenario_save(true)
|
||||
, replay_save(true)
|
||||
, gold_bonus(true)
|
||||
, carryover_percentage(game_config::gold_carryover_percentage)
|
||||
, carryover_add(false)
|
||||
, proceed_to_next_level(false)
|
||||
, transient()
|
||||
{
|
||||
|
@ -41,9 +38,6 @@ void end_level_data::write(config& cfg) const
|
|||
{
|
||||
cfg["prescenario_save"] = prescenario_save;
|
||||
cfg["replay_save"] = replay_save;
|
||||
cfg["bonus"] = gold_bonus;
|
||||
cfg["carryover_percentage"] = carryover_percentage;
|
||||
cfg["carryover_add"] = carryover_add;
|
||||
cfg["proceed_to_next_level"] = proceed_to_next_level;
|
||||
}
|
||||
|
||||
|
@ -51,8 +45,5 @@ void end_level_data::read(const config& cfg)
|
|||
{
|
||||
prescenario_save = cfg["prescenario_save"].to_bool(true);
|
||||
replay_save = cfg["replay_save"].to_bool(true);
|
||||
gold_bonus = cfg["bonus"].to_bool(true);
|
||||
carryover_percentage = cfg["carryover_percentage"].to_int(game_config::gold_carryover_percentage);
|
||||
carryover_add = cfg["carryover_add"].to_bool(false);
|
||||
proceed_to_next_level = cfg["proceed_to_next_level"].to_bool(true);
|
||||
}
|
||||
|
|
|
@ -219,9 +219,6 @@ struct end_level_data
|
|||
|
||||
bool prescenario_save; /**< Should a prescenario be created the next game? */
|
||||
bool replay_save; /**< Should a replay save be made? */
|
||||
bool gold_bonus; /**< Should early-finish bonus be applied? */
|
||||
int carryover_percentage; /**< How much gold is carried over to next scenario. */
|
||||
bool carryover_add; /**< Add or replace next scenario's minimum starting gold. */
|
||||
bool proceed_to_next_level; /**< whether to proceed to the next scenario, equals (res == VICTORY) in sp. We need to save this in saves during linger mode. > */
|
||||
transient_end_level transient;
|
||||
|
||||
|
|
|
@ -82,7 +82,9 @@ static void show_carryover_message(saved_game& gamestate, playsingle_controller&
|
|||
report << _("You have been defeated!") << "\n";
|
||||
}
|
||||
|
||||
std::vector<team> teams = playcontroller.get_teams_const();
|
||||
assert(resources::teams);
|
||||
//We need to write the carryover amount to the team thats why we need non const
|
||||
std::vector<team>& teams = *resources::teams;
|
||||
int persistent_teams = 0;
|
||||
BOOST_FOREACH(const team &t, teams) {
|
||||
if (t.persistent()){
|
||||
|
@ -94,31 +96,22 @@ static void show_carryover_message(saved_game& gamestate, playsingle_controller&
|
|||
gamestate.classification().campaign_type == game_classification::TEST))
|
||||
{
|
||||
gamemap map = playcontroller.get_map_const();
|
||||
// NOTE: this function uses game_config::village_income/game_config::base_income which is the same for all teams
|
||||
// the function that actually does the carryover (carryover.cpp) uses team.base_income() / team.village_gold() since 1.13
|
||||
// which can be different for every team
|
||||
int finishing_bonus_per_turn =
|
||||
map.villages().size() * game_config::village_income +
|
||||
game_config::base_income;
|
||||
tod_manager tod = playcontroller.get_tod_manager_const();
|
||||
int turns_left = std::max<int>(0, tod.number_of_turns() - tod.turn());
|
||||
int finishing_bonus = (end_level.gold_bonus && turns_left > -1) ?
|
||||
finishing_bonus_per_turn * turns_left : 0;
|
||||
|
||||
|
||||
BOOST_FOREACH(const team &t, teams)
|
||||
BOOST_FOREACH(team &t, teams)
|
||||
{
|
||||
if (!t.persistent() || t.lost() || !t.is_local_human())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int carryover_gold = div100rounded((t.gold() + finishing_bonus) * end_level.carryover_percentage);
|
||||
|
||||
int finishing_bonus_per_turn = map.villages().size() * t.village_gold() + game_config::base_income;
|
||||
int finishing_bonus = t.carryover_bonus() ? finishing_bonus_per_turn * turns_left : 0;
|
||||
t.set_carryover_gold(div100rounded((t.gold() + finishing_bonus) * t.carryover_percentage()));
|
||||
if (persistent_teams > 1) {
|
||||
report << "\n<b>" << t.current_player() << "</b>\n";
|
||||
}
|
||||
|
||||
playcontroller.report_victory(report, carryover_gold, t.gold(), finishing_bonus_per_turn, turns_left, finishing_bonus);
|
||||
playcontroller.report_victory(report, t, finishing_bonus_per_turn, turns_left, finishing_bonus);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2968,9 +2968,6 @@ void console_handler::do_next_level()
|
|||
if (!get_data().empty())
|
||||
menu_handler_.gamedata().set_next_scenario(get_data());
|
||||
end_level_data &e = menu_handler_.pc_.get_end_level_data();
|
||||
e.carryover_percentage = 100;
|
||||
e.carryover_add = false;
|
||||
e.gold_bonus = false;
|
||||
e.transient.carryover_report = false;
|
||||
e.prescenario_save = true;
|
||||
e.transient.linger_mode = false;
|
||||
|
@ -3019,9 +3016,6 @@ void console_handler::do_choose_level() {
|
|||
if (size_t(choice) < options.size()) {
|
||||
menu_handler_.gamedata().set_next_scenario(options[choice]);
|
||||
end_level_data &e = menu_handler_.pc_.get_end_level_data();
|
||||
e.carryover_percentage = 100;
|
||||
e.carryover_add = false;
|
||||
e.gold_bonus = false;
|
||||
e.transient.carryover_report = false;
|
||||
e.prescenario_save = true;
|
||||
e.transient.linger_mode = false;
|
||||
|
|
|
@ -124,13 +124,12 @@ void playsingle_controller::init_gui(){
|
|||
}
|
||||
|
||||
void playsingle_controller::report_victory(
|
||||
std::ostringstream &report, int player_gold, int remaining_gold,
|
||||
std::ostringstream &report, team& t,
|
||||
int finishing_bonus_per_turn, int turns_left, int finishing_bonus)
|
||||
{
|
||||
const end_level_data &end_level = get_end_level_data_const();
|
||||
report << _("Remaining gold: ")
|
||||
<< utils::half_signed_value(remaining_gold) << "\n";
|
||||
if(end_level.gold_bonus) {
|
||||
<< utils::half_signed_value(t.gold()) << "\n";
|
||||
if(t.carryover_bonus()) {
|
||||
if (turns_left > -1) {
|
||||
report << _("Early finish bonus: ")
|
||||
<< finishing_bonus_per_turn
|
||||
|
@ -141,32 +140,32 @@ void playsingle_controller::report_victory(
|
|||
<< finishing_bonus << "\n";
|
||||
}
|
||||
report << _("Gold: ")
|
||||
<< utils::half_signed_value(remaining_gold + finishing_bonus);
|
||||
<< utils::half_signed_value(t.gold() + finishing_bonus);
|
||||
}
|
||||
if (remaining_gold > 0) {
|
||||
report << '\n' << _("Carry over percentage: ") << end_level.carryover_percentage;
|
||||
if (t.gold() > 0) {
|
||||
report << '\n' << _("Carry over percentage: ") << t.carryover_percentage();
|
||||
}
|
||||
if(end_level.carryover_add) {
|
||||
report << "\n<b>" << _("Bonus Gold: ") << utils::half_signed_value(player_gold) <<"</b>";
|
||||
if(t.carryover_add()) {
|
||||
report << "\n<b>" << _("Bonus Gold: ") << utils::half_signed_value(t.carryover_gold()) <<"</b>";
|
||||
} else {
|
||||
report << "\n<b>" << _("Retained Gold: ") << utils::half_signed_value(player_gold) << "</b>";
|
||||
report << "\n<b>" << _("Retained Gold: ") << utils::half_signed_value(t.carryover_gold()) << "</b>";
|
||||
}
|
||||
|
||||
std::string goldmsg;
|
||||
utils::string_map symbols;
|
||||
|
||||
symbols["gold"] = lexical_cast_default<std::string>(player_gold);
|
||||
symbols["gold"] = lexical_cast_default<std::string>(t.carryover_gold());
|
||||
|
||||
// Note that both strings are the same in English, but some languages will
|
||||
// want to translate them differently.
|
||||
if(end_level.carryover_add) {
|
||||
if(player_gold > 0) {
|
||||
if(t.carryover_add()) {
|
||||
if(t.carryover_gold() > 0) {
|
||||
goldmsg = vngettext(
|
||||
"You will start the next scenario with $gold "
|
||||
"on top of the defined minimum starting gold.",
|
||||
"You will start the next scenario with $gold "
|
||||
"on top of the defined minimum starting gold.",
|
||||
player_gold, symbols);
|
||||
t.carryover_gold(), symbols);
|
||||
|
||||
} else {
|
||||
goldmsg = vngettext(
|
||||
|
@ -174,7 +173,7 @@ void playsingle_controller::report_victory(
|
|||
"the defined minimum starting gold.",
|
||||
"You will start the next scenario with "
|
||||
"the defined minimum starting gold.",
|
||||
player_gold, symbols);
|
||||
t.carryover_gold(), symbols);
|
||||
}
|
||||
} else {
|
||||
goldmsg = vngettext(
|
||||
|
@ -184,7 +183,7 @@ void playsingle_controller::report_victory(
|
|||
"You will start the next scenario with $gold "
|
||||
"or its defined minimum starting gold, "
|
||||
"whichever is higher.",
|
||||
player_gold, symbols);
|
||||
t.carryover_gold(), symbols);
|
||||
}
|
||||
|
||||
// xgettext:no-c-format
|
||||
|
@ -351,8 +350,6 @@ LEVEL_RESULT playsingle_controller::play_scenario(
|
|||
set_victory_when_enemies_defeated(level_["victory_when_enemies_defeated"].to_bool(true));
|
||||
set_remove_from_carryover_on_defeat(level_["remove_from_carryover_on_defeat"].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();
|
||||
|
||||
bool past_prestart = false;
|
||||
|
||||
|
@ -959,7 +956,6 @@ void playsingle_controller::check_end_level()
|
|||
}
|
||||
return;
|
||||
}
|
||||
get_end_level_data().proceed_to_next_level = (level_result_ == VICTORY);
|
||||
throw end_level_exception(level_result_);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "playturn.hpp"
|
||||
#include "replay.hpp"
|
||||
#include "saved_game.hpp"
|
||||
class team;
|
||||
|
||||
struct set_completion
|
||||
{
|
||||
|
@ -56,8 +57,7 @@ public:
|
|||
virtual void force_end_level(LEVEL_RESULT res)
|
||||
{ level_result_ = res; }
|
||||
virtual void check_end_level();
|
||||
void report_victory(std::ostringstream &report, int player_gold,
|
||||
int remaining_gold, int finishing_bonus_per_turn,
|
||||
void report_victory(std::ostringstream &report, team& t, int finishing_bonus_per_turn,
|
||||
int turns_left, int finishing_bonus);
|
||||
virtual void on_not_observer() {}
|
||||
bool is_host() const ;
|
||||
|
|
|
@ -196,12 +196,22 @@ void saved_game::set_default_save_id()
|
|||
//Set this default value immideately after reading the scenario is importent because otherwise
|
||||
//we might endup settings this value to the multiplayer players name, which would break carryover.
|
||||
//(doing this in at config loading in game_config would be ok too i think.)
|
||||
const config::attribute_value* carryover_percentage = starting_pos_.get("carryover_percentage");
|
||||
const config::attribute_value* carryover_add = starting_pos_.get("carryover_add");
|
||||
BOOST_FOREACH(config& side, starting_pos_.child_range("side"))
|
||||
{
|
||||
if(side["save_id"].str() == "")
|
||||
if(side["save_id"].empty())
|
||||
{
|
||||
side["save_id"] = side["id"];
|
||||
}
|
||||
if(carryover_percentage && side["carryover_percentage"].empty())
|
||||
{
|
||||
side["carryover_percentage"] = *carryover_percentage;
|
||||
}
|
||||
if(carryover_add && side["carryover_add"].empty())
|
||||
{
|
||||
side["carryover_add"] = *carryover_add;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -106,6 +106,7 @@
|
|||
#include <boost/bind.hpp> // for bind_t, bind
|
||||
#include <boost/foreach.hpp> // for auto_any_base, etc
|
||||
#include <boost/intrusive_ptr.hpp> // for intrusive_ptr
|
||||
#include <boost/optional.hpp>
|
||||
#include <boost/range/algorithm/copy.hpp> // boost::copy
|
||||
#include <boost/range/adaptors.hpp> // boost::adaptors::filtered
|
||||
#include <boost/tuple/tuple.hpp> // for tuple
|
||||
|
@ -1414,7 +1415,28 @@ int game_lua_kernel::intf_clear_messages(lua_State*)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
namespace {
|
||||
struct optional_int_visitor : public boost::static_visitor<boost::optional<int> >
|
||||
{
|
||||
template <typename T> result_type operator()(T const &) const
|
||||
{ return result_type(); }
|
||||
result_type operator()(int i) const
|
||||
{ return i; }
|
||||
result_type operator()(unsigned long long u) const
|
||||
{ return static_cast<int>(u); }
|
||||
};
|
||||
|
||||
struct optional_bool_visitor : public boost::static_visitor<boost::optional<bool> >
|
||||
{
|
||||
template <typename T> result_type operator()(T const &) const
|
||||
{ return result_type(); }
|
||||
//Cannot use bool, the case above would catch the yes_no and true_false values.
|
||||
result_type operator()(const config::attribute_value::yes_no & b) const
|
||||
{ return b; }
|
||||
result_type operator()(const config::attribute_value::true_false & b) const
|
||||
{ return b; }
|
||||
};
|
||||
}
|
||||
int game_lua_kernel::intf_end_level(lua_State *L)
|
||||
{
|
||||
vconfig cfg(luaW_checkvconfig(L, 1));
|
||||
|
@ -1426,6 +1448,7 @@ int game_lua_kernel::intf_end_level(lua_State *L)
|
|||
}
|
||||
data.transient.disabled = true;
|
||||
|
||||
// TODO: is this still needed?
|
||||
// Remove 0-hp units from the unit map to avoid the following problem:
|
||||
// In case a die event triggers an endlevel the dead unit is still as a
|
||||
// 'ghost' in linger mode. After save loading in linger mode the unit
|
||||
|
@ -1440,11 +1463,84 @@ int game_lua_kernel::intf_end_level(lua_State *L)
|
|||
}
|
||||
}
|
||||
|
||||
std::string result = cfg["result"];
|
||||
VALIDATE_WITH_DEV_MESSAGE(
|
||||
typedef boost::tuple<bool/*is_victory*/, boost::optional<bool>/*bonus*/, boost::optional<int>/*percentage*/, boost::optional<bool>/*add*/ > t_side_result;
|
||||
const t_side_result default_result = t_side_result(
|
||||
cfg["result"] != "defeat",
|
||||
cfg["bonus"].apply_visitor(optional_bool_visitor()),
|
||||
cfg["carryover_percentage"].apply_visitor(optional_int_visitor()),
|
||||
cfg["carryover_add"].apply_visitor(optional_bool_visitor())
|
||||
);
|
||||
std::vector<t_side_result> side_results = std::vector<t_side_result>(board().teams().size(), default_result);
|
||||
BOOST_FOREACH(const vconfig& side_result, cfg.get_children("result")) {
|
||||
size_t side = side_result["side"].to_int();
|
||||
if(side >= side_results.size()) {
|
||||
return luaL_error(L, "invalid side index %d in [result] in wesnoth.end_level", side);
|
||||
}
|
||||
|
||||
std::string result = side_result["result"];
|
||||
VALIDATE_WITH_DEV_MESSAGE(
|
||||
result.empty() || result == "victory" || result == "defeat"
|
||||
, _("Invalid value in the result key for [end_level]")
|
||||
, "result = '" + result + "'.");
|
||||
|
||||
if(result != "") {
|
||||
side_results[side].get<0>() = result != "defeat";
|
||||
}
|
||||
if(boost::optional<bool> bonus = side_result["bonus"].apply_visitor(optional_bool_visitor())){
|
||||
side_results[side].get<1>() = bonus;
|
||||
}
|
||||
if(boost::optional<int> percentage = side_result["carryover_percentage"].apply_visitor(optional_int_visitor())){
|
||||
side_results[side].get<2>() = percentage;
|
||||
}
|
||||
if(boost::optional<bool> add = side_result["carryover_add"].apply_visitor(optional_bool_visitor())){
|
||||
side_results[side].get<3>() = add;
|
||||
}
|
||||
}
|
||||
//Find out whether it is victory or defeat:
|
||||
// If there is a local human side then we have a victory iff one of those sides has a victory
|
||||
// If there is no local human side but a remote human side then we have a victory iff one of those sides has a victory
|
||||
// else we use the default_result from ouside [result].
|
||||
bool any_human_victory = false;
|
||||
bool local_human_victory = false;
|
||||
bool there_is_a_remote_human = false;
|
||||
bool there_is_a_local_human = false;
|
||||
for(int i = 0; i < static_cast<int>(side_results.size()); ++i) {
|
||||
team& t = teams()[i];
|
||||
const t_side_result result = side_results[i];
|
||||
|
||||
if(t.is_local_human()) {
|
||||
there_is_a_local_human = true;
|
||||
if(result.get<0>()) {
|
||||
local_human_victory = true;
|
||||
any_human_victory = true;
|
||||
}
|
||||
}
|
||||
if(t.is_network_human()) {
|
||||
there_is_a_remote_human = true;
|
||||
if(result.get<0>()) {
|
||||
any_human_victory = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(boost::optional<bool> bonus = result.get<1>()){
|
||||
t.set_carryover_bonus(bonus.get());
|
||||
}
|
||||
if(boost::optional<int> percentage = result.get<2>()){
|
||||
t.set_carryover_percentage(percentage.get());
|
||||
}
|
||||
if(boost::optional<bool> add = result.get<3>()){
|
||||
t.set_carryover_add(add.get());
|
||||
}
|
||||
}
|
||||
if(!there_is_a_remote_human && !there_is_a_local_human) {
|
||||
any_human_victory = default_result.get<0>();
|
||||
}
|
||||
if(!there_is_a_local_human) {
|
||||
local_human_victory = any_human_victory;
|
||||
}
|
||||
data.proceed_to_next_level = any_human_victory;
|
||||
|
||||
|
||||
data.transient.custom_endlevel_music = cfg["music"].str();
|
||||
data.transient.carryover_report = cfg["carryover_report"].to_bool(true);
|
||||
data.prescenario_save = cfg["save"].to_bool(true);
|
||||
|
@ -1452,12 +1548,7 @@ int game_lua_kernel::intf_end_level(lua_State *L)
|
|||
data.transient.linger_mode = cfg["linger_mode"].to_bool(true)
|
||||
&& !teams().empty();
|
||||
data.transient.reveal_map = cfg["reveal_map"].to_bool(true);
|
||||
data.gold_bonus = cfg["bonus"].to_bool(true);
|
||||
data.carryover_percentage = cfg["carryover_percentage"].to_int(game_config::gold_carryover_percentage);
|
||||
data.carryover_add = cfg["carryover_add"].to_bool();
|
||||
|
||||
if(result == "defeat") {
|
||||
data.carryover_add = false;
|
||||
if(!local_human_victory) {
|
||||
play_controller_.force_end_level(DEFEAT);
|
||||
} else {
|
||||
play_controller_.force_end_level(VICTORY);
|
||||
|
|
14
src/team.cpp
14
src/team.cpp
|
@ -108,7 +108,11 @@ team::team_info::team_info() :
|
|||
color(),
|
||||
side(0),
|
||||
persistent(false),
|
||||
lost(false)
|
||||
lost(false),
|
||||
carryover_percentage(game_config::gold_carryover_percentage),
|
||||
carryover_add(false),
|
||||
carryover_bonus(false),
|
||||
carryover_gold(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -138,6 +142,10 @@ void team::team_info::read(const config &cfg)
|
|||
hidden = cfg["hidden"].to_bool();
|
||||
no_turn_confirmation = cfg["suppress_end_turn_confirmation"].to_bool();
|
||||
side = cfg["side"].to_int(1);
|
||||
carryover_percentage = cfg["carryover_percentage"].to_int(game_config::gold_carryover_percentage);
|
||||
carryover_add = cfg["carryover_add"].to_bool(false);
|
||||
carryover_bonus = cfg["carryover_bonus"].to_bool(false);
|
||||
carryover_gold = cfg["carryover_gold"].to_int(0);
|
||||
|
||||
if(cfg.has_attribute("color")) {
|
||||
color = cfg["color"].str();
|
||||
|
@ -246,6 +254,10 @@ void team::team_info::write(config& cfg) const
|
|||
cfg["color"] = color;
|
||||
cfg["persistent"] = persistent;
|
||||
cfg["lost"] = lost;
|
||||
cfg["carryover_percentage"] = carryover_percentage;
|
||||
cfg["carryover_add"] = carryover_add;
|
||||
cfg["carryover_bonus"] = carryover_bonus;
|
||||
cfg["carryover_gold"] = carryover_gold;
|
||||
|
||||
cfg.add_child("ai", ai::manager::to_config(side));
|
||||
}
|
||||
|
|
15
src/team.hpp
15
src/team.hpp
|
@ -154,6 +154,11 @@ private:
|
|||
int side;
|
||||
bool persistent;
|
||||
bool lost;
|
||||
|
||||
int carryover_percentage;
|
||||
bool carryover_add;
|
||||
bool carryover_bonus;
|
||||
int carryover_gold;
|
||||
};
|
||||
|
||||
static const int default_team_gold_;
|
||||
|
@ -334,6 +339,16 @@ public:
|
|||
bool persistent() const {return info_.persistent;}
|
||||
void set_lost(bool value=true) { info_.lost = value; }
|
||||
bool lost() const { return info_.lost; }
|
||||
|
||||
void set_carryover_percentage(int value) { info_.carryover_percentage = value; }
|
||||
int carryover_percentage() const { return info_.carryover_percentage; }
|
||||
void set_carryover_add(bool value) { info_.carryover_add = value; }
|
||||
bool carryover_add() const { return info_.carryover_add; }
|
||||
void set_carryover_bonus(bool value) { info_.carryover_bonus = value; }
|
||||
bool carryover_bonus() const { return info_.carryover_bonus; }
|
||||
void set_carryover_gold(int value) { info_.carryover_gold = value; }
|
||||
int carryover_gold() const { return info_.carryover_gold; }
|
||||
|
||||
bool no_turn_confirmation() const { return info_.no_turn_confirmation; }
|
||||
void set_no_turn_confirmation(bool value) { info_.no_turn_confirmation = value; }
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue