Difference between revisions of "RCA AI"

From The Battle for Wesnoth Wiki
m (Use of Goals in the RCA AI)
m (The Candidate Actions (CAs) of the main_loop Stage in the RCA AI: remove an outdated sentence)
(14 intermediate revisions by 2 users not shown)
Line 3: Line 3:
 
The RCA (Register Candidate Action) AI is the default AI since Wesnoth 1.9.  Its name stems from the fact that it has a list of potential actions, called ''candidate actions'' (CAs), that are evaluated for each move and are executed in order of evaluation score.  The RCA AI is highly configurable in WML.  It can also be modified by removing default CAs or adding custom CAs.
 
The RCA (Register Candidate Action) AI is the default AI since Wesnoth 1.9.  Its name stems from the fact that it has a list of potential actions, called ''candidate actions'' (CAs), that are evaluated for each move and are executed in order of evaluation score.  The RCA AI is highly configurable in WML.  It can also be modified by removing default CAs or adding custom CAs.
  
This page describes how the RCA AI is assembled out of the different components of Wesnoth's [[Wesnoth_AI_Framework|composite AI framework]].  For related information also see:
+
This page describes how the RCA AI is assembled out of the different components of Wesnoth's [[Wesnoth_AI_Framework#Wesnoth_AI_Framework:_A_Composite_AI|composite AI framework]].  For related information also see:
 
