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