Author: suokko
Date: Mon Sep 1 19:33:32 2008
New Revision: 29168
URL: http://svn.gna.org/viewcvs/wesnoth?rev=29168&view=rev
Log:
Fixed loading ai parameters. MP side defination now overwrites era values (bug
#12171)
Modified:
trunk/changelog
trunk/src/ai.cpp
trunk/src/team.cpp
trunk/src/team.hpp
Modified: trunk/changelog
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/changelog?rev=29168&r1=29167&r2=29168&view=diff
==============================================================================
--- trunk/changelog (original)
+++ trunk/changelog Mon Sep 1 19:33:32 2008
@@ -56,6 +56,8 @@
* Fixed [modify_turns] not updating $turn_number when current= was
used.
* 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)
* Fixed a few inconsistencies related to scenarios which are not at
turn 1 at the beginning (namely start autosave detection and initial
triggering of a matching "turn *" event).
Modified: trunk/src/ai.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/ai.cpp?rev=29168&r1=29167&r2=29168&view=diff
==============================================================================
--- trunk/src/ai.cpp (original)
+++ trunk/src/ai.cpp Mon Sep 1 19:33:32 2008
@@ -336,12 +336,12 @@
// If usage is empty consider any unit.
LOG_AI << name << " considered\n";
if (i->second.usage() == usage || usage == "") {
- found = true;
LOG_AI << name << " considered for " << usage << "
recruitment\n";
if (!recruits.count(name)) {
LOG_AI << name << " rejected, not in
recruitment list\n";
continue;
}
+ found = true;
if (current_team().gold() - i->second.cost() <
min_gold) {
LOG_AI << name << " rejected, cost too high
(cost: " << i->second.cost() << ", current gold: " << current_team().gold()
<<", min_gold: " << min_gold << ")\n";
@@ -369,6 +369,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;
}
@@ -1841,12 +1847,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: trunk/src/team.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/team.cpp?rev=29168&r1=29167&r2=29168&view=diff
==============================================================================
--- trunk/src/team.cpp (original)
+++ trunk/src/team.cpp Mon Sep 1 19:33:32 2008
@@ -79,7 +79,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),
@@ -109,14 +111,16 @@
music(cfg["music"]),
colour(cfg["colour"].size() ? cfg["colour"] : cfg["side"])
{
+ // If are starting new scenario overide settings from [ai] tags
if (!user_team_name.translatable())
user_team_name = user_team_name.from_serialized(user_team_name);
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);
}
}
@@ -189,13 +193,15 @@
else
controller = AI;
- if(ai_algorithm.empty()) {
+ if(ai_algorithm.empty()
+) {
ai_algorithm = global_ai_params["ai_algorithm"];
}
std::string scouts_val = cfg["villages_per_scout"];
- if(scouts_val.empty()) {
+ if(scouts_val.empty()
+) {
scouts_val = global_ai_params["villages_per_scout"];
}
@@ -207,7 +213,8 @@
std::string leader_val = cfg["leader_value"];
- if(leader_val.empty()) {
+ if(leader_val.empty()
+) {
leader_val = global_ai_params["leader_value"];
}
@@ -219,7 +226,8 @@
std::string village_val = cfg["village_value"];
- if(village_val.empty()) {
+ if(village_val.empty()
+) {
village_val = global_ai_params["village_value"];
}
@@ -229,15 +237,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()) {
@@ -320,6 +360,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"));
@@ -335,10 +377,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;
@@ -370,8 +423,6 @@
countdown_time_(0),
action_bonus_count_(0),
aiparams_(),
- aggression_(0.0),
- caution_(0.0),
enemies_(),
seen_(),
ally_shroud_(),
@@ -472,8 +523,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: trunk/src/team.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/team.hpp?rev=29168&r1=29167&r2=29168&view=diff
==============================================================================
--- trunk/src/team.hpp (original)
+++ trunk/src/team.hpp Mon Sep 1 19:33:32 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; }
@@ -304,8 +316,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