Author: dave
Date: Fri Feb 29 06:29:53 2008
New Revision: 24151

URL: http://svn.gna.org/viewcvs/wesnoth?rev=24151&view=rev
Log:
added dir function to formula system

Modified:
    branches/formula-ai/data/scenario-test.cfg
    branches/formula-ai/src/ai.cpp
    branches/formula-ai/src/callable_objects.hpp
    branches/formula-ai/src/formula.cpp
    branches/formula-ai/src/formula_ai.cpp
    branches/formula-ai/src/formula_ai.hpp
    branches/formula-ai/src/formula_callable.hpp
    branches/formula-ai/src/formula_function.cpp

Modified: branches/formula-ai/data/scenario-test.cfg
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/formula-ai/data/scenario-test.cfg?rev=24151&r1=24150&r2=24151&view=diff
==============================================================================
--- branches/formula-ai/data/scenario-test.cfg (original)
+++ branches/formula-ai/data/scenario-test.cfg Fri Feb 29 06:29:53 2008
@@ -46,11 +46,11 @@
         canrecruit=1
         recruit=Dwarvish Guardsman,Dwarvish Fighter,Dwarvish 
Thunderer,Thief,Poacher,Footpad
         gold=100
-        #controller=human
+        controller=human
     [/side]
 
     [side]
-        #controller=human
+        controller=human
         type=Dark Sorcerer
         side=2
         canrecruit=1

Modified: branches/formula-ai/src/ai.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/formula-ai/src/ai.cpp?rev=24151&r1=24150&r2=24151&view=diff
==============================================================================
--- branches/formula-ai/src/ai.cpp (original)
+++ branches/formula-ai/src/ai.cpp Fri Feb 29 06:29:53 2008
@@ -2184,10 +2184,6 @@
        return attack_depth_;
 }
 
-void ai_interface::get_inputs(std::vector<game_logic::formula_input>* inputs) 
const
-{
-}
-
 namespace {
 template<typename Container>
 variant villages_from_set(const Container& villages,
@@ -2240,6 +2236,19 @@
                return variant(new gamemap_callable(info_.map));
        }
        return variant();
+}
+
+void ai_interface::get_inputs(std::vector<game_logic::formula_input>* inputs) 
const
+{
+       using game_logic::FORMULA_READ_ONLY;
+       inputs->push_back(game_logic::formula_input("turn", FORMULA_READ_ONLY));
+       inputs->push_back(game_logic::formula_input("units", 
FORMULA_READ_ONLY));
+       inputs->push_back(game_logic::formula_input("my_units", 
FORMULA_READ_ONLY));
+       inputs->push_back(game_logic::formula_input("enemy_units", 
FORMULA_READ_ONLY));
+       inputs->push_back(game_logic::formula_input("villages", 
FORMULA_READ_ONLY));
+       inputs->push_back(game_logic::formula_input("my_villages", 
FORMULA_READ_ONLY));
+       
inputs->push_back(game_logic::formula_input("enemy_and_unowned_villages", 
FORMULA_READ_ONLY));
+       inputs->push_back(game_logic::formula_input("map", FORMULA_READ_ONLY));
 }
 
 variant ai::attack_analysis::get_value(const std::string& key) const

Modified: branches/formula-ai/src/callable_objects.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/formula-ai/src/callable_objects.hpp?rev=24151&r1=24150&r2=24151&view=diff
==============================================================================
--- branches/formula-ai/src/callable_objects.hpp (original)
+++ branches/formula-ai/src/callable_objects.hpp Fri Feb 29 06:29:53 2008
@@ -15,6 +15,9 @@
        {} \
        \
        const klass& get_##klass() const { return object_; } \
