Difference between revisions of "Formula AI Code Library"

From The Battle for Wesnoth Wiki
(Created page with 'This isn't just Formula AI right now, needs to be sorted. It's also not anywhere close to complete. * Swamp lurker moves from [http://forums.wesnoth.org/viewtopic.php?f=8&t=349…')
 
Line 1: Line 1:
This isn't just Formula AI right now, needs to be sortedIt's also not anywhere close to complete.
+
This page list Formula AI code examples that can be used directly in a scenario or as templates for further development.  If you have problems with any of them or would like to see additional examples let us know in [http://forums.wesnoth.org/viewtopic.php?f=10&t=34976 this forum thread]If you have examples to add, you can also let us know there and we will post them, or feel free to edit these wiki pages yourself.
  
* Swamp lurker moves from [http://forums.wesnoth.org/viewtopic.php?f=8&t=34970 Grnk the Mighty] (WML, Formula AI and Lua AI)
+
* Check out [[Formula AI Howto]] for a practical guide for setting up and testing these examples in a scenario.
* Coward AI special (Lua AI): on suggestion by Simons Mith
+
* Additional examples can be found in the Wesnoth data directory under ai/formula/.  See [[EditingWesnoth]] for locating the data directory.
* Stationed guardian AI special (Lua AI): on suggestion by Simons Mith
+
* Lua AI code examples can be found in the [[Lua AI Code Library]].
* Return guardian AI special (Lua AI)
+
 
* Goto and healing AI special (Lua AI): for Annonyssimus' [http://forums.wesnoth.org/viewtopic.php?f=8&t=26800 The Earth's Gut]
+
==Swamp Lurker Moves==
* Patrol AI special (Lua AI): from [http://forums.wesnoth.org/viewtopic.php?f=8&t=21718 A Rough Life] by Elvish_Hunter
+
 
* Retreat AI special (Lua AI): from mainline campaign [http://forums.wesnoth.org/viewtopic.php?f=38&t=31098 Legend of Wesmere], Ka'lian Under Attack
+
This is the Formula AI adaptation of the WML swamp lurker code from [http://forums.wesnoth.org/viewtopic.php?f=8&t=34970 Grnk the Mighty].  Swamp lurkers have the 'swamp_submerge' ability, which is the same as the 'submerge' ability that some units (skeletons etc.) have in deep water, just in swamps. Besides that, they are dumb, impulse-drive creatures which move as follows:
* Recruit scout AI special (Formula AI): from [http://forums.wesnoth.org/viewtopic.php?f=8&t=33664 The Great Quest] by Coffee
+
 
 +
* They can move across most terrain, but only stop on swamp
 +
* All lurkers move individually, there is no strategy
 +
* If there are enemies within reach (next to swamp terrain), a lurker will attack the unit with the fewest hitpoints
 +
* If no unit is in reach, it will move to a random reachable swamp hex.
 +
 
 +
In Grnk, this behavior is coded in WML (the WML code can be found in '1_unit_macros.cfg' in the Grnk folder or in [http://forums.wesnoth.org/viewtopic.php?f=10&t=34976#p506852 this forum post).  The adaptation to Formula AI follows below, and a [[Lua_AI_Code_Library#Swamp_Lurker_Moves|Lua AI version]] exists as well.
 +
 
 +
fai 'lurker_moves.fai'
 +
# run_file('~add-ons/AItest/ai/lurker_moves.fai') #
 +
 +
def is_swamp(map, xx, yy) 
 +
    # Tests whether terrain at xx,yy is swamp_water #
 +
    map(
 +
        filter( map.terrain, (x=xx) and (y=yy)),
 +
        self.id
 +
    )[0] = 'swamp_water';
 +
 +
def reachable_swamp(unit_loc,map)
 +
    # get all reachable swamp locs for unit at unit_loc #
 +
    # exclude own location #
 +
    filter(
 +
        unit_moves( unit_loc ),
 +
        (is_swamp( map, x, y )) and (self != unit_loc)
 +
    );
 +
 +
def random(array)
 +
    # Picks a random elements of 'array' #
 +
    array[(1d size(array) - 1)];
 +
 +
def reachable_enemies_next_to_swamp(unit_loc,attacks,map)
 +
    # Returns all the attacks for enemies that the unit at 'unit_loc' #
 +
    # can reach and that are next to a swamp hex #
 +
    filter(
 +
        map( attacks.attacks, self),
 +
        (move_from = unit_loc) and (is_swamp( map, attack_from.x, attack_from.y))
 +
    );
 +
 +
def weakest_defender(attacks)
 +
    # Get the enemy with the lowest HP #
 +
    choose( attacks, -unit_at(defender).hitpoints
 +
    );
 +
 +
# Attack if possible, otherwise random move #
 +
if( size(possible_attacks) != 0,
 +
    weakest_defender(possible_attacks),
 +
if( size(swamp_in_reach) != 0,
 +
    move(me.loc,random(swamp_in_reach)),
 +
end)
 +
)
 +
 +
where possible_attacks = reachable_enemies_next_to_swamp( me.loc, my_attacks,map)
 +
 +
where swamp_in_reach = reachable_swamp(me.loc,map)
 +
 +
faiend
 +
 
 +
This code is supposed to be in a file 'lurker_moves.fai. It can be either used with the ''unit_moves'' stage by including
 +
 
 +
[ai]
 +
    ={lurker_moves.fai}
 +
[/ai]
 +
 
 +
in the definition of all swamp lurker units.  Or it can be set up as a candidate action the applies to all units of a given side:

Revision as of 16:05, 23 November 2011

This page list Formula AI code examples that can be used directly in a scenario or as templates for further development. If you have problems with any of them or would like to see additional examples let us know in this forum thread. If you have examples to add, you can also let us know there and we will post them, or feel free to edit these wiki pages yourself.

  • Check out Formula AI Howto for a practical guide for setting up and testing these examples in a scenario.
  • Additional examples can be found in the Wesnoth data directory under ai/formula/. See EditingWesnoth for locating the data directory.
  • Lua AI code examples can be found in the Lua AI Code Library.

Swamp Lurker Moves

This is the Formula AI adaptation of the WML swamp lurker code from Grnk the Mighty. Swamp lurkers have the 'swamp_submerge' ability, which is the same as the 'submerge' ability that some units (skeletons etc.) have in deep water, just in swamps. Besides that, they are dumb, impulse-drive creatures which move as follows:

  • They can move across most terrain, but only stop on swamp
  • All lurkers move individually, there is no strategy
  • If there are enemies within reach (next to swamp terrain), a lurker will attack the unit with the fewest hitpoints
  • If no unit is in reach, it will move to a random reachable swamp hex.

In Grnk, this behavior is coded in WML (the WML code can be found in '1_unit_macros.cfg' in the Grnk folder or in [http://forums.wesnoth.org/viewtopic.php?f=10&t=34976#p506852 this forum post). The adaptation to Formula AI follows below, and a Lua AI version exists as well.

fai 'lurker_moves.fai'
# run_file('~add-ons/AItest/ai/lurker_moves.fai') #

def is_swamp(map, xx, yy)   
    # Tests whether terrain at xx,yy is swamp_water #
    map( 
        filter( map.terrain, (x=xx) and (y=yy)),
        self.id 
    )[0] = 'swamp_water';

def reachable_swamp(unit_loc,map)
    # get all reachable swamp locs for unit at unit_loc #
    # exclude own location #
    filter( 
        unit_moves( unit_loc ), 
        (is_swamp( map, x, y )) and (self != unit_loc)
    );

def random(array)
    # Picks a random elements of 'array' #
    array[(1d size(array) - 1)];

def reachable_enemies_next_to_swamp(unit_loc,attacks,map)
    # Returns all the attacks for enemies that the unit at 'unit_loc' #
    # can reach and that are next to a swamp hex #
    filter( 
        map( attacks.attacks, self),
        (move_from = unit_loc) and (is_swamp( map, attack_from.x, attack_from.y))
    );

def weakest_defender(attacks)
    # Get the enemy with the lowest HP #
    choose( attacks, -unit_at(defender).hitpoints
    );

# Attack if possible, otherwise random move #
if( size(possible_attacks) != 0,
    weakest_defender(possible_attacks),
if( size(swamp_in_reach) != 0,
    move(me.loc,random(swamp_in_reach)),
end)
)

where possible_attacks = reachable_enemies_next_to_swamp( me.loc, my_attacks,map)

where swamp_in_reach = reachable_swamp(me.loc,map)

faiend

This code is supposed to be in a file 'lurker_moves.fai. It can be either used with the unit_moves stage by including

[ai]
    ={lurker_moves.fai}
[/ai]

in the definition of all swamp lurker units. Or it can be set up as a candidate action the applies to all units of a given side: