RCA AI

From The Battle for Wesnoth Wiki

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:

Configuration of AI can be divided into two broad categories:

  • Initial configuration – the [ai] tag which may be placed in [side], [multiplayer_side], or [unit].
  • Dynamic modification – ActionWML that modifies AI on the fly. This covers the [modify_ai] and [micro_ai] tags (although those can also be placed in the initial configuration) as well as the old [add_ai_behaviour] tag and some elements of the [modify_side] tag.

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) 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

This page was last edited on 28 November 2022, at 00:47.