Author: dragonking
Date: Wed Jul 30 18:05:11 2008
New Revision: 28268

URL: http://svn.gna.org/viewcvs/wesnoth?rev=28268&view=rev
Log:
Changed a way how max_possible_damage_with_retaliation function works, current 
one should be a better one

Modified:
    trunk/src/formula_ai.cpp

Modified: trunk/src/formula_ai.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/formula_ai.cpp?rev=28268&r1=28267&r2=28268&view=diff
==============================================================================
--- trunk/src/formula_ai.cpp (original)
+++ trunk/src/formula_ai.cpp Wed Jul 30 18:05:11 2008
@@ -904,7 +904,8 @@
                std::vector<variant> vars;
 
                //store best damage and best attack causing it
-               int best = 0;
+               int best_melee = 0;
+               int best_ranged = 0;
                std::vector<attack_type>::const_iterator best_attack;
 
                //vectors with attacks for attacker and defender
@@ -928,29 +929,38 @@
 
                                for(std::vector<attack_type>::const_iterator i 
= att_attacks.begin(); i != att_attacks.end(); ++i) {
                                        const int dmg = 
round_damage(i->damage(), defender.damage_from(*i, false, gamemap::location()), 
100) * i->num_attacks();
-                                       if(dmg > best)
+                                       if ( i->range() == "melee")
                                        {
-                                               best = dmg;
-                                               best_attack = i;
+                                               if(dmg > best_melee)
+                                                       best_melee = dmg;
+                                       } else {
+                                               if(dmg > best_ranged)
+                                                       best_ranged = dmg;
                                        }
                                }
                                
                                //we have max damage inflicted by attacker, now 
we need to search for max possible damage of defender (search only for attack 
with the same range)
-                               vars.push_back(variant(best));
-
-                               best = 0;
+                               vars.push_back(variant(best_melee));
+                               vars.push_back(variant(best_ranged));
+
+                               best_melee = 0;
+                               best_ranged = 0;
                                def_attacks = defender.attacks();
 
                                for(std::vector<attack_type>::const_iterator i 
= def_attacks.begin(); i != def_attacks.end(); ++i) {
-                                       if(i->range() != best_attack->range())
-                                               continue;
-
                                        const int dmg = 
round_damage(i->damage(), attacker.damage_from(*i, false, gamemap::location()), 
100) * i->num_attacks();
-                                       if(dmg > best)
-                                               best = dmg;
+                                       if ( i->range() == "melee")
+                                       {
+                                               if(dmg > best_melee)
+                                                       best_melee = dmg;
+                                       } else {
+                                               if(dmg > best_ranged)
+                                                       best_ranged = dmg;
+                                       }
                                }
 
-                               vars.push_back(variant(best));
+                               vars.push_back(variant(best_melee));
+                               vars.push_back(variant(best_ranged));
                                return variant(&vars);
                        
                        } else
@@ -959,28 +969,37 @@
 
                                for(std::vector<attack_type>::const_iterator i 
= att_attacks.begin(); i != att_attacks.end(); ++i) {
                                        const int dmg = 
round_damage(i->damage(), defender.movement_type().resistance_against(*i), 100) 
* i->num_attacks();
-                                       if(dmg > best)
+                                       if ( i->range() == "melee")
                                        {
-                                               best = dmg;
-                                               best_attack = i;
+                                               if(dmg > best_melee)
+                                                       best_melee = dmg;
+                                       } else {
+                                               if(dmg > best_ranged)
+                                                       best_ranged = dmg;
                                        }
                                }
 
-                               vars.push_back(variant(best));
-
-                               best = 0;
+                               vars.push_back(variant(best_melee));
+                               vars.push_back(variant(best_ranged));
+
+                               best_melee = 0;
+                               best_ranged = 0;
                                def_attacks_tmp = defender.attacks();
 
                                for(std::vector<attack_type>::const_iterator i 
= def_attacks.begin(); i != def_attacks.end(); ++i) {
-                                       if(i->range() != best_attack->range())
-                                               continue;
-
                                        const int dmg = 
round_damage(i->damage(), attacker.damage_from(*i, false, gamemap::location()), 
100) * i->num_attacks();
-                                       if(dmg > best)
-                                               best = dmg;
+                                       if ( i->range() == "melee")
+                                       {
+                                               if(dmg > best_melee)
+                                                       best_melee = dmg;
+                                       } else {
+                                               if(dmg > best_ranged)
+                                                       best_ranged = dmg;
+                                       }
                                }
 
-                               vars.push_back(variant(best));
+                               vars.push_back(variant(best_melee));
+                               vars.push_back(variant(best_ranged));
                                return variant(&vars);
                        }
 
@@ -996,29 +1015,38 @@
 
                                for(std::vector<attack_type>::const_iterator i 
= att_attacks.begin(); i != att_attacks.end(); ++i) {
                                        const int dmg = 
round_damage(i->damage(), defender.damage_from(*i, false, gamemap::location()), 
100) * i->num_attacks();
-                                       if(dmg > best)
+                                       if ( i->range() == "melee")
                                        {
-                                               best = dmg;
-                                               best_attack = i;
+                                               if(dmg > best_melee)
+                                                       best_melee = dmg;
+                                       } else {
+                                               if(dmg > best_ranged)
+                                                       best_ranged = dmg;
                                        }
                                }
                                
                                //we have max damage inflicted by attacker, now 
we need to search for max possible damage of defender (search only for attack 
with the same range)
-                               vars.push_back(variant(best));
-
-                               best = 0;
+                               vars.push_back(variant(best_melee));
+                               vars.push_back(variant(best_ranged));
+
+                               best_melee = 0;
+                               best_ranged = 0;
                                def_attacks = defender.attacks();
 
                                for(std::vector<attack_type>::const_iterator i 
= def_attacks.begin(); i != def_attacks.end(); ++i) {
-                                       if(i->range() != best_attack->range())
-                                               continue;
-
                                        const int dmg = 
round_damage(i->damage(), attacker.movement_type().resistance_against(*i), 100) 
* i->num_attacks();
-                                       if(dmg > best)
-                                               best = dmg;
+                                       if ( i->range() == "melee")
+                                       {
+                                               if(dmg > best_melee)
+                                                       best_melee = dmg;
+                                       } else {
+                                               if(dmg > best_ranged)
+                                                       best_ranged = dmg;
+                                       }
                                }
 
-                               vars.push_back(variant(best));
+                               vars.push_back(variant(best_melee));
+                               vars.push_back(variant(best_ranged));
                                return variant(&vars);
                        
                        } else
@@ -1027,28 +1055,37 @@
 
                                for(std::vector<attack_type>::const_iterator i 
= att_attacks.begin(); i != att_attacks.end(); ++i) {
                                        const int dmg = 
round_damage(i->damage(), defender.movement_type().resistance_against(*i), 100) 
* i->num_attacks();
-                                       if(dmg > best)
+                                       if ( i->range() == "melee")
                                        {
-                                               best = dmg;
-                                               best_attack = i;
+                                               if(dmg > best_melee)
+                                                       best_melee = dmg;
+                                       } else {
+                                               if(dmg > best_ranged)
+                                                       best_ranged = dmg;
                                        }
                                }
 
-                               vars.push_back(variant(best));
-
-                               best = 0;
+                               vars.push_back(variant(best_melee));
+                               vars.push_back(variant(best_ranged));
+
+                               best_melee = 0;
+                               best_ranged = 0;
                                def_attacks_tmp = defender.attacks();
 
                                for(std::vector<attack_type>::const_iterator i 
= def_attacks.begin(); i != def_attacks.end(); ++i) {
-                                       if(i->range() != best_attack->range())
-                                               continue;
-
                                        const int dmg = 
round_damage(i->damage(), attacker.movement_type().resistance_against(*i), 100) 
* i->num_attacks();
-                                       if(dmg > best)
-                                               best = dmg;
+                                       if ( i->range() == "melee")
+                                       {
+                                               if(dmg > best_melee)
+                                                       best_melee = dmg;
+                                       } else {
+                                               if(dmg > best_ranged)
+                                                       best_ranged = dmg;
+                                       }
                                }
 
-                               vars.push_back(variant(best));
+                               vars.push_back(variant(best_melee));
+                               vars.push_back(variant(best_ranged));
                                return variant(&vars);  
                        }
                }


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to