#textdomain wesnoth-ai # @file data/scenario-luaai.cfg [test] name= _ "Test scenario for Lua AI" map_data="border_size=1 usage=map 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=lua_ai {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= _ "Formula 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] [event] name=side 2 turn 1 first_time_only=yes {MODIFY_AI_DELETE_CANDIDATE_ACTION 2 ca_loop firstca} [/event] [event] name=side 2 turn 1 [modify_side] side=2 [ai] [avoid] x,y=1,11 [/avoid] [leader_goal] x,y=2,12 [/leader_goal] [/ai] [/modify_side] #{MODIFY_UNIT side=1 moves 0} [/event] [side] type=Dwarvish Steelclad id=side_1_leader side=1 canrecruit=yes recruit=Dwarvish Guardsman,Dwarvish Fighter,Dwarvish Thunderer,Thief,Poacher,Footpad gold=100 controller=human [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] [/side] [side] #controller=human name=LuaAI type=Dark Sorcerer side=2 canrecruit=yes recruit=Skeleton,Skeleton Archer,Walking Corpse,Ghost,Vampire Bat,Dark Adept,Ghoul gold=100 shroud=yes [unit] placement=recall type="Skeletal Dragon" id="Kiressh" name= _ "Kiressh" [/unit] [unit] x,y=8,5 type="Orcish Archer" name= _ "Bilbo" [/unit] [unit] x,y=3,8 type="Walking Corpse" name= _ "Sirené" [/unit] [unit] x,y=16,5 type="Wolf Rider" name= _ "Rark" [/unit] [unit] x,y=3,11 type="Goblin Spearman" generate_name=yes [/unit] [unit] x,y=3,13 type="Goblin Spearman" generate_name=yes [/unit] [unit] x,y=2,12 type="Goblin Spearman" generate_name=yes [/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] version=10710 [goal] name=protect_location value=5 protect_radius=16 [criteria] #NOTE: this is a SLF, because we're protecting a location x,y=42,20 [/criteria] [/goal] [goal] name=lua_goal value=6 engine=lua code = << local t = {} t[1] = {["value"]=2.3, ["type"]=3, ["loc"]={["x"]=5, ["y"]=6}} t[2] = {["value"]=2.4, ["type"]=4, ["loc"]={["x"]=4, ["y"]=16}} return t >> [/goal] [aspect] id=aggression engine=lua code = << return 0.23 >> [/aspect] [engine] name="lua" code= << --! ============================================================== local ai = ... local debug_utils = wesnoth.require "~add-ons/Wesnoth_Lua_Pack/debug_utils.lua" local my_ai = { } -- data = { ["pers"] = 5, ["stringg"] = "stringg" } local ai_stdlib = wesnoth.require('ai/lua/stdlib.lua'); ai_stdlib.init(ai, true) function my_ai:stage_hello() --local att = ai.get_attacks() --debug_utils.dbms(att,false,"variable",false) --ai.debug.get_enemy_dst_src() --debug_utils.dbms(ai,false,"variable",false) local s = wesnoth.debug_ai(2) --wesnoth.message("Hi", s) --wesnoth.message(tostring(s["components"]["stage"]["ai_default_rca::candidate_action_evaluation_loop"]["candidate_action"]["second"]:exec(true))) --debug_utils.dbms(s,false,"variable",false) wesnoth.message("LuaAI agg", tostring(s.get_ai().get_aggression())) end function my_ai:candidate_action_evaluation_hello() wesnoth.message('hello from candidate action evaluation!') return 42, {test=123} end function my_ai:candidate_action_execution_hello(cfg) wesnoth.message('hello from candidate action execution!') --wesnoth.message('test value is ') -- .. cfg.test) -- ERROR: cfg.test is nil here self:do_moves() end function my_ai:candidate_action_evaluation_hello2() wesnoth.message('hello from second candidate action evaluation!') return 99 end function my_ai:candidate_action_execution_hello2() wesnoth.message('hello from second candidate action execution!') self:do_moves() end --wesnoth.modify_ai({side=2, action="delete", path="stage[ca_loop].candidate_action[firstca]"}) function my_ai:do_moves() wesnoth.message("ldbg", tostring(wesnoth.game_config.debug_lua)) my_leader = wesnoth.get_units({side = 1, can_recruit=yes})[1].name --! full move. note that the my_leader still can be used altrough x and y are now different. --ai.check_move(my_leader, 11, 23) --! attack with auto weapon/aggression ai.attack(2, 12, 3, 12, 4, 10) --! attack with weapon selected ai.check_attack(3, 11, 3, 12, 1) --! attack with different aggression ai.attack(3, 13, 3, 12, -1, 0.9) if wesnoth.current.turn==1 then --! recruit on specific location ai.recruit("Vampire Bat", 10, 22) --! recruit on any suitable location ai.check_recruit("Skeleton") --! recall on any suitable location. ai.check_recall("Kiressh") end end -- compulsory for the external CA's function my_ai:get_ai() return ai end return my_ai --! ============================================================== >> [/engine] [stage] name=ai_default_rca::candidate_action_evaluation_loop id=ca_loop [candidate_action] engine=lua name=first id=firstca evaluation="return (...):candidate_action_evaluation_hello()" execution="local ai, cfg = ...; ai:candidate_action_execution_hello(cfg)" [/candidate_action] [candidate_action] engine=lua name=second evaluation="return (...):candidate_action_evaluation_hello2()" execution="(...):candidate_action_execution_hello2()" [/candidate_action] [candidate_action] engine=lua name=external location="ai/lua/extCAexample.lua" [/candidate_action] [/stage] [stage] name="another_stage" engine="lua" code= "(...):stage_hello()" [/stage] [/ai] [/side] [/test] # vim: tabstop=4: shiftwidth=4: expandtab: softtabstop=4: autoindent: