Author: suokko
Date: Mon Sep 1 19:41:59 2008
New Revision: 29170
URL: http://svn.gna.org/viewcvs/wesnoth?rev=29170&view=rev
Log:
Backported: Fixed loading ai parameters. MP side defination now overwrites era
values (bug #12171)
Modified:
branches/1.4/changelog
branches/1.4/src/ai.cpp
branches/1.4/src/team.cpp
branches/1.4/src/team.hpp
Modified: branches/1.4/changelog
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.4/changelog?rev=29170&r1=29169&r2=29170&view=diff
==============================================================================
--- branches/1.4/changelog (original)
+++ branches/1.4/changelog Mon Sep 1 19:41:59 2008
@@ -14,6 +14,8 @@
* miscellaneous and bug fixes:
* Fixed OOS bug when giving control and having move in undo stack.
* Fixed crash when ai moves units next to level 0 hiden unit (bug #12252)
+ * Fixed loading ai parameters. MP side defination now overwrites
+ era values (bug #12171)
Version 1.4.4:
* language and i18n:
Modified: branches/1.4/src/ai.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.4/src/ai.cpp?rev=29170&r1=29169&r2=29170&view=diff
==============================================================================
--- branches/1.4/src/ai.cpp (original)
+++ branches/1.4/src/ai.cpp Mon Sep 1 19:41:59 2008
@@ -266,9 +266,10 @@
const std::string& name = i->second.id();
// If usage is empty consider any unit.
if (i->second.usage() == usage || usage == "") {
+ if (recruits.count(name) == 0)
+ continue;
found = true;
- if(recruits.count(name)
- && current_team().gold() - i->second.cost() >
min_gold
+ if(current_team().gold() - i->second.cost() > min_gold
&& not_recommended_units_.count(name) == 0)
{
LOG_AI << "recommending '" << name << "'\n";
@@ -287,6 +288,12 @@
} else {
WRN_AI << "Trying to recruit a: " << usage
<< " but no unit of that type (usage=) is available.\n";
+
+ if (usage != "")
+ {
+ return
current_team().remove_recruitment_pattern_entry(usage);
+ // remove this recruitment pattern and try again
+ }
}
return false;
}
@@ -1761,12 +1768,12 @@
// If there is no recruitment_pattern use "" which makes us consider
// any unit available.
- if (options.empty()) {
- options.push_back("");
- }
- // Buy units as long as we have room and can afford it.
- while(recruit_usage(options[rand()%options.size()])) {
- }
+ do {
+ if (options.empty()) {
+ options.push_back("");
+ }
+ // Buy units as long as we have room and can afford it.
+ }while(recruit_usage(options[rand()%options.size()]));
}
void ai::move_leader_to_goals( const move_map& enemy_dstsrc)
Modified: branches/1.4/src/team.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.4/src/team.cpp?rev=29170&r1=29169&r2=29170&view=diff
==============================================================================
--- branches/1.4/src/team.cpp (original)
+++ branches/1.4/src/team.cpp Mon Sep 1 19:41:59 2008
@@ -78,7 +78,7 @@
income(cfg["income"]),
income_per_village(),
can_recruit(),
- global_recruitment_pattern(),
+
global_recruitment_pattern(utils::split(cfg["global_recruitment_pattern"])),
recruitment_pattern(utils::split(cfg["recruitment_pattern"])),
enemies(),
team_name(cfg["team_name"]),
@@ -100,6 +100,8 @@
villages_per_scout(),
leader_value(0.0),
village_value(0.0),
+ aggression_(0.5),
+ caution_(0.25),
targets(),
share_maps(false),
share_view(false),
@@ -111,10 +113,11 @@
{
config global_ai_params;
const config::child_list& ai_parameters = cfg.get_children("ai");
- for(config::child_list::const_iterator aiparam = ai_parameters.begin();
aiparam != ai_parameters.end(); ++aiparam) {
+ for(config::child_list::const_reverse_iterator aiparam =
ai_parameters.rbegin(); aiparam != ai_parameters.rend(); ++aiparam) {
ai_params.push_back(**aiparam);
if((**aiparam)["turns"].empty() &&
(**aiparam)["time_of_day"].empty()) {
+// LOG_NG << "Global ai entry: " << **aiparam << "\n";
global_ai_params.append(**aiparam);
}
}
@@ -190,7 +193,8 @@
std::string scouts_val = cfg["villages_per_scout"];
- if(scouts_val.empty()) {
+ if(scouts_val.empty()
+) {
scouts_val = global_ai_params["villages_per_scout"];
}
@@ -202,7 +206,8 @@
std::string leader_val = cfg["leader_value"];
- if(leader_val.empty()) {
+ if(leader_val.empty()
+) {
leader_val = global_ai_params["leader_value"];
}
@@ -214,7 +219,8 @@
std::string village_val = cfg["village_value"];
- if(village_val.empty()) {
+ if(village_val.empty()
+) {
village_val = global_ai_params["village_value"];
}
@@ -224,15 +230,47 @@
village_value = atof(village_val.c_str());
}
+ std::string aggression_val = cfg["aggression"];
+
+ if(aggression_val.empty()
+) {
+ aggression_val = global_ai_params["aggression"];
+ }
+
+ if(aggression_val.empty()) {
+ aggression_ = 0.5;
+ } else {
+ aggression_ = atof(aggression_val.c_str());
+ }
+
+ std::string caution_val = cfg["caution"];
+
+ if(caution_val.empty()
+) {
+ caution_val = global_ai_params["caution"];
+ }
+
+ if(caution_val.empty()) {
+ caution_ = 1.0;
+ } else {
+ caution_ = atof(caution_val.c_str());
+ }
+
+
std::vector<std::string> recruits = utils::split(cfg["recruit"]);
for(std::vector<std::string>::const_iterator i = recruits.begin(); i !=
recruits.end(); ++i) {
can_recruit.insert(*i);
}
- if(recruitment_pattern.empty()) {
+ if(recruitment_pattern.empty()
+) {
recruitment_pattern =
utils::split(global_ai_params["recruitment_pattern"]);
- }
+ LOG_NG << "Recruitment pattern: " <<
global_ai_params["recruitment_pattern"] << "\n";
+ } else {
+ LOG_NG << "Recruitment pattern from side: " <<
cfg["recruitment_pattern"] << "\n";
+ }
+
/* // Default recruitment pattern is to buy 2 fighters for every 1 archer
if(recruitment_pattern.empty()) {
@@ -314,6 +352,8 @@
cfg["villages_per_scout"] = str_cast(villages_per_scout);
cfg["leader_value"] = str_cast(leader_value);
cfg["village_value"] = str_cast(village_value);
+ cfg["aggression"] = str_cast(aggression_);
+ cfg["caution"] = str_cast(caution_);
for(std::vector<target>::const_iterator tg = targets.begin(); tg !=
targets.end(); ++tg) {
tg->write(cfg.add_child("target"));
@@ -329,10 +369,21 @@
cfg["recruit"] = can_recruit_str.str();
+ std::stringstream global_recruit_pattern_str;
+ for(std::vector<std::string>::const_iterator p =
global_recruitment_pattern.begin();
+ p != global_recruitment_pattern.end(); ++p) {
+ if(p != global_recruitment_pattern.begin())
+ global_recruit_pattern_str << ",";
+
+ global_recruit_pattern_str << *p;
+ }
+
+ cfg["global_recruitment_pattern"] = global_recruit_pattern_str.str();
+
std::stringstream recruit_pattern_str;
- std::vector<std::string> rp = global_recruitment_pattern;
- for(std::vector<std::string>::const_iterator p = rp.begin(); p !=
rp.end(); ++p) {
- if(p != rp.begin())
+ for(std::vector<std::string>::const_iterator p =
recruitment_pattern.begin();
+ p != recruitment_pattern.end(); ++p) {
+ if(p != recruitment_pattern.begin())
recruit_pattern_str << ",";
recruit_pattern_str << *p;
@@ -359,8 +410,6 @@
countdown_time_(0),
action_bonus_count_(0),
aiparams_(),
- aggression_(0.0),
- caution_(0.0),
enemies_(),
seen_(),
ally_shroud_(),
@@ -461,8 +510,8 @@
info_.recruitment_pattern =
utils::split(aiparams_["recruitment_pattern"]);
if (info_.recruitment_pattern.empty())
info_.recruitment_pattern = info_.global_recruitment_pattern;
- aggression_ = lexical_cast_default<double>(aiparams_["aggression"],0.5);
- caution_ = lexical_cast_default<double>(aiparams_["caution"],0.25);
+ info_.aggression_ =
lexical_cast_default<double>(aiparams_["aggression"],0.5);
+ info_.caution_ =
lexical_cast_default<double>(aiparams_["caution"],0.25);
}
bool team::calculate_enemies(size_t index) const
Modified: branches/1.4/src/team.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/branches/1.4/src/team.hpp?rev=29170&r1=29169&r2=29170&view=diff
==============================================================================
--- branches/1.4/src/team.hpp (original)
+++ branches/1.4/src/team.hpp Mon Sep 1 19:41:59 2008
@@ -105,6 +105,8 @@
int villages_per_scout;
double leader_value, village_value;
+ //cached values for ai parameters
+ double aggression_, caution_;
std::vector<target> targets;
@@ -160,6 +162,16 @@
std::set<std::string>& recruits() { return info_.can_recruit; }
const std::vector<std::string>& recruitment_pattern() const
{ return info_.recruitment_pattern; }
+ bool remove_recruitment_pattern_entry(const std::string& key)
+ {
+ std::vector<std::string>::iterator itor =
std::find(info_.recruitment_pattern.begin(),
+ info_.recruitment_pattern.end(),
+ key);
+ if (itor == info_.recruitment_pattern.end())
+ return false;
+ info_.recruitment_pattern.erase(itor);
+ return true;
+ }
const std::string& name() const
{ return info_.name; }
const std::string& save_id() const { return info_.save_id; }
@@ -195,8 +207,8 @@
seen_[index] = true;
}
- double aggression() const { return aggression_; }
- double caution() const { return caution_; }
+ double aggression() const { return info_.aggression_; }
+ double caution() const { return info_.caution_; }
team_info::CONTROLLER controller() const { return info_.controller; }
bool is_human() const { return info_.controller == team_info::HUMAN; }
@@ -295,8 +307,6 @@
config aiparams_;
- //cached values for ai parameters
- double aggression_, caution_;
bool calculate_enemies(size_t index) const;
bool calculate_is_enemy(size_t index) const;
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits