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

Reply via email to