static void show_carryover_message(saved_game& gamestate, playsingle_controller& playcontroller, display& disp, const end_level_data& end_level, const LEVEL_RESULT res){ bool has_next_scenario = !resources::gamedata->next_scenario().empty() && resources::gamedata->next_scenario() != "null"; //maybe this can be the case for scenario that only contain a story and end during the prestart event ? if(resources::teams->size() < 1){ return; } std::ostringstream report; std::string title; bool obs = playcontroller.is_observer(); if (obs) { title = _("Scenario Report"); } else if (res == LEVEL_RESULT::VICTORY) { title = _("Victory"); report << "<b>" << _("You have emerged victorious!") << "</b>\n\n"; } else { title = _("Defeat"); report << _("You have been defeated!") << "\n"; } 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()){ ++persistent_teams; } } if (persistent_teams > 0 && ((has_next_scenario && end_level.proceed_to_next_level)|| gamestate.classification().campaign_type == game_classification::CAMPAIGN_TYPE::TEST)) { gamemap map = playcontroller.get_map_const(); tod_manager tod = playcontroller.get_tod_manager_const(); int turns_left = std::max<int>(0, tod.number_of_turns() - tod.turn()); BOOST_FOREACH(team &t, teams) { if (!t.persistent() || t.lost()) { continue; } int finishing_bonus_per_turn = map.villages().size() * t.village_gold() + t.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(!t.is_local_human()) { continue; } if (persistent_teams > 1) { report << "\n<b>" << t.current_player() << "</b>\n"; } playcontroller.report_victory(report, t, finishing_bonus_per_turn, turns_left, finishing_bonus); } }
// Modify a number by string representing integer difference, or optionally % int apply_modifier( const int number, const std::string &amount, const int minimum ) { // wassert( amount.empty() == false ); int value = atoi(amount.c_str()); if(amount[amount.size()-1] == '%') { value = div100rounded(number * value); } value += number; if (( minimum > 0 ) && ( value < minimum )) value = minimum; return value; }
static void show_carryover_message(saved_game& gamestate, playsingle_controller& playcontroller, display& disp, const end_level_data& end_level, const LEVEL_RESULT res){ bool has_next_scenario = !resources::gamedata->next_scenario().empty() && resources::gamedata->next_scenario() != "null"; //maybe this can be the case for scenario that only contain a story and end during the prestart event ? if(resources::teams->size() < 1){ return; } std::ostringstream report; std::string title; bool obs = playcontroller.is_observer(); if (obs) { title = _("Scenario Report"); } else if (res == VICTORY) { title = _("Victory"); report << "<b>" << _("You have emerged victorious!") << "</b>\n\n"; } else { title = _("Defeat"); report << _("You have been defeated!") << "\n"; } std::vector<team> teams = playcontroller.get_teams_const(); int persistent_teams = 0; BOOST_FOREACH(const team &t, teams) { if (t.persistent()){ ++persistent_teams; } } if (persistent_teams > 0 && ((has_next_scenario && end_level.proceed_to_next_level)|| 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 teh same for all teams // the function that actualy 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) { if (!t.persistent() || t.lost() || !t.is_human()) { continue; } int carryover_gold = div100rounded((t.gold() + finishing_bonus) * end_level.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); } }
void playsingle_controller::store_gold(bool obs) { bool has_next_scenario = !gamestate_.classification().next_scenario.empty() && gamestate_.classification().next_scenario != "null"; std::ostringstream report; std::string title; if (obs) { title = _("Scenario Report"); } else { persist_.end_transaction(); title = _("Victory"); report << help::tintegrate::generate_format(_("You have emerged victorious!"), "green") << "\n\n"; } end_level_data &end_level = get_end_level_data(); if (has_next_scenario || gamestate_.classification().campaign_type == "test") { int finishing_bonus_per_turn = map_.villages().size() * game_config::village_income + game_config::base_income; int turns_left = std::max<int>(0, tod_manager_.number_of_turns() - turn()); int finishing_bonus = (end_level.gold_bonus && turns_left > -1) ? finishing_bonus_per_turn * turns_left : 0; BOOST_FOREACH (const team &t, teams_) { if (true) continue; int carryover_gold = div100rounded((t.gold() + finishing_bonus) * end_level.carryover_percentage); config::child_itors side_range = gamestate_.snapshot.child_range("side"); config::child_iterator side_it = side_range.first; // Check if this side already exists in the snapshot. while (side_it != side_range.second) { if ((*side_it)["save_id"] == t.save_id()) { (*side_it)["gold"] = str_cast<int>(carryover_gold); (*side_it)["gold_add"] = end_level.carryover_add; (*side_it)["color"] = t.color(); (*side_it)["current_player"] = t.current_player(); (*side_it)["name"] = t.name(); break; } ++side_it; } // If it doesn't, add a new child. if (side_it == side_range.second) { config &new_side = gamestate_.snapshot.add_child("side"); new_side["save_id"] = t.save_id(); new_side["gold"] = str_cast<int>(carryover_gold); new_side["gold_add"] = end_level.carryover_add; new_side["color"] = t.color(); new_side["current_player"] = t.current_player(); new_side["name"] = t.name(); } // Only show the report for ourselves. if (!t.is_human()) continue; report_victory(report, carryover_gold, t.gold(), finishing_bonus_per_turn, turns_left, finishing_bonus); } }