Author: dragonking
Date: Tue Oct 14 12:30:35 2008
New Revision: 30157

URL: http://svn.gna.org/viewcvs/wesnoth?rev=30157&view=rev
Log:
New formula function: set_unit_var

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=30157&r1=30156&r2=30157&view=diff
==============================================================================
--- trunk/src/formula_ai.cpp (original)
+++ trunk/src/formula_ai.cpp Tue Oct 14 12:30:35 2008
@@ -528,10 +528,34 @@
 class set_var_callable : public formula_callable {
        std::string key_;
        variant value_;
+       variant get_value(const std::string& /*key*/) const { return variant(); 
}
+public:
+       set_var_callable(const std::string& key, const variant& value)
+         : key_(key), value_(value)
+       {}
+
+       const std::string& key() const { return key_; }
+       variant value() const { return value_; }
+};
+
+class set_var_function : public function_expression {
+public:
+       explicit set_var_function(const args_list& args)
+         : function_expression("set_var", args, 2, 2)
+       {}
+private:
+       variant execute(const formula_callable& variables) const {
+               return variant(new 
set_var_callable(args()[0]->evaluate(variables).as_string(), 
args()[1]->evaluate(variables)));
+       }
+};
+
+class set_unit_var_callable : public formula_callable {
+       std::string key_;
+       variant value_;
        gamemap::location loc_;
        variant get_value(const std::string& /*key*/) const { return variant(); 
}
 public:
-       set_var_callable(const std::string& key, const variant& value, const 
gamemap::location loc)
+       set_unit_var_callable(const std::string& key, const variant& value, 
const gamemap::location loc)
          : key_(key), value_(value), loc_(loc)
        {}
 
@@ -540,17 +564,14 @@
        const gamemap::location loc() const { return loc_; }
 };
 
-class set_var_function : public function_expression {
-public:
-       explicit set_var_function(const args_list& args)
-         : function_expression("set_var", args, 2, 3)
-       {}
-private:
-       variant execute(const formula_callable& variables) const {
-               if( args().size() == 2 ) {
-                       return variant(new 
set_var_callable(args()[0]->evaluate(variables).as_string(), 
args()[1]->evaluate(variables), gamemap::location::null_location ));
-               }
-               return variant(new 
set_var_callable(args()[0]->evaluate(variables).as_string(), 
args()[1]->evaluate(variables), 
convert_variant<location_callable>(args()[2]->evaluate(variables))->loc()));
+class set_unit_var_function : public function_expression {
+public:
+       explicit set_unit_var_function(const args_list& args)
+         : function_expression("set_unit_var", args, 3, 3)
+       {}
+private:
+       variant execute(const formula_callable& variables) const {
+               return variant(new 
set_unit_var_callable(args()[0]->evaluate(variables).as_string(), 
args()[1]->evaluate(variables), 
convert_variant<location_callable>(args()[2]->evaluate(variables))->loc()));
        }
 };
 
@@ -1184,6 +1205,8 @@
                return expression_ptr(new unit_moves_function(args, ai_));
        } else if(fn == "set_var") {
                return expression_ptr(new set_var_function(args));
+       } else if(fn == "set_unit_var") {
+               return expression_ptr(new set_unit_var_function(args));
        } else if(fn == "fallback") {
                return expression_ptr(new fallback_function(args));
        } else if(fn == "units_can_reach") {
@@ -1568,6 +1591,7 @@
                const ai::attack_analysis* attack_analysis = 
try_convert_variant<ai::attack_analysis>(*i);
                const recruit_callable* recruit_command = 
try_convert_variant<recruit_callable>(*i);
                const set_var_callable* set_var_command = 
try_convert_variant<set_var_callable>(*i);
+               const set_unit_var_callable* set_unit_var_command = 
try_convert_variant<set_unit_var_callable>(*i);
                const fallback_callable* fallback_command = 
try_convert_variant<fallback_callable>(*i);
 
                prepare_move();
@@ -1701,21 +1725,20 @@
                                made_move = true;
                        }
                } else if(set_var_command) {
-                       if (set_var_command->loc() == 
gamemap::location::null_location) {
-                               std::cerr << "setting var: " << 
set_var_command->key() << " -> " << set_var_command->value().to_debug_string() 
<< "\n";
-                               vars_.add(set_var_command->key(), 
set_var_command->value());
+                       std::cerr << "setting var: " << set_var_command->key() 
<< " -> " << set_var_command->value().to_debug_string() << "\n";
+                       vars_.add(set_var_command->key(), 
set_var_command->value());
+                       made_move = true;
+               } else if(set_unit_var_command) {
+                       std::cerr << "setting unit var: " << 
set_unit_var_command->key() << " -> " << 
set_unit_var_command->value().to_debug_string() << "\n";
+                       unit_map::iterator unit = 
units_.find(set_unit_var_command->loc());
+                       if(unit != units_.end()) {
+                               if( unit->second.side() == get_info().team_num 
) {
+                                       
unit->second.add_formula_var(set_unit_var_command->key(), 
set_unit_var_command->value());
+                               }
                        } else {
-                               std::cerr << "setting unit var: " << 
set_var_command->key() << " -> " << set_var_command->value().to_debug_string() 
<< "\n";
-                               unit_map::iterator unit = 
units_.find(set_var_command->loc());
-                               if(unit != units_.end()) {
-                                       if( unit->second.side() == 
get_info().team_num ) {
-                                               
unit->second.add_formula_var(set_var_command->key(), set_var_command->value());
-                                       }
-                               } else {
-                                       std::ostringstream str;
-                                       str << "set_var function: expected unit 
at location (" << (set_var_command->loc().x+1) << "," << 
(set_var_command->loc().y+1) << ")";
-                                       throw formula_error( str.str(), "", "", 
0);
-                               }
+                               std::ostringstream str;
+                               str << "set_var function: expected unit at 
location (" << (set_unit_var_command->loc().x+1) << "," << 
(set_unit_var_command->loc().y+1) << ")";
+                               throw formula_error( str.str(), "", "", 0);
                        }
                        made_move = true;
                } else if(i->is_string() && i->as_string() == "recruit") {


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

Reply via email to