* [[Wesnoth_AI_Framework#Types_of_AI_Components|Types of AI Components]]: General descriptions of the different AI components.
 
* [[Wesnoth_AI_Framework#Types_of_AI_Components|Types of AI Components]]: General descriptions of the different AI components.
 
* [[AiWML]]: Customizing the RCA AI by setting AI parameters (aspects and goals)
 
* [[AiWML]]: Customizing the RCA AI by setting AI parameters (aspects and goals)
Line 21: Line 21:
 
* [[Wesnoth_AI_Framework#Aspects_and_Goals|'''Goals''']] are a specific type of aspect which define targets toward which the AI moves.  It is ''very important'' to understand that these are only move-to targets, not attack targets.
 
* [[Wesnoth_AI_Framework#Aspects_and_Goals|'''Goals''']] are a specific type of aspect which define targets toward which the AI moves.  It is ''very important'' to understand that these are only move-to targets, not attack targets.
  
The use of each of these components in the RCA AI is described in the following, with descriptions of the methodology shown first, and the configuration setup afterward.
+
Links here are to the general descriptions of these components in the [[Wesnoth AI Framework]], while the remainder of this page is about their use in the RCA AI.
  
 
=== The Candidate Actions (CAs) of the ''main_loop'' Stage in the RCA AI ===
 
=== The Candidate Actions (CAs) of the ''main_loop'' Stage in the RCA AI ===
Line 27: Line 27:
 
For each move of its turn, the AI evaluates a number of potential actions, called ''candidate actions'' (CAs). The CA with the highest evaluation score is executed and the process is repeated, until no more valid moves are found.  This ends the AI turn.  (Note: This is the general process of the [[Wesnoth_AI_Framework#Stages|''main_loop'' stage]], it is not specific to the RCA AI.)
 
For each move of its turn, the AI evaluates a number of potential actions, called ''candidate actions'' (CAs). The CA with the highest evaluation score is executed and the process is repeated, until no more valid moves are found.  This ends the AI turn.  (Note: This is the general process of the [[Wesnoth_AI_Framework#Stages|''main_loop'' stage]], it is not specific to the RCA AI.)
  
The scores of the RCA AI CAs have fixed values.  These values can be modified, but only to other fixed values.  For example, the recruitment CA by default has a score of 180,000.  The default score for attacks is 100,000.  Thus, if recruiting is possible, it will always be done before attacks.  However, that does not mean that all recruiting always happens before all attacks.
+
Most of the RCA AI CAs have a single fixed scores, with a few of the Lua CAs have two distinct (but otherwise also fixed) scores, as indicated below.  These values can, in principle, be modified, but generally only to other fixed values.  For example, the recruitment CA by default has a score of 180,000.  The default score for attacks is 100,000.  Thus, if recruiting is possible, it will always be done before attacks.  If the score of the recruitment CA were lowered to below 100,000, then attacks would always be evaluated (and executed, if possible) before recruiting.
  
Consider the case that all castle hexes are occupied by AI units which were recruited on the previous turn and have not been used yet this turn.  No recruiting is possible, so the AI moves on to other CAs.  Once it gets to attacks, one of the units (or a group of units) might be selected to move off the castle and attack a close-by enemy.  Now a castle hex is available for recruiting, which now has the highest evaluation score and is executed.  This cycle might be repeated several times.
+
It is important to realize though that the default score settings do not mean that all recruiting always happens before all attacks.  The "if possible" clauses in the previous paragraph become important here.  Consider the case that all castle hexes are occupied by AI units which were recruited on the previous turn and have not been used yet this turn.  No recruiting is possible (in which case the CA returns 0), so the AI moves on to other CAs.  Once it gets to attacks, one of the units (or a group of units) might be selected to move off the castle and attack a close-by enemy.  Now a castle hex is available for recruiting, which now has the highest evaluation score and is executed.  This cycle might be repeated several times.
  
 
In its default configuration, the RCA AI evaluates the following CAs, sorted here in order of their evaluation score:
 
In its default configuration, the RCA AI evaluates the following CAs, sorted here in order of their evaluation score:
  
*'''Goto''' CA (score 200,000): Move units toward the coordinates set by [[SingleUnitWML|goto_x, goto_y]] in their unit WML.
+
*'''Goto''' CA (score 200,000; C++ CA): Move units toward the coordinates set by [[SingleUnitWML|goto_x, goto_y]] in their unit WML.
  
*'''Recruitment''' CA (score 180,000): Recruit or recall units.
+
*{{DevFeature1.15|3}} '''Castle switching''' CA (scores 195,000 and 15,000; Lua CA): move the leader to a different castle, generally one that is closer to the enemy leader(s).
  
*'''Move leader to goals''' CA (score 140,000): Move the leader toward goals set by [[AiWML#List_of_AI_Aspects|[leader_goal]]].
+
*{{DevFeature1.15|3}} '''Retreat injured''' CA (scores 192,000 and 95,000; Lua CA): retreat injured units that are threatened by enemies to healing locations and away from these enemies.
  
*'''Move leader to keep''' CA (score 120,000): Move the leader toward the closest available keep.
+
*{{DevFeature1.15|3}} '''Spread poison''' CA (score 190,000; Lua CA): spread poison to enemies, while taking care not to try to poison unpoisonable or already poisoned units.
  
*'''Combat''' CA (score 100,000): Attack enemy units that are in range.  Note that this CA includes the move to a hex adjacent to the enemy unit as well as the attack itself.
+
*'''Recruitment''' CA (score 180,000; C++ CA): Recruit or recall units.
  
*'''Healing''' CA (score 80,000): Move units onto healing locations (generally villages).
+
*'''Move leader to goals''' CA (score 140,000; C++ CA): Move the leader toward goals set by [[AiWML#List_of_AI_Aspects|[leader_goal]]].
  
*'''Villages''' CA (score 60,000): Move units onto villages that are unowned or owned by an enemy.
+
*'''Move leader to keep''' CA (score 120,000; C++ CA): Move the leader toward the closest available keep.
  
*'''Retreat''' CA (score 40,000): Evaluate if any units are in grave danger or hopelessly outnumbered, and if so, retreat them.
+
*'''High XP attack''' CA (score 100,010; Lua CA): An addition to the default AI as of '''Wesnoth 1.13.6''', this CA performs attacks on enemy units so close to leveling that the combat CA (below) does not attack them.
  
*'''Move to targets''' CA (score 20,000): Evaluate potential [[AiWML#AI_Targets_and_Goals|targets]] and move units toward them.  The evaluation takes into account how valuable the targets are (this is configurable by setting [[AiWML#Aspects_and_Goals_Overview|goals]]), how easily the AI's units can get there, how exposed to attacks they will be, etc.  Targets are enemy leaders, enemy units that pose a threat to the AI leader and villages, as well as anything defined in a [[AiWML#The_.5Bgoal.5D_Tag|[goal] tag]]It is important to understand that targets only apply to the ''move-to-targets'' CA.  If a target is within range of the AI's unit(s) on the current turn, other CAs, such as ''combat'', ''healing'' or ''villages'' have a higher evaluation score and are (usually) executed first.  Thus, a target is specifically <u>not</u> an attack target, but a move target.
+
*'''Combat''' CA (score 100,000; C++ CA): Attack enemy units that are in rangeNote that this CA includes the move to a hex adjacent to the enemy unit as well as the attack itself.
  
*'''Leader shares keep''' CA (score 10,000): Move the leader off the keep to let an allied leader recruit, if an allied leader can get to the keep in one move.  Note: This CA used to be called ''passive_leader_shares_keep''.  That name still works for the time being but will be deprecated at some point.
+
*{{DevFeature1.15|3}} '''Place healers''' CA (score 96,000; Lua CA): Place healers adjacent to injured units that have already moved.
 +
 
 +
*'''Healing''' CA (score 80,000; C++ CA): Move units onto healing locations (generally villages, but also next to healers that were placed previously).
 +
 
 +
*'''Villages''' CA (score 60,000; C++ CA): Move units onto villages that are unowned or owned by an enemy.
 +
 
 +
*'''Retreat''' CA (score 40,000; C++ CA): Evaluate if any units are in grave danger or hopelessly outnumbered, and if so, retreat them.  *{{DevFeature1.15|3}} This CA was removed and replaced by the "retreat injured" CA described above
 +
 
 +
*'''Move to targets''' CA (score 20,000; C++ CA): Evaluate potential [[RCA_AI#Use_of_Goals_and_Targets_in_the_RCA_AI|targets]] and move units toward them.  The evaluation takes into account how valuable the targets are (this is configurable by setting [[AiWML#AI_Targets_and_Goals|goals]]), how easily the AI's units can get there, how exposed to attacks they will be, etc.  Targets are enemy leaders, enemy units that pose a threat to the AI leader and villages, as well as anything defined in a [[AiWML#The_.5Bgoal.5D_Tag|[goal] tag]].  It is important to understand that targets only apply to the ''move-to-targets'' CA.  If a target is within range of the AI's unit(s) on the current turn, other CAs, such as ''combat'', ''healing'' or ''villages'' have a higher evaluation score and are (usually) executed first.  Thus, a target is specifically <u>not</u> an attack target, but a move target.
 +
 
 +
*'''Leader shares keep''' CA (score 10,000; C++ CA): Move the leader off the keep to let an allied leader recruit, if an allied leader can get to the keep in one move.  Note: This CA used to be called ''passive_leader_shares_keep''.  That name still works for the time being but will be deprecated at some point.
 +
 
 +
*{{DevFeature1.15|3}} '''Move to any enemy''' CA (score 1,000; Lua CA): Move AI units toward any enemy. That is a fall-back CA in case none of the other CAs moved the unit. This is generally only the case on maps without enemy leaders and villages.
  
 
As already mentioned, the CAs are always evaluated (and executed, if a possible move is found) in the order given above.  For example, the ''goto'' CA is always the first move that is done (if ''goto_x'' and ''goto_y'' are defined and a move toward that location is possible).  Equivalently, if a valid attack is found in the ''combat'' CA, it is <u>always</u> executed before any healing, village grabbing or move-to-target moves.  One of the effects this has is that attacks always have priority over any goals/targets of the move-to-target phase.  It is '''very important''' to understand this, as it is a frequent source of confusion for scenario creators.
 
As already mentioned, the CAs are always evaluated (and executed, if a possible move is found) in the order given above.  For example, the ''goto'' CA is always the first move that is done (if ''goto_x'' and ''goto_y'' are defined and a move toward that location is possible).  Equivalently, if a valid attack is found in the ''combat'' CA, it is <u>always</u> executed before any healing, village grabbing or move-to-target moves.  One of the effects this has is that attacks always have priority over any goals/targets of the move-to-target phase.  It is '''very important''' to understand this, as it is a frequent source of confusion for scenario creators.
  
Note that nothing in Wesnoth's [[Wesnoth_AI_Framework|general AI mechanism]] limits CAs to have fixed evaluations scores.  For examples, some of the [[Micro AIs]] as well as some custom AI CAs return variable scores.
+
Note that nothing in Wesnoth's [[Wesnoth_AI_Framework|general AI mechanism]] limits CAs to having fixed evaluation scores.  For example, some of the [[Micro AIs]] as well as some of the new Lua AI CAs return variable scores.
  
 
=== Use of Aspects in the RCA AI ===
 
=== Use of Aspects in the RCA AI ===
  
An aspect is simply a parameters that the AI provides to scenario creators for configuring the AI behavior.  For example, one can change how aggressive/careful the AI acts, how recruiting is prioritized or whether the leader participates in attacks.
+
An aspect is a parameter that the AI framework provides to scenario creators for configuring the AI behavior.  For example, one can change how aggressive/careful the AI acts, how recruiting is prioritized or whether the leader participates in attacks.
  
 
The RCA AI has a large number of aspects.  Their description is therefore given [[AiWML|its own page]].
 
The RCA AI has a large number of aspects.  Their description is therefore given [[AiWML|its own page]].
Line 65: Line 77:
 
=== Use of Goals and Targets in the RCA AI ===
 
=== Use of Goals and Targets in the RCA AI ===
  
Goals, which define AI targets, are a special type of aspects that influence the behavior of the AI in the move-to-targets candidate action.
+
''Goals'' define AI ''targets'' which, in turn, are used in the ''move-to-targets'' candidate action to move the AI's units toward selected units or locations. The AI engine automatically selects all enemy leaders, enemy units that pose a threat to the AI leader and unowned or enemy-owned villages as targets and assigns them certain base values. A score is then assigned to each target based on this base value, as well as on the movement cost required to get there, whether moving there would put the units involved in danger, etc.
 
 
AI targets are used in the move-to-targets candidate action to move the AI's units toward selected units or locations. The AI engine automatically selects all enemy leaders, enemy units that pose a threat to the AI leader and unowned or enemy-owned villages as targets and assigns them certain base values. A score is then assigned to each target based on this base value, as well as on the movement cost required to get to the target, whether moving there would put the units involved in danger, etc.
 
 
 
It is possible to define additional targets or influence the relative ratings of the default targets. This is done with the [goal] tag, in which we can set criteria selecting targets and define their base values (which are then evaluated in the same way as the values of the default targets). Values set with the [goal] tag should always be relative to each other. The AI is willing to dedicate twice as many resources and travel twice as far to get to a target worth '2.0' as for a target worth '1.0'.
 
  
We stress again that these targets apply to the move-to-targets CA only and have no influence on other CAs. This is significant since CAs that deal with, for example, combat or village-grabbing have a higher score than the move-to-targets CA and are therefore always executed first. In practice that means that targets set with the [goal] tag only affect the AI behavior for targets that it cannot reach during the current turn, and only after combat, village-grabbing etc. are finished.
+
It is possible to define additional targets or influence the relative ratings of the default targets. This is done with the [[AiWML#The_.5Bgoal.5D_Tag|[goal] tag]], in which we can set criteria selecting targets and define their base values.  These are then evaluated in the same way as default targets. Values set with the [goal] tag should always be relative to each other and to the values of the default targets (see [[RCA_AI#RCA_AI_Aspect_and_Goal_Configuration|below]] for the latter). The AI is willing to dedicate twice as many resources and travel twice as far to get to a target worth '2.0' as for a target worth '1.0'.
  
Five types of targets can be set using the [goal] tag: target (the default), target_location, protect_unit, protect_my_unit, and protect_location.
+
We stress again that these targets apply to the ''move-to-targets'' CA only and have no influence on other CAs. This is significant since CAs that deal with, for example, combat or village-grabbing have a higher score than the move-to-targets CA and are therefore always executed first. In practice that means that targets set with the [goal] tag only affect the AI behavior for targets that it cannot reach during the current turn, and only after combat, village-grabbing etc. are finished.
As there a several different goals available, they are given [[AiWML#AI_Targets_and_Goals|their own subsection]] on the [[AiWML|AI aspects]] page.
 
  
 
==RCA AI Configuration==
 
==RCA AI Configuration==
Line 80: Line 87:
 
This section describes the configuration of the RCA AI.  An understanding of this setup is essential for [[Modifying AI Components]] or [[Creating Custom AIs]].
 
This section describes the configuration of the RCA AI.  An understanding of this setup is essential for [[Modifying AI Components]] or [[Creating Custom AIs]].
  
In the following, we assume that the reader is familiar with the general principles of the [[Wesnoth AI Framework]].  The keys and tags used in the config snippets shown below are also explained on that page.
+
In the following, we assume that the reader is familiar with the general principles of the [[Wesnoth AI Framework]].  The keys and tags used in the config snippets shown below are explained there.
  
 
=== RCA AI Stage Configuration ===
 
=== RCA AI Stage Configuration ===
  
The RCA AI uses only the ''main_loop'' stage.  It is defined in file [https://github.com/wesnoth/wesnoth/blob/master/data/ai/ais/ai_default_rca.cfg ai/ais/ai_default_rca.cfg] in the Wesnoth data directory:
+
The RCA AI uses only the ''main_loop'' stage.  It is defined in file [https://github.com/wesnoth/wesnoth/blob/master/data/ai/ais/ai_default_rca.cfg ai/ais/ai_default_rca.cfg] in the Wesnoth data directory.  {{DevFeature1.15|3}} Note that the example below is from a previous Wesnoth version as new candidate actions have since been added to the default AI. The linked file always contains the most up-to-date configuration though and can be used as reference.
[ai]
+
<syntaxhighlight lang='wml'>
    id=ai_default_rca
+
[ai]
    description=_"Multiplayer_AI^Default AI (RCA)" # wmllint: no spellcheck
+
    id=ai_default_rca
    version=10710
+
    description=_"Multiplayer_AI^Default AI (RCA)" # wmllint: no spellcheck
    [stage]
+
    [stage]
        id=main_loop
+
        id=main_loop
        name=testing_ai_default::candidate_action_evaluation_loop
+
        name=ai_default_rca::candidate_action_evaluation_loop
        {AI_CA_GOTO}                        # id="goto"
+
        {AI_CA_GOTO}                        # id="goto"
        {AI_CA_RECRUITMENT}                  # id="recruitment"
+
        {AI_CA_RECRUITMENT}                  # id="recruitment"
        {AI_CA_MOVE_LEADER_TO_GOALS}        # id="move_leader_to_goals"
+
        {AI_CA_MOVE_LEADER_TO_GOALS}        # id="move_leader_to_goals"
        {AI_CA_MOVE_LEADER_TO_KEEP}          # id="move_leader_to_keep"
+
        {AI_CA_MOVE_LEADER_TO_KEEP}          # id="move_leader_to_keep"
        {AI_CA_COMBAT}                      # id="combat"
+
        {AI_CA_HIGH_XP_ATTACK}              # id="high_xp_attack" (Wesnoth 1.13.6 and later only)
        {AI_CA_HEALING}                      # id="healing"
+
        {AI_CA_COMBAT}                      # id="combat"
        {AI_CA_VILLAGES}                    # id="villages"
+
        {AI_CA_HEALING}                      # id="healing"
        {AI_CA_RETREAT}                      # id="retreat"
+
        {AI_CA_VILLAGES}                    # id="villages"
        {AI_CA_MOVE_TO_TARGETS}              # id="move_to_targets"
+
        {AI_CA_RETREAT}                      # id="retreat"
        {AI_CA_PASSIVE_LEADER_SHARES_KEEP}  # id="passive_leader_shares_keep"
+
        {AI_CA_MOVE_TO_TARGETS}              # id="move_to_targets"
      [/stage]
+
        {AI_CA_PASSIVE_LEADER_SHARES_KEEP}  # id="passive_leader_shares_keep"
[/ai]
+
    [/stage]
 +
[/ai]
 +
</syntaxhighlight>
  
'''Note''': Before the RCA AI became the default, it was necessary to include the file (or one of its aliases) in the side definition.  That is not required any more, it is automatically included for all computer controlled sides, except when an [engine] or [stage] is defined specifically for a side. [ Todo: confirm that last part ]
+
'''Note''': Before the RCA AI became the default, it was necessary to include this file (or one of its aliases) in the side definition.  That is not required any more it is automatically included for all computer controlled sides, except when a stage is defined explicitly using the [stage] tag in the side definition.
  
 
=== RCA AI Candidate Action Configuration ===
 
=== RCA AI Candidate Action Configuration ===
  
 
In the configuration of the ''main_loop'' stage shown above, each candidate action is included as a macro.  Expanding the macros results in the following syntax (''combat'' CA example):
 
In the configuration of the ''main_loop'' stage shown above, each candidate action is included as a macro.  Expanding the macros results in the following syntax (''combat'' CA example):
[candidate_action]
+
<syntaxhighlight lang='wml'>
    id=combat
+
[candidate_action]
    engine=cpp
+
    id=combat
    name=ai_default_rca::combat_phase
+
    engine=cpp
    max_score=100000
+
    name=ai_default_rca::combat_phase
    score=100000
+
    max_score=100000
[/candidate_action]
+
    score=100000
 +
[/candidate_action]
 +
</syntaxhighlight>
  
 
==== Available Candidate Actions ====
 
==== Available Candidate Actions ====
Line 124: Line 135:
 
=== RCA AI Aspect and Goal Configuration ===
 
=== RCA AI Aspect and Goal Configuration ===
  
When a game is created, aspects are initialized with the default values given at [[AiWML]].  In the configuration file, they are in composite aspect format (which is why <code>version=10703</code> is set in the definition of the stage shown above) such as
+
When a game is created, '''aspects''' are initialized with the default values given at [[AiWML#List_of_AI_Aspects|AiWML]].  In the [https://github.com/wesnoth/wesnoth/blob/master/data/ai/utils/default_config.cfg configuration file], they are in ''composite'' aspect format such as
[aspect]
+
<syntaxhighlight lang='wml'>
    id=aggression
+
[aspect]
    engine=cpp
+
    id=aggression
    name=composite_aspect
+
    engine=cpp
    [default]
+
    name=composite_aspect
        engine=cpp
+
    [default]
        name=standard_aspect
+
        engine=cpp
        value=0.4
+
        name=standard_aspect
    [/default]
+
        value=0.4
[/aspect]
+
    [/default]
 +
[/aspect]
 +
</syntaxhighlight>
 
for ''aggression'', or
 
for ''aggression'', or
[aspect]
+
<syntaxhighlight lang='wml'>
    id=avoid
+
[aspect]
    engine=cpp
+
    id=avoid
    name=composite_aspect
+
    engine=cpp
    [default]
+
    name=composite_aspect
        engine=cpp
+
    [default]
        name=standard_aspect
+
        engine=cpp
        [value]
+
        name=standard_aspect
            [not]
+
        [value]
            [/not]
+
            [not]
        [/value]
+
            [/not]
    [/default]
+
        [/value]
[/aspect]
+
    [/default]
 +
[/aspect]
 +
</syntaxhighlight>
 
for ''[avoid]''.
 
for ''[avoid]''.
  
The default goals are not initialized in configuration files.  Instead, they are defined in the C++ code of the ''move-to-targets'' candidate action as follows:
+
The default '''goals''' are not initialized in configuration files.  Instead, they are defined in the C++ code of the ''move-to-targets'' candidate action as follows:
* Enemy leaders: Default value is given by aspect ''leader_value'', which in turn defaults to 3.
+
* Enemy leaders: Value is read from aspect ''leader_value'', which defaults to 3.
* Villages: Default value is given by aspect ''village_value'', which in turn defaults to 1.
+
* Villages: Value is read from aspect ''village_value'', which defaults to 1.
 
* Any enemy unit that can attack the AI's leader on the enemy's next turn: The value of these targets is proportional to the threat they pose to the AI leader and generally higher than those of the other two types of default targets.
 
* Any enemy unit that can attack the AI's leader on the enemy's next turn: The value of these targets is proportional to the threat they pose to the AI leader and generally higher than those of the other two types of default targets.
  

Revision as of 19:53, 22 December 2019

RCA AI Summary

The RCA (Register Candidate Action) AI is the default AI since Wesnoth 1.9. Its name stems from the fact that it has a list of potential actions, called candidate actions (CAs), that are evaluated for each move and are executed in order of evaluation score. The RCA AI is highly configurable in WML. It can also be modified by removing default CAs or adding custom CAs.

This page describes how the RCA AI is assembled out of the different components of Wesnoth's composite AI framework. For related information also see:

RCA AI components

The RCA AI utilizes the following components:

  • Candidate actions are the potential actions the AI might take during an AI turn, such as attacking, village grabbing, recruiting or retreating injured units.
  • Aspects are the parameters which can be used to configure the AI behavior.
  • Goals are a specific type of aspect which define targets toward which the AI moves. It is very important to understand that these are only move-to targets, not attack targets.

Links here are to the general descriptions of these components in the Wesnoth AI Framework, while the remainder of this page is about their use in the RCA AI.

The Candidate Actions (CAs) of the main_loop Stage in the RCA AI

For each move of its turn, the AI evaluates a number of potential actions, called candidate actions (CAs). The CA with the highest evaluation score is executed and the process is repeated, until no more valid moves are found. This ends the AI turn. (Note: This is the general process of the main_loop stage, it is not specific to the RCA AI.)

Most of the RCA AI CAs have a single fixed scores, with a few of the Lua CAs have two distinct (but otherwise also fixed) scores, as indicated below. These values can, in principle, be modified, but generally only to other fixed values. For example, the recruitment CA by default has a score of 180,000. The default score for attacks is 100,000. Thus, if recruiting is possible, it will always be done before attacks. If the score of the recruitment CA were lowered to below 100,000, then attacks would always be evaluated (and executed, if possible) before recruiting.

It is important to realize though that the default score settings do not mean that all recruiting always happens before all attacks. The "if possible" clauses in the previous paragraph become important here. Consider the case that all castle hexes are occupied by AI units which were recruited on the previous turn and have not been used yet this turn. No recruiting is possible (in which case the CA returns 0), so the AI moves on to other CAs. Once it gets to attacks, one of the units (or a group of units) might be selected to move off the castle and attack a close-by enemy. Now a castle hex is available for recruiting, which now has the highest evaluation score and is executed. This cycle might be repeated several times.

In its default configuration, the RCA AI evaluates the following CAs, sorted here in order of their evaluation score:

  • Goto CA (score 200,000; C++ CA): Move units toward the coordinates set by goto_x, goto_y in their unit WML.
  • (Version 1.15.3 and later only) Castle switching CA (scores 195,000 and 15,000; Lua CA): move the leader to a different castle, generally one that is closer to the enemy leader(s).
  • (Version 1.15.3 and later only) Retreat injured CA (scores 192,000 and 95,000; Lua CA): retreat injured units that are threatened by enemies to healing locations and away from these enemies.
  • (Version 1.15.3 and later only) Spread poison CA (score 190,000; Lua CA): spread poison to enemies, while taking care not to try to poison unpoisonable or already poisoned units.
  • Recruitment CA (score 180,000; C++ CA): Recruit or recall units.
  • Move leader to goals CA (score 140,000; C++ CA): Move the leader toward goals set by [leader_goal].
  • Move leader to keep CA (score 120,000; C++ CA): Move the leader toward the closest available keep.
  • High XP attack CA (score 100,010; Lua CA): An addition to the default AI as of Wesnoth 1.13.6, this CA performs attacks on enemy units so close to leveling that the combat CA (below) does not attack them.
  • Combat CA (score 100,000; C++ CA): Attack enemy units that are in range. Note that this CA includes the move to a hex adjacent to the enemy unit as well as the attack itself.
  • Healing CA (score 80,000; C++ CA): Move units onto healing locations (generally villages, but also next to healers that were placed previously).
  • Villages CA (score 60,000; C++ CA): Move units onto villages that are unowned or owned by an enemy.
  • Retreat CA (score 40,000; C++ CA): Evaluate if any units are in grave danger or hopelessly outnumbered, and if so, retreat them. *(Version 1.15.3 and later only) This CA was removed and replaced by the "retreat injured" CA described above
  • Move to targets CA (score 20,000; C++ CA): Evaluate potential targets and move units toward them. The evaluation takes into account how valuable the targets are (this is configurable by setting goals), how easily the AI's units can get there, how exposed to attacks they will be, etc. Targets are enemy leaders, enemy units that pose a threat to the AI leader and villages, as well as anything defined in a [goal] tag. It is important to understand that targets only apply to the move-to-targets CA. If a target is within range of the AI's unit(s) on the current turn, other CAs, such as combat, healing or villages have a higher evaluation score and are (usually) executed first. Thus, a target is specifically not an attack target, but a move target.
  • Leader shares keep CA (score 10,000; C++ CA): Move the leader off the keep to let an allied leader recruit, if an allied leader can get to the keep in one move. Note: This CA used to be called passive_leader_shares_keep. That name still works for the time being but will be deprecated at some point.
  • (Version 1.15.3 and later only) Move to any enemy CA (score 1,000; Lua CA): Move AI units toward any enemy. That is a fall-back CA in case none of the other CAs moved the unit. This is generally only the case on maps without enemy leaders and villages.

As already mentioned, the CAs are always evaluated (and executed, if a possible move is found) in the order given above. For example, the goto CA is always the first move that is done (if goto_x and goto_y are defined and a move toward that location is possible). Equivalently, if a valid attack is found in the combat CA, it is always executed before any healing, village grabbing or move-to-target moves. One of the effects this has is that attacks always have priority over any goals/targets of the move-to-target phase. It is very important to understand this, as it is a frequent source of confusion for scenario creators.

Note that nothing in Wesnoth's general AI mechanism limits CAs to having fixed evaluation scores. For example, some of the Micro AIs as well as some of the new Lua AI CAs return variable scores.

Use of Aspects in the RCA AI

An aspect is a parameter that the AI framework provides to scenario creators for configuring the AI behavior. For example, one can change how aggressive/careful the AI acts, how recruiting is prioritized or whether the leader participates in attacks.

The RCA AI has a large number of aspects. Their description is therefore given its own page.

Use of Goals and Targets in the RCA AI

Goals define AI targets which, in turn, are used in the move-to-targets candidate action to move the AI's units toward selected units or locations. The AI engine automatically selects all enemy leaders, enemy units that pose a threat to the AI leader and unowned or enemy-owned villages as targets and assigns them certain base values. A score is then assigned to each target based on this base value, as well as on the movement cost required to get there, whether moving there would put the units involved in danger, etc.

It is possible to define additional targets or influence the relative ratings of the default targets. This is done with the [goal] tag, in which we can set criteria selecting targets and define their base values. These are then evaluated in the same way as default targets. Values set with the [goal] tag should always be relative to each other and to the values of the default targets (see below for the latter). The AI is willing to dedicate twice as many resources and travel twice as far to get to a target worth '2.0' as for a target worth '1.0'.

We stress again that these targets apply to the move-to-targets CA only and have no influence on other CAs. This is significant since CAs that deal with, for example, combat or village-grabbing have a higher score than the move-to-targets CA and are therefore always executed first. In practice that means that targets set with the [goal] tag only affect the AI behavior for targets that it cannot reach during the current turn, and only after combat, village-grabbing etc. are finished.

RCA AI Configuration

This section describes the configuration of the RCA AI. An understanding of this setup is essential for Modifying AI Components or Creating Custom AIs.

In the following, we assume that the reader is familiar with the general principles of the Wesnoth AI Framework. The keys and tags used in the config snippets shown below are explained there.

RCA AI Stage Configuration

The RCA AI uses only the main_loop stage. It is defined in file ai/ais/ai_default_rca.cfg in the Wesnoth data directory. (Version 1.15.3 and later only) Note that the example below is from a previous Wesnoth version as new candidate actions have since been added to the default AI. The linked file always contains the most up-to-date configuration though and can be used as reference.

[ai]
    id=ai_default_rca
    description=_"Multiplayer_AI^Default AI (RCA)" # wmllint: no spellcheck
    [stage]
        id=main_loop
        name=ai_default_rca::candidate_action_evaluation_loop
        {AI_CA_GOTO}                         # id="goto"
        {AI_CA_RECRUITMENT}                  # id="recruitment"
        {AI_CA_MOVE_LEADER_TO_GOALS}         # id="move_leader_to_goals"
        {AI_CA_MOVE_LEADER_TO_KEEP}          # id="move_leader_to_keep"
        {AI_CA_HIGH_XP_ATTACK}               # id="high_xp_attack" (Wesnoth 1.13.6 and later only)
        {AI_CA_COMBAT}                       # id="combat"
        {AI_CA_HEALING}                      # id="healing"
        {AI_CA_VILLAGES}                     # id="villages"
        {AI_CA_RETREAT}                      # id="retreat"
        {AI_CA_MOVE_TO_TARGETS}              # id="move_to_targets"
        {AI_CA_PASSIVE_LEADER_SHARES_KEEP}   # id="passive_leader_shares_keep"
     [/stage]
[/ai]

Note: Before the RCA AI became the default, it was necessary to include this file (or one of its aliases) in the side definition. That is not required any more – it is automatically included for all computer controlled sides, except when a stage is defined explicitly using the [stage] tag in the side definition.

RCA AI Candidate Action Configuration

In the configuration of the main_loop stage shown above, each candidate action is included as a macro. Expanding the macros results in the following syntax (combat CA example):

[candidate_action]
    id=combat
    engine=cpp
    name=ai_default_rca::combat_phase
    max_score=100000
    score=100000
[/candidate_action]

Available Candidate Actions

See file data/core/macros/ai_candidate_actions.cfg for the definitions of all the macros, as well as for the ids, names and default scores of the available CAs.

RCA AI Aspect and Goal Configuration

When a game is created, aspects are initialized with the default values given at AiWML. In the configuration file, they are in composite aspect format such as

[aspect]
    id=aggression
    engine=cpp
    name=composite_aspect
    [default]
        engine=cpp
        name=standard_aspect
        value=0.4
    [/default]
[/aspect]

for aggression, or

[aspect]
    id=avoid
    engine=cpp
    name=composite_aspect
    [default]
        engine=cpp
        name=standard_aspect
        [value]
            [not]
            [/not]
        [/value]
    [/default]
[/aspect]

for [avoid].

The default goals are not initialized in configuration files. Instead, they are defined in the C++ code of the move-to-targets candidate action as follows:

  • Enemy leaders: Value is read from aspect leader_value, which defaults to 3.
  • Villages: Value is read from aspect village_value, which defaults to 1.
  • Any enemy unit that can attack the AI's leader on the enemy's next turn: The value of these targets is proportional to the threat they pose to the AI leader and generally higher than those of the other two types of default targets.

The first two types of goals can be disabled by setting aspects village_value or leader_value to zero. By contrast, close enemies cannot be removed from the list of targets, other than by removing the move-to-targets CA altogether. One can, however, effectively disable them by setting other goals with vastly higher values (such as 100,000).

Available Aspects and Goals

See file data/ai/utils/default_config.cfg for the definitions of all the aspects and their default values. The available goals are shown here.


See also: Wesnoth AI