GCI/Port AI WML configuration to new style syntax

From The Battle for Wesnoth Wiki
< GCI
Revision as of 16:19, 17 April 2023 by Egallager (talk | contribs) (Use wesnoth 1.9.2 or work on trunk version: fix redlink)

Use wesnoth 1.9.2 or work on trunk version

You can download 1.9.2 from here: http://wiki.wesnoth.org/Download#Development_.281.9_branch.29


Wesnoth uses a custom markup language called WML, which can be edited by hand (it's similar to xml)

AI configuration can be written using WML.

In 2009, a new style syntax for writing AI configurations in Wesnoth was created.

New syntax is described on Customizing_AI_in_Wesnoth_1.8

Old syntax is described on AiWML

We need to convert existing AI syntax to new style.

The preferred way to do it is to teach wesnoth's custom WML conversion tool, wmllint, (written in python) to do it, or to write a helper script to do it. Or it can be done by hand. In any case, human review is required, to see that everything is ok.

As an example of the conversion process, you can use the first scenario of Legend of Wesmere campaign:

before, it contained:

[ai]
   village_value=0
   leader_value=0
   protect_leader=0
   [avoid]
       x=1-30,1-30,1-3,7-30
       y=1-13,17-30,1-30,1-30
   [/avoid]
[/ai]

after:

{ai/aliases/stable_singleplayer.cfg}
[ai]
   {AI_SIMPLE_ALWAYS_ASPECT village_value 0}
   {AI_SIMPLE_ALWAYS_ASPECT leader_value 0}
   {AI_SIMPLE_ALWAYS_ASPECT_VALUE avoid (
       x=1-30,1-30,1-3,7-30
       y=1-13,17-30,1-30,1-30
   )}
[/ai]

Or, if we had separate config for 'night' time of day ( time_of_day=dusk,first_watch,second_watch)

before:

       [ai]
           recruitment_pattern=scout,fighter,fighter,archer,mixed fighter
       [/ai]
       [ai]
           time_of_day=dusk,first_watch,second_watch
           aggression=0.75
           caution=0.0
           grouping=offensive
       [/ai]

after:

 {ai/aliases/stable_singleplayer.cfg}
 [ai]
    {AI_SIMPLE_NIGHT_ASPECT aggression 0.75}
    {AI_SIMPLE_NIGHT_ASPECT caution 0}
    {AI_SIMPLE_NIGHT_ASPECT grouping offensive}
    {AI_SIMPLE_ALWAYS_ASPECT recruitment_pattern "scout,fighter,fighter,archer,mixed fighter"}
  [/ai]

you might need to ask questions about how a particular tag should be converted, ask Crab_ on #wesnoth-dev on libera.chat.

Conversion procedure

In general, we need to add {ai/aliases/stable_singleplayer.cfg} outside the ai tag. then, for each ai tag, we need to look if it's 'for all times or day' or for particular time of day. then, if it's an aspect, just use the appropriate form of

{AI_SIMPLE_NIGHT_ASPECT aspect_name aspect_value}
{AI_SIMPLE_DAY_ASPECT aspect_name aspect_value}
{AI_SIMPLE_ALWAYS_ASPECT aspect_name aspect_value}

list of aspects which are converted that way

aggression

attack_depth

[avoid]

caution

grouping

leader_aggression

leader_goal

leader_value

number_of_possible_recruits_to_force_recruit

passive_leader

passive_leader_shares_keep

recruitment_ignore_bad_combat

recruitment_ignore_bad_movement

recruitment_pattern

scout_village_targeting

simple_targeting

support_villages

village_value

villages_per_scout

[target]\[protect_..] tags are converted to [goal] tags, see the new-style docs for details.

for other AI parameters, figure it out or ask Crab_ on #wesnoth-dev on IRC at libera.chat

Notes (23rd November)

everything should be converted. if it's unclear how to convert something, ask.

for attack_depth, you can convert it in the same way as aggression or, in the specific case '3 for easy, 4 for medium, 5 for hard', use {AI_SCALE_ATTACK_DEPTH_BY_DIFFICULTY} macro

ai goal syntax is at http://wiki.wesnoth.org/Customizing_AI_in_Wesnoth_1.8#AI_goals_.28_via_.5Bgoal.5D_tags_.29

to test the changes, you don't have to recompile - hitting F5 from main menu or restarting should be enough to refresh the cache and pick up new changes to WML code.

you can use :inspect - it allows you to see the ai configuration and you can compare the results of your changes vs the results of the 'upgrade' procedure written in c++ - by using :inspect two times, with and without your changes

Also, you're welcome to show incomplete results for review (link to these in google's task tracker)

If something varies by difficulty, or uses QUANTITY macro, e.g. {QUANTITY aggression 0.55 0.75 0.85} convert it using the ON_DIFFICULTY macro {AI_SIMPLE_ALWAYS_ASPECT aggression {ON_DIFFICULTY 0.55 0.75 0.85} }

Notes (24th November)

convert {NO_SCOUTS} to {AI_NO_SCOUTS}

Notes (25th November)

{ai/aliases/stable_singleplayer.cfg} should be given inside [side] tag, inside each [side] tag where there's at least one [ai] tag.

please test your changes by loading every and each scenario from wesnoth to see if it loads without errors (use debug mode ':n' command to switch levels)

protect_leader and protect_leader_radius

are converted differently (see Customizing_AI_in_Wesnoth_1.8#protect_my_unit_.5Bgoal.5D )


if the block includes turns=, then this block is active only during the specific turns.

To deal with them:

1) write a wml event to change the AI on the turn where it changes.

2) use more low-level macros (deal with [facet] tags ) to specify the active turns for each of the time periods.

Notes (29th November)

To convert [ai] blocks which have turns=, you can the [aspect] tag directly without the macros:

[aspect]
  id=aggression
  [facet]
       value = 0.4
       time_of_day="dawn, morning, afternoon"
       turns=1-12
  [/facet]
  [facet]
       value = 0.7
       time_of_day="dusk,first_watch,second_watch"
       turns=1-12
  [/facet]
  [facet]
       value = 0.9
       turns=13-FOREVER
   [/facet]
[/aspect]


To handle adjacent '[avoid]' sections, combine them using the [or] filter

converting:

[avoid]
x,y=1,11
[/avoid]
[avoid]
x,y=21,31
[/avoid]
[avoid]
x,y=41,51
[/avoid]

to

{AI_SIMPLE_ALWAYS_ASPECT_VALUE avoid
(
x,y=1,11
[or]
x,y=21,31
[/or]
[or]
x,y=41,51
[/or]
)}