mirror of
https://github.com/wesnoth/wesnoth
synced 2025-04-24 21:43:52 +00:00

- 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.
320 lines
16 KiB
INI
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]
|