Author: esr
Date: Wed Oct 22 21:56:24 2008
New Revision: 30312
URL: http://svn.gna.org/viewcvs/wesnoth?rev=30312&view=rev
Log:
Forward-port suokko's improvements to AI recruitment, previously
reverted as an emergency fix, from r29484 and 29497.
Modified:
trunk/src/ai.cpp
trunk/src/ai.hpp
trunk/src/ai_move.cpp
trunk/src/ai_village.cpp
trunk/src/formula_ai.cpp
trunk/src/formula_ai.hpp
Modified: trunk/src/ai.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/ai.cpp?rev=30312&r1=30311&r2=30312&view=diff
==============================================================================
--- trunk/src/ai.cpp (original)
+++ trunk/src/ai.cpp Wed Oct 22 21:56:24 2008
@@ -175,18 +175,20 @@
}
}
- void do_recruitment() {
+ bool do_recruitment() {
const std::set<std::string>& options =
current_team().recruits();
- if (!options.empty()) {
+ if (!options.empty()) {
const int choice = (rand()%options.size());
std::set<std::string>::const_iterator i =
options.begin();
std::advance(i,choice);
const bool res = recruit(*i);
if(res) {
- do_recruitment();
- }
- }
+ return do_recruitment();
+ }
+ return true;
+ }
+ return false;
}
};
@@ -296,7 +298,7 @@
avoid_(),
unit_stats_cache_(),
attack_depth_(0),
- recruiting_prefered_(false)
+ recruiting_preferred_(0)
{}
void ai::new_turn()
@@ -971,10 +973,31 @@
void ai::evaluate_recruiting_value(unit_map::iterator leader)
{
- const int gold = current_team().gold();
-// const int unit_price = current_team().average_recruit_price();
-// recruiting_prefered_ = (gold/unit_price) >
min_recruiting_value_to_force_recruit && !map_.is_keep();
- recruiting_prefered_ = gold > min_recruiting_value_to_force_recruit &&
!map_.is_keep(leader->first);
+ if (recruiting_preferred_ == 2)
+ {
+ recruiting_preferred_ = 0;
+ return;
+ }
+ if (current_team().num_pos_recruits_to_force()< 0.01f)
+ {
+ return;
+ }
+
+ float free_slots = 0.0f;
+ if (map_.is_keep(leader->first))
+ {
+ std::set<location> checked_hexes;
+ checked_hexes.insert(leader->first);
+ free_slots = count_free_hexes_in_castle(leader->first,
checked_hexes);
+ }
+ const float gold = current_team().gold();
+ const float unit_price = current_team().average_recruit_price();
+ recruiting_preferred_ = (gold/unit_price) - free_slots >
current_team().num_pos_recruits_to_force();
+ DBG_AI << "recruiting preferred: " <<
(recruiting_preferred_?"yes":"no") <<
+ " units to recruit: " << (gold/unit_price) <<
+ " unit_price: " << unit_price <<
+ " free slots: " << free_slots <<
+ " limit: " << current_team().num_pos_recruits_to_force() <<
"\n";
}
void ai::do_move()
@@ -1157,7 +1180,7 @@
LOG_AI << "attack option rated at " << rating << " ("
<< current_team().aggression() << ")\n";
- if (recruiting_prefered_)
+ if (recruiting_preferred_)
{
unit_map::unit_iterator u =
units_.find(it->movements[0].first);
if (u != units_.end()
@@ -1814,11 +1837,11 @@
}
}
-void ai::do_recruitment()
+bool ai::do_recruitment()
{
const unit_map::const_iterator leader = find_leader(units_,team_num_);
if(leader == units_.end()) {
- return;
+ return false;
}
const location& start_pos = nearest_keep(leader->first);
@@ -1892,12 +1915,16 @@
options.push_back("");
}
// Buy units as long as we have room and can afford it.
+ bool ret = false;
while (recruit_usage(options[rand()%options.size()])) {
+ ret = true;
options = current_team().recruitment_pattern();
if (options.empty()) {
options.push_back("");
}
}
+
+ return ret;
}
void ai::move_leader_to_goals( const move_map& enemy_dstsrc)
Modified: trunk/src/ai.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/ai.hpp?rev=30312&r1=30311&r2=30312&view=diff
==============================================================================
--- trunk/src/ai.hpp (original)
+++ trunk/src/ai.hpp Wed Oct 22 21:56:24 2008
@@ -91,7 +91,7 @@
const unit_map::const_iterator un, const move_map&
srcdst,
const move_map& dstsrc, const move_map& enemy_dstsrc,
double caution);
- virtual void do_recruitment();
+ virtual bool do_recruitment();
virtual void move_leader_to_keep(const move_map& enemy_dstsrc);
virtual void move_leader_after_recruit(const move_map& srcdst,
@@ -377,7 +377,7 @@
const std::map<map_location,paths>& possible_moves,
const std::multimap<map_location,map_location>& enemy_dstsrc)
const;
- bool recruiting_prefered_;
+ int recruiting_preferred_;
static const int min_recruiting_value_to_force_recruit = 28;
};
Modified: trunk/src/ai_move.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/ai_move.cpp?rev=30312&r1=30311&r2=30312&view=diff
==============================================================================
--- trunk/src/ai_move.cpp (original)
+++ trunk/src/ai_move.cpp Wed Oct 22 21:56:24 2008
@@ -853,7 +853,7 @@
:0);
const int enemy = (power_projection(*i,
enemy_dstsrc) * 8 * leader->second.total_movement())/leader->second.hitpoints();
int multiturn_move_penalty = 0;
- if (recruiting_prefered_)
+ if (recruiting_preferred_)
multiturn_move_penalty = 2;
const int distance_value = (distance >
leader->second.movement_left()?
Modified: trunk/src/ai_village.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/ai_village.cpp?rev=30312&r1=30311&r2=30312&view=diff
==============================================================================
--- trunk/src/ai_village.cpp (original)
+++ trunk/src/ai_village.cpp Wed Oct 22 21:56:24 2008
@@ -262,7 +262,7 @@
{
std::map<location, double> vulnerability;
- const bool passive_leader = recruiting_prefered_ ||
+ const bool passive_leader = recruiting_preferred_ ||
utils::string_bool(current_team().ai_parameters()["passive_leader"]);
size_t min_distance = 100000;
Modified: trunk/src/formula_ai.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/formula_ai.cpp?rev=30312&r1=30311&r2=30312&view=diff
==============================================================================
--- trunk/src/formula_ai.cpp (original)
+++ trunk/src/formula_ai.cpp Wed Oct 22 21:56:24 2008
@@ -1771,10 +1771,10 @@
}
-void formula_ai::do_recruitment()
+bool formula_ai::do_recruitment()
{
if(!recruit_formula_) {
- return;
+ return false;
}
variant var = recruit_formula_->execute(*this);
@@ -1787,17 +1787,19 @@
vars.push_back(var);
}
+ bool ret = false;
for(std::vector<variant>::const_iterator i = vars.begin(); i !=
vars.end(); ++i) {
if(!i->is_string()) {
- return;
+ return false;
}
if(!recruit(i->as_string())) {
- return;
- }
- }
-
- do_recruitment();
+ return ret;
+ }
+ ret = true;
+ }
+
+ return do_recruitment();
}
namespace {
Modified: trunk/src/formula_ai.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/formula_ai.hpp?rev=30312&r1=30311&r2=30312&view=diff
==============================================================================
--- trunk/src/formula_ai.hpp (original)
+++ trunk/src/formula_ai.hpp Wed Oct 22 21:56:24 2008
@@ -153,7 +153,7 @@
void handle_exception(game_logic::formula_error& e);
void handle_exception(game_logic::formula_error& e, const std::string&
failed_operation);
void display_message(const std::string& msg);
- void do_recruitment();
+ bool do_recruitment();
bool make_move(game_logic::const_formula_ptr formula_, const
game_logic::formula_callable& variables);
bool execute_variant(const variant& var, bool commandline=false);
virtual variant get_value(const std::string& key) const;
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits