Author: dragonking
Date: Mon Mar 24 02:25:14 2008
New Revision: 25040

URL: http://svn.gna.org/viewcvs/wesnoth?rev=25040&view=rev
Log:
Some improvements for formula system:
* made 'my_leader' return unit instead of location only
* made 'defense_on' return unit's defense on a given location instead of the 
chance of being hit
* added new function 'chance_to_hit' which works like previous 'defense_on'

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=25040&r1=25039&r2=25040&view=diff
==============================================================================
--- trunk/src/formula_ai.cpp (original)
+++ trunk/src/formula_ai.cpp Mon Mar 24 02:25:14 2008
@@ -413,6 +413,31 @@
 public:
        defense_on_function(const args_list& args, const formula_ai& ai_object)
          : function_expression("defense_on", args, 2, 2), ai_(ai_object)
+       {}
+private:
+       variant execute(const formula_callable& variables) const {
+               variant u = args()[0]->evaluate(variables);
+               variant loc_var = args()[1]->evaluate(variables);
+               if(u.is_null() || loc_var.is_null()) {
+                       return variant();
+               }
+
+               const unit& un = convert_variant<unit_callable>(u)->get_unit();
+               const gamemap::location& loc = 
convert_variant<location_callable>(loc_var)->loc();
+               if(!ai_.get_info().map.on_board(loc)) {
+                       return variant();
+               }
+
+               return variant(100 - 
un.defense_modifier(ai_.get_info().map[loc]));
+       }
+
+       const formula_ai& ai_;
+};
+
+class chance_to_hit_function : public function_expression {
+public:
+       chance_to_hit_function(const args_list& args, const formula_ai& 
ai_object)
+         : function_expression("chance_to_hit", args, 2, 2), ai_(ai_object)
        {}
 private:
        variant execute(const formula_callable& variables) const {
@@ -494,6 +519,8 @@
                        return expression_ptr(new 
units_can_reach_function(args, ai_));
                } else if(fn == "defense_on") {
                        return expression_ptr(new defense_on_function(args, 
ai_));
+               } else if(fn == "chance_to_hit") {
+                       return expression_ptr(new chance_to_hit_function(args, 
ai_));
                } else if(fn == "max_possible_damage") {
                        return expression_ptr(new 
max_possible_damage_function(args, ai_));
                } else if(fn == "distance_to_nearest_unowned_village") {
@@ -788,7 +815,7 @@
                        return variant();
                }
 
-               return variant(new location_callable(i->first));
+               return variant(new unit_callable(*i, current_team(), 
get_info().team_num));
        } else if(key == "vars") {
                return variant(&vars_);
        } else if(key == "keeps") {


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

Reply via email to