Author: dave
Date: Thu Feb 28 07:03:53 2008
New Revision: 24135

URL: http://svn.gna.org/viewcvs/wesnoth?rev=24135&view=rev
Log:
added feature to formula AI to allow it to fallback to another AI

Modified:
    branches/formula-ai/src/formula_ai.cpp

Modified: branches/formula-ai/src/formula_ai.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/formula-ai/src/formula_ai.cpp?rev=24135&r1=24134&r2=24135&view=diff
==============================================================================
--- branches/formula-ai/src/formula_ai.cpp (original)
+++ branches/formula-ai/src/formula_ai.cpp Thu Feb 28 07:03:53 2008
@@ -211,6 +211,27 @@
 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 fallback_callable : public formula_callable {
+       std::string key_;
+       variant get_value(const std::string& key) const { return variant(); }
+public:
+       explicit fallback_callable(const std::string& key) : key_(key) {
+       }
+
+       const std::string& key() const { return key_; }
+};
+
+class fallback_function : public function_expression {
+public:
+       explicit fallback_function(const args_list& args)
+         : function_expression("fallback", args, 1, 1)
+       {}
+private:
+       variant execute(const formula_callable& variables) const {
+               return variant(new 
fallback_callable(args()[0]->evaluate(variables).as_string()));
        }
 };
 
@@ -460,6 +481,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 == "fallback") {
+                       return expression_ptr(new fallback_function(args));
                } else if(fn == "units_can_reach") {
                        return expression_ptr(new 
units_can_reach_function(args, ai_));
                } else if(fn == "defense_on") {
@@ -595,6 +618,7 @@
                const attack_callable* attack = 
i->try_convert<attack_callable>();
                const recruit_callable* recruit_command = 
i->try_convert<recruit_callable>();
                const set_var_callable* set_var_command = 
i->try_convert<set_var_callable>();
+               const fallback_callable* fallback_command = 
i->try_convert<fallback_callable>();
 
                prepare_move();
                if(move) {
@@ -631,6 +655,12 @@
                        made_move = true;
                } else if(i->is_string() && i->as_string() == "end_turn") {
                        return false;
+               } else if(fallback_command) {
+                       ai_interface* fallback = 
create_ai(fallback_command->key(), get_info());
+                       if(fallback) {
+                               fallback->play_turn();
+                       }
+                       return false;
                } else {
                        std::cerr << "UNRECOGNIZED MOVE\n";
                }


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

Reply via email to