Author: dhains
Date: Mon Jul  7 10:58:06 2008
New Revision: 27808

URL: http://svn.gna.org/viewcvs/wesnoth?rev=27808&view=rev
Log:
Some initial scouting behavoir, still very rudimentary.
*Implemented as unit formula for testing.  This means unaware of other units 
and group behavoir.

Modified:
    trunk/data/scenario-formula.cfg
    trunk/src/formula_ai.cpp

Modified: trunk/data/scenario-formula.cfg
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/scenario-formula.cfg?rev=27808&r1=27807&r2=27808&view=diff
==============================================================================
--- trunk/data/scenario-formula.cfg (original)
+++ trunk/data/scenario-formula.cfg Mon Jul  7 10:58:06 2008
@@ -50,13 +50,14 @@
     [/side]
 
     [side]
-        #controller=human
+        controller=human
                name=FormulaAI
         type=Dark Sorcerer
         side=2
         canrecruit=1
         recruit=Skeleton,Skeleton Archer,Walking Corpse,Ghost,Vampire Bat,Dark 
Adept,Ghoul
         gold=100
+               shroud=yes
 
         [unit]
             x,y=8,5
@@ -75,11 +76,30 @@
             generate_description=yes
             formula="move(me.loc, 
nearest_loc(nearest_loc(me.loc,map(filter(map.terrain,id='castle'),loc)),unit_moves(me.loc)))"
         [/unit]
-
-
-
-
-
+               [unit]
+            x,y=6,20
+            type="Ghost"
+            generate_description=yes
+            
formula="if(size(filter(unit_moves(me.loc),units_can_reach(enemy_moves, self))) 
!= 0, fallback('default'), if(size(villages) != 0, move(me.loc, 
nearest_loc(nearest_loc(me.loc,villages),unit_moves(me.loc))), if(size(shroud) 
= 0, fallback('default'), move(me.loc, 
nearest_loc(nearest_loc(me.loc,shroud),unit_moves(me.loc))))))
+                     where villages = 
filter(unit_moves(me.loc),is_unowned_village(map,x,y)), 
+                           shroud   = find_shroud()"
+        [/unit]
+               [unit]
+            x,y=15,22
+            type="Ghost"
+            generate_description=yes
+            
formula="if(size(filter(unit_moves(me.loc),units_can_reach(enemy_moves, self))) 
!= 0, fallback('default'), if(size(villages) != 0, move(me.loc, 
nearest_loc(nearest_loc(me.loc,villages),unit_moves(me.loc))), if(size(shroud) 
= 0, fallback('default'), move(me.loc, 
nearest_loc(nearest_loc(me.loc,shroud),unit_moves(me.loc))))))
+                     where villages = 
filter(unit_moves(me.loc),is_unowned_village(map,x,y)), 
+                           shroud   = find_shroud()"
+        [/unit]
+               [unit]
+            x,y=12,19
+            type="Ghost"
+            generate_description=yes
+            
formula="if(size(filter(unit_moves(me.loc),units_can_reach(enemy_moves, self))) 
!= 0, fallback('default'), if(size(villages) != 0, move(me.loc, 
nearest_loc(nearest_loc(me.loc,villages),unit_moves(me.loc))), if(size(shroud) 
= 0, fallback('default'), move(me.loc, 
nearest_loc(nearest_loc(me.loc,shroud),unit_moves(me.loc))))))
+                     where villages = 
filter(unit_moves(me.loc),is_unowned_village(map,x,y)), 
+                           shroud   = find_shroud()"
+        [/unit]
 
         ai_algorithm=formula_ai
         [ai]

Modified: trunk/src/formula_ai.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/formula_ai.cpp?rev=27808&r1=27807&r2=27808&view=diff
==============================================================================
--- trunk/src/formula_ai.cpp (original)
+++ trunk/src/formula_ai.cpp Mon Jul  7 10:58:06 2008
@@ -580,6 +580,37 @@
        }
 };
 
+class is_unowned_village_function : public function_expression {
+public:                                                                        
    
+       explicit is_unowned_village_function(const args_list& args, const 
formula_ai& ai)
+               : function_expression("is_unowned_village", args, 2, 3),
+                 ai_(ai)
+       {}
+private:    
+       variant execute(const formula_callable& variables) const {
+
+               const gamemap& m = 
convert_variant<gamemap_callable>(args()[0]->evaluate(variables))->get_gamemap();
 
+               const std::set<gamemap::location>& my_villages = 
ai_.current_team().villages();
+
+               gamemap::location loc;
+               if(args().size() == 2) {
+                       loc = 
convert_variant<location_callable>(args()[1]->evaluate(variables))->loc();
+               } else {
+                       loc = gamemap::location( 
args()[1]->evaluate(variables).as_int() - 1,  
+                                       args()[2]->evaluate(variables).as_int() 
- 1 ); 
+               } 
+
+               if(m.is_village(loc) && (my_villages.count(loc)==0) ) {
+                       return variant(true);
+               } else {
+                       return variant(false);
+               }
+       }                                     
+
+       const formula_ai& ai_;
+};
+
+
 class unit_at_function : public function_expression {
 public:
        unit_at_function(const args_list& args, const formula_ai& ai_object)
@@ -856,6 +887,8 @@
                return expression_ptr(new recruit_function(args));
        } else if(fn == "is_village") {
                return expression_ptr(new is_village_function(args));
+       } else if(fn == "is_unowned_village") {
+               return expression_ptr(new is_unowned_village_function(args, 
ai_));
        } else if(fn == "unit_at") {
                return expression_ptr(new unit_at_function(args, ai_));
        } else if(fn == "unit_moves") {


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

Reply via email to