Change behavior of recruitment_save_gold.

This commit is contained in:
flix 2013-09-26 03:02:34 +02:00
parent 213677b710
commit d3e24eef3a
2 changed files with 23 additions and 19 deletions

View file

@ -96,7 +96,7 @@
[/aspect]
{DEFAULT_ASPECT_EMPTY recruitment_more}
{DEFAULT_ASPECT_EMPTY recruitment_pattern}
{DEFAULT_ASPECT_VALUE recruitment_randomness 15}
{DEFAULT_ASPECT_VALUE recruitment_randomness 50}
[aspect]
id=recruitment_save_gold
engine=cpp
@ -106,8 +106,8 @@
name=standard_aspect
[value]
active=2
begin=1.0
end=0.7
begin=1.1
end=0.9
spend_all_gold=-1
[/value]
[/default]

View file

@ -65,7 +65,7 @@ namespace {
// When a enemy is in this radius around a leader, this leader is tagged as 'in danger'.
// If gold is available, this leader will recruit as much units as possible.
const static int LEADER_IN_DANGER_RADIUS = 3;
const static int LEADER_IN_DANGER_RADIUS = 5;
// This is used for a income estimation. We'll calculate the estimated income of this much
// future turns and decide if we'd gain gold if we start to recruit no units anymore.
@ -726,7 +726,7 @@ void recruitment::show_important_hexes() const {
}
resources::screen->labels().clear_all();
BOOST_FOREACH(const map_location& loc, important_hexes_) {
// Little hack: use map_location north from loc and make 2 linebreaks to center the dot
// Little hack: use map_location north from loc and make 2 linebreaks to center the "X".
resources::screen->labels().set_label(loc.get_direction(map_location::NORTH), "\n\nX");
}
}
@ -1462,21 +1462,25 @@ double recruitment::get_estimated_village_gain() const {
*/
double recruitment::get_unit_ratio() const {
const unit_map& units = *resources::units;
double own_total_value = 0.;
double enemy_total_value = 0.;
BOOST_FOREACH(const unit& unit, units) {
if (unit.incapacitated() || unit.total_movement() <= 0) {
continue;
}
double value = unit.cost() * unit.hitpoints() / unit.max_hitpoints();
if (current_team().is_enemy(unit.side())) {
enemy_total_value += value;
} else {
own_total_value += value;
}
double own_total_value = 0.;
double enemy_total_value = 0.;
BOOST_FOREACH(const unit& unit, units) {
if (unit.incapacitated() || unit.total_movement() <= 0 || unit.can_recruit()) {
continue;
}
if (enemy_total_value == 0) {
return 999.; // Should never happen
double value = unit.cost() * unit.hitpoints() / unit.max_hitpoints();
if (current_team().is_enemy(unit.side())) {
enemy_total_value += value;
} else {
own_total_value += value;
}
}
// If only the leader is left, the values could be 0.
// Catch those cases and return something reasonable.
if (own_total_value == 0. && enemy_total_value == 0.) {
return 0.;
} else if (enemy_total_value == 0.) {
return 2.;
}
return own_total_value / enemy_total_value;
}