wesnoth/data/ai/scenarios/scenario-lua_ai_unit_actions.cfg
Celtic Minstrel 2d95c0f7d3 AI: Convert the FormulaAI example scenario to do all the same things using Lua
- Unit formulas are replaced by inline MicroAIs or candidate actions placed in the unit's [ai] tag.
  - The stationed_guardian MicroAI was chosen as the closest match to the guardian FormulaAI. It's not a perfect fit, but it's pretty close.
  - The goto and patrol MicroAIs are fairly obvious substitutes for the respective unit formulas.
  - The priority test in unit formulas is replaced by fairly basic inline non-external CAs with differing scores.
- The side formulas (opening.fai) have been converted to a separate Lua stage using a new opening.lua. However, that's only a partial conversion. The move and attack functionalities of opening.fai are missing from opening.lua; instead the built-in move, move leader to keep, and combat CAs are used.
- The scouting FormulaAI CA has been ported to Lua. It remains a very basic AI, probably not well-suited to genera use.
- The level up attack FormulaAI CA has been ported to Lua. Like the new scouting CA, this is mostly intended to serve as an example.
2021-09-04 22:20:28 -04:00

320 lines
16 KiB
INI

#textdomain wesnoth-test
# @file data/scenario-test.cfg
[test]
name=_"Test scenario"
map_data="
Hh , Hh , Gg , Wwf , Wwf , Gs^Fp , Mm , Hh , Gg , Gs^Fp , Gg , Hh , Gg , Mm , Hh , Mm , Wwf , Wwf , Hh , Gs^Fp , Hh , Mm , Mm
Hh , Hh , Gg^Ve , Wwf , Wwf , Gs^Fp , Mm , Hh , Gg , Gs^Fp , Gg , Hh , Gg , Mm , Hh , Mm , Wwf , Wwf , Hh , Gs^Fp , Hh , Mm , Mm
Wwf , Wwf , Wwf , Wwf , Gg , Wwf , Wwf , Hh , Gg , Gg , Wwf , Ch , Wwf , Gs^Fp , Wwf , Wwf , Re , Re , Hh , Mm , Wwf , Mm , Mm
Mm , Mm , Wwf , Gs^Fp , Gg^Vh , Wwf , Gg , Gg , Wwf , Wwf , Wwf , 1 Kh , Ch , Wwf , Re , Re , Rd , Rd , Wwf , Wwf , Gs^Fp , Wwf , Wwf
Wwf , Wwf , Mm , Wwf , Gs^Fp , Wwf , Wwf , Wwf , Gg^Vh , Gg , Wwf , Ch , Wwf , Ch , Rd , Rd , Wwf , Wwf , Gg^Vh , Gs^Fp , Re^Gvs , Hh , Hh
Hh , Hh , Wwf , Gs^Fp , Wwf , Wwf , Gg , Gg , Gg , Gg , Wwf , Ch , Gg , Wwf , Wwf , Wwf , Mm , Gs^Fp , Re , Re^Gvs , Gg^Wm , Re^Gvs , Re^Gvs
Wwf , Wwf , Mm , Wwf , Hh , Gs^Fp , Rd , Rd , Gg , Gg , Wwf , Wwf , Gs^Fp , Gg , Hh , Gg , Re , Re , Rd , Rd , Gg , Hh , Hh
Hh , Hh , Gs^Fp , Gg , Gg , Rd , Gg , Gg , Wwf , Wwf , Gs^Fp , Wwf , Gs^Fp , Mm , Re , Re , Rd , Rd , Gg , Gg^Efm , Mm , Gs^Fp , Gs^Fp
Gs^Fp , Gs^Fp , Gg , Gg , Wwf , Gg , Wwf , Wwf , Mm , Hh , Wwf , Wwf , Re , Re , Rd , Rd , Rd , Gg , Gs^Fp , Gs^Fp , Gs^Fp , Hh , Hh
Hh , Hh , Wwf , Wwf , Hh , Wwf , Gg , Gg , Gg , Gg , Wwf , Re , Re , Rd , Gg , Gg , Gg , Gg^Vh , Hh , Gg , Wwf , Gg^Efm , Gg^Efm
Wwf , Wwf , Hh , Gg^Efm , Gs^Fp , Hh^Vhh , Gg , Gg , Gg , Ss^Vhs , Hh , Ww , Gs^Fp , Gg , Gs^Fp , Hh , Wwf , Wwf , Wwf , Wwf , Gg , Wwf , Wwf
Hh , Hh , Gg , Gg , Re , Gg , Re , Re , Gg , Ss , Gs^Fp , Ww , Hh , Mm , Ww , Wwf , Gg , Gg , Ds , Gg , Gg , Gs^Fp , Gs^Fp
Gs^Fp , Gs^Fp , Gg , Rd , Rd , Re , Rd , Re , Hh , Mm , Wwf , Ww , Ww , Ww , Gg , Gg , Hh , Gs^Fp , Rd , Rd , Hh , Gg , Gg
Rd , Rd , Gs^Fp , Hh , Rd , Rd , Gs^Fp , Re , Gg , Gg , Wwf , Gg , Wwf , Gg , Gg , Re , Gs^Fp , Hh , Rd , Mm , Gs^Fp , Rd , Rd
Rd , Rd , Hh , Mm , Rd , Hh , Hh , Re , Gg , Gg , Ww , Gg , Wwf , Gg , Hh , Re , Rd , Rd , Rd , Hh , Gg , Rd , Rd
Gg , Gg , Gg , Rd , Ds , Gs^Fp , Gg , Gg , Ww , Ww , Hh , Ww , Gs^Fp , Mm , Gg , Re , Re , Re , Re , Rd , Gg , Gs^Fp , Gs^Fp
Gs^Fp , Gs^Fp , Gg , Gg , Wwf , Gg , Wwf , Wwf , Gs^Fp , Mm , Gs^Fp , Ww , Hh , Ss , Gg , Re , Gg , Gg , Gs^Fp , Gg , Hh , Hh , Hh
Wwf , Wwf , Wwf , Wwf , Hh , Wwf , Gg , Hh , Gg , Gg , Re , Ww , Wwf , Ss^Vhs , Gg , Gg , Gg , Hh^Vhh , Hh , Gg^Efm , Wwf , Wwf , Wwf
Gg^Efm , Gg^Efm , Gs^Fp , Gg , Gs^Fp , Gg^Vh , Rd , Gg , Rd , Rd , Re , Re , Wwf , Gg , Mm , Gg , Wwf , Wwf , Wwf , Wwf , Gg , Mm , Mm
Hh , Hh , Mm , Gs^Fp , Gg , Gg , Rd , Rd , Re , Re , Gs^Fp , Wwf , Gs^Fp , Hh , Wwf , Wwf , Gg , Gg , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp
Gs^Fp , Gs^Fp , Gg , Gg^Efm , Rd , Rd , Re , Re , Hh , Mm , Gg , Wwf , Wwf , Wwf , Gg , Gg , Rd , Rd , Hh , Gg , Mm , Hh , Hh
Hh , Hh , Gg^Wm , Rd , Re , Re , Mm , Gg , Wwf , Wwf , Wwf , Ch , Gg , Gg , Gg , Rd , Gg , Gs^Fp , Wwf , Wwf , Wwf , Wwf , Wwf
Re^Gvs , Re^Gvs , Re^Gvs , Re^Gvs , Gg^Vh , Gs^Fp , Wwf , Wwf , Rd , Ch , Ch , Ch , Gg , Gg , Gg^Vh , Gg , Wwf , Wwf , Gs^Fp , Gs^Fp , Gg^Ve , Gg , Gg
Hh , Hh , Gs^Fp , Gs^Fp , Wwf , Wwf , Rd , Rd , Re , Re , Wwf , 2 Kh , Wwf , Gg , Wwf , Wwf , Gg , Wwf , Wwf , Wwf , Wwf , Gs^Fp , Gs^Fp
Gs^Fp , Gs^Fp , Wwf , Wwf , Mm , Rd , Gs^Fp , Hh , Wwf , Wwf , Gg , Ch , Gg , Wwf , Hh , Gg , Wwf , Wwf , Gg^Vh , Gg , Wwf , Mm , Mm
Gs^Fp , Gs^Fp , Wwf , Wwf , Mm , Rd , Gs^Fp , Wwf , Wwf , Gg , Gg , Gg , Gg , Gg , Hh , Gg , Wwf , Wwf , Gg , Gg , Wwf , Mm , Mm
"
turns=90
id=unit_actions
{DEFAULT_SCHEDULE}
[label]
x,y=16,5
text=_"Patrol waypoint 1"
[/label]
[label]
x,y=16,15
text=_"Patrol waypoint 2"
[/label]
[label]
x,y=3,14
text=_"Priorities test"
[/label]
[label]
x,y=2,12
text=_"first"
[/label]
[label]
x,y=3,11
text=_"second"
[/label]
[label]
x,y=3,13
text=_"third"
[/label]
[label]
x,y=8,5
text=_"Location guarded (range = 3)"
[/label]
[side]
type=Dwarvish Steelclad
id=side_1_leader
side=1
canrecruit=yes
recruit=Dwarvish Guardsman,Dwarvish Fighter,Dwarvish Thunderer,Thief,Poacher,Footpad
gold=200
controller=human
suppress_end_turn_confirmation=yes
[unit]
x,y=10,8
type="Elvish Archer"
hitpoints=1
generate_name=yes
[/unit]
[unit]
x,y=3,12
type="Elvish Fighter"
random_traits=no
generate_name=yes
[modifications]
[trait]
id=move
[effect]
apply_to=movement
set=0
[/effect]
[/trait]
[trait]
id=hp
[effect]
apply_to=hitpoints
increase_total=120
[/effect]
[/trait]
[/modifications]
[/unit]
[village]
x,y=2,1
[/village]
[village]
x,y=4,3
[/village]
[village]
x,y=8,4
[/village]
[village]
x,y=18,4
[/village]
[/side]
[side]
#controller=human
suppress_end_turn_confirmation=yes
name=_"AI"
type=Dark Sorcerer
side=2
canrecruit=yes
recruit=Skeleton,Skeleton Archer,Walking Corpse,Ghost,Vampire Bat,Dark Adept,Ghoul
gold=200
shroud=yes
[unit]
x,y=8,5
type="Orcish Archer"
generate_name=yes
[ai]
[micro_ai]
ai_type=stationed_guardian
station_x,station_y=8,5
distance=3
[/micro_ai]
[/ai]
[/unit]
[unit]
x,y=3,8
type="Walking Corpse"
generate_name=yes
[ai]
[micro_ai]
ai_type=goto
[filter_location]
formula=castle
[/filter_location]
release_unit_at_goal=yes
[/micro_ai]
[/ai]
[/unit]
[unit]
x,y=16,5
type="Wolf Rider"
generate_name=yes
[ai]
[micro_ai]
ai_type=patrol
waypoint_x=16,16
waypoint_y=5,15
attack_range=3
[/micro_ai]
[/ai]
[/unit]
[unit]
x,y=3,11
type="Goblin Spearman"
generate_name=yes
[ai]
[candidate_action]
engine=lua
max_score=10000010
evaluation=<<
local u = wesnoth.units.find(select(4, ...))[1]
if not u then return 0 end
return ai.check_attack(u,3,12).ok and 10000010 or 0
>>
execution=<<
local u = wesnoth.units.find(select(4, ...))[1]
ai.attack(u,3,12)
>>
[/candidate_action]
[/ai]
[/unit]
[unit]
x,y=3,13
type="Goblin Spearman"
generate_name=yes
[ai]
[candidate_action]
engine=lua
max_score=10000009
evaluation=<<
local u = wesnoth.units.find(select(4, ...))[1]
if not u then return 0 end
return ai.check_attack(u,3,12).ok and 10000009 or 0
>>
execution=<<
local u = wesnoth.units.find(select(4, ...))[1]
ai.attack(u,3,12)
>>
[/candidate_action]
[/ai]
[/unit]
[unit]
x,y=2,12
type="Goblin Spearman"
generate_name=yes
[ai]
[candidate_action]
engine=lua
max_score=10000011
evaluation=<<
local u = wesnoth.units.find(select(4, ...))[1]
if not u then return 0 end
return ai.check_attack(u,3,12).ok and 10000011 or 0
>>
execution=<<
local u = wesnoth.units.find(select(4, ...))[1]
ai.attack(u,3,12)
>>
[/candidate_action]
[/ai]
[/unit]
[unit]
x,y=7,20
type="Silver Mage"
generate_name=yes
[/unit]
[unit]
x,y=6,20
type="Ghost"
generate_name=yes
[/unit]
[unit]
x,y=15,22
type="Ghost"
generate_name=yes
[/unit]
[unit]
x,y=12,19
type="Ghost"
generate_name=yes
[/unit]
[unit]
x,y=10,6
type="Lich"
experience=149
generate_name=yes
[/unit]
[ai]
[stage]
engine=lua
code="wesnoth.dofile 'ai/lua/opening.lua'"
[/stage]
[stage]
id=main_loop
name=ai_default_rca::candidate_action_evaluation_loop
[candidate_action]
engine=cpp
name=ai_default_rca::move_leader_to_keep_phase
max_score = 60000
score = 60000
[/candidate_action]
[candidate_action]
engine=cpp
name=ai_default_rca::move_to_targets_phase
max_score = 20000
score = 20000
[/candidate_action]
[candidate_action]
engine=cpp
name=ai_default_rca::combat_phase
max_score = 20000
score = 20000
[/candidate_action]
[candidate_action]
engine=lua
name=scouting
location="ai/lua/ca_simple_scouting.lua"
max_score = 30000
[/candidate_action]
[candidate_action]
engine=lua
name=level_up_attack
location = "ai/lua/ca_level_up_attack.lua"
max_score = 100000
[/candidate_action]
[/stage]
[stage]
# This exists so you can see the AI's shroud.
engine=lua
name=fallback
code="ai.fallback_human()"
[/stage]
[/ai]
[/side]
[/test]