+       void get_inputs(std::vector<game_logic::formula_input>* inputs) const \
+       { \
+       } \
        \
        variant get_value(const std::string& key) const {
 

Modified: branches/formula-ai/src/formula.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/formula-ai/src/formula.cpp?rev=24151&r1=24150&r2=24151&view=diff
==============================================================================
--- branches/formula-ai/src/formula.cpp (original)
+++ branches/formula-ai/src/formula.cpp Fri Feb 29 06:29:53 2008
@@ -118,6 +118,13 @@
 public:
        explicit list_callable(const variant& list) : list_(list)
        {}
+
+       void get_inputs(std::vector<formula_input>* inputs) const {
+               inputs->push_back(formula_input("size", FORMULA_READ_WRITE));
+               inputs->push_back(formula_input("empty", FORMULA_READ_WRITE));
+               inputs->push_back(formula_input("first", FORMULA_READ_WRITE));
+               inputs->push_back(formula_input("last", FORMULA_READ_WRITE));
+       }
 
        variant get_value(const std::string& key) const {
                if(key == "size") {

Modified: branches/formula-ai/src/formula_ai.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/formula-ai/src/formula_ai.cpp?rev=24151&r1=24150&r2=24151&view=diff
==============================================================================
--- branches/formula-ai/src/formula_ai.cpp (original)
+++ branches/formula-ai/src/formula_ai.cpp Fri Feb 29 06:29:53 2008
@@ -506,6 +506,8 @@
 
 formula_ai::formula_ai(info& i) : ai(i), move_maps_valid_(false)
 {
+       //make sure we don't run out of refcount
+       add_ref();
        vars_.add_ref();
 }
 
@@ -737,6 +739,19 @@
        return ai_interface::get_value(key);
 }
 
+void formula_ai::get_inputs(std::vector<formula_input>* inputs) const
+{
+       using game_logic::FORMULA_READ_ONLY;
+       inputs->push_back(game_logic::formula_input("attacks", 
FORMULA_READ_ONLY));
+       inputs->push_back(game_logic::formula_input("my_moves", 
FORMULA_READ_ONLY));
+       inputs->push_back(game_logic::formula_input("enemy_moves", 
FORMULA_READ_ONLY));
+       inputs->push_back(game_logic::formula_input("my_leader", 
FORMULA_READ_ONLY));
+       inputs->push_back(game_logic::formula_input("vars", FORMULA_READ_ONLY));
+       inputs->push_back(game_logic::formula_input("keeps", 
FORMULA_READ_ONLY));
+
+       ai_interface::get_inputs(inputs);
+}
+
 variant formula_ai::get_keeps() const
 {
        if(keeps_cache_.is_null()) {

Modified: branches/formula-ai/src/formula_ai.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/formula-ai/src/formula_ai.hpp?rev=24151&r1=24150&r2=24151&view=diff
==============================================================================
--- branches/formula-ai/src/formula_ai.hpp (original)
+++ branches/formula-ai/src/formula_ai.hpp Fri Feb 29 06:29:53 2008
@@ -32,6 +32,7 @@
        void do_recruitment();
        bool make_move();
        virtual variant get_value(const std::string& key) const;
+       virtual void get_inputs(std::vector<game_logic::formula_input>* inputs) 
const;
        game_logic::const_formula_ptr recruit_formula_;
        game_logic::const_formula_ptr move_formula_;
 

Modified: branches/formula-ai/src/formula_callable.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/formula-ai/src/formula_callable.hpp?rev=24151&r1=24150&r2=24151&view=diff
==============================================================================
--- branches/formula-ai/src/formula_callable.hpp (original)
+++ branches/formula-ai/src/formula_callable.hpp Fri Feb 29 06:29:53 2008
@@ -50,7 +50,7 @@
                return do_compare(other) < 0;
        }
 
-       virtual void get_inputs(std::vector<formula_input>* inputs) const {}
+       virtual void get_inputs(std::vector<formula_input>* inputs) const {};
 protected:
        virtual ~formula_callable() {}
 

Modified: branches/formula-ai/src/formula_function.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/formula-ai/src/formula_function.cpp?rev=24151&r1=24150&r2=24151&view=diff
==============================================================================
--- branches/formula-ai/src/formula_function.cpp (original)
+++ branches/formula-ai/src/formula_function.cpp Fri Feb 29 06:29:53 2008
@@ -1,6 +1,7 @@
 #include <iostream>
 #include <math.h>
 
+#include "foreach.hpp"
 #include "formula_callable.hpp"
 #include "formula_function.hpp"
 
@@ -9,6 +10,26 @@
 namespace game_logic {
 
 namespace {
+
+class dir_function : public function_expression {
+public:
+       explicit dir_function(const args_list& args)
+            : function_expression("dir", args, 1, 1)
+       {}
+
+private:
+       variant execute(const formula_callable& variables) const {
+               variant var = args()[0]->evaluate(variables);
+               const formula_callable* callable = var.as_callable();
+               std::vector<formula_input> inputs = callable->inputs();
+               std::vector<variant> res;
+               foreach(const formula_input& input, inputs) {
+                       res.push_back(variant(input.name));
+               }
+
+               return variant(&res);
+       }
+};
 
 class if_function : public function_expression {
 public:
@@ -518,7 +539,9 @@
        }
 
        std::cerr << "FN: '" << fn << "' " << fn.size() << "\n";
-       if(fn == "if") {
+       if(fn == "dir") {
+               return expression_ptr(new dir_function(args));
+       } else if(fn == "if") {
                return expression_ptr(new if_function(args));
        } else if(fn == "abs") {
                return expression_ptr(new abs_function(args));


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

Reply via email to