From 961d134ee24ff0b07cd8073816a485c6237f9552 Mon Sep 17 00:00:00 2001 From: mattsc Date: Thu, 24 Mar 2016 08:07:01 -0700 Subject: [PATCH] Fix and simplify Lua AI test scenario --- data/ai/lua/extCAexample.lua | 19 +- data/ai/scenarios/scenario-lua-ai.cfg | 254 ++++------------------- data/ai/scenarios/scenario-no_engine.cfg | 171 ++------------- 3 files changed, 66 insertions(+), 378 deletions(-) diff --git a/data/ai/lua/extCAexample.lua b/data/ai/lua/extCAexample.lua index 00a4277336f5..3a88d825ec04 100644 --- a/data/ai/lua/extCAexample.lua +++ b/data/ai/lua/extCAexample.lua @@ -2,15 +2,20 @@ example_ca = {} -function example_ca:eval(ai) - wesnoth.message("External eval says hi!") - - return 10000 +function example_ca:evaluation(ai) + wesnoth.message("External CA evaluation says hi.") + + return 10000 end -function example_ca:exec(ai) - wesnoth.message("External CA exec attacks!") - ai.attack(2, 12, 3, 12, 1, 1) -- showcasing the presence of the AI table +function example_ca:execution(ai) + wesnoth.message("External CA execution attacks.") + + -- Note that there is no check whether these attacks are possible. + -- The CA will therefore be blacklisted the second time it gets called. + ai.attack(2, 12, 3, 12, 1, 1) + ai.attack(3, 13, 3, 12, 2, 1) + ai.attack(3, 11, 3, 12) end return example_ca \ No newline at end of file diff --git a/data/ai/scenarios/scenario-lua-ai.cfg b/data/ai/scenarios/scenario-lua-ai.cfg index b8b5a267762c..d00bc3f46000 100644 --- a/data/ai/scenarios/scenario-lua-ai.cfg +++ b/data/ai/scenarios/scenario-lua-ai.cfg @@ -3,6 +3,10 @@ [test] name= _ "Test scenario for Lua AI" + id=lua_ai + turns=90 + {DEFAULT_SCHEDULE} + 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 @@ -32,84 +36,14 @@ Gs^Fp , Gs^Fp , Wwf , Wwf , Mm , Rd 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" # wmllint: no spellcheck - [/label] - - [label] - x,y=16,15 - text= _ "Patrol waypoint 2" # wmllint: no spellcheck - [/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)" # wmllint: no spellcheck - [/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 + controller=human + id=side_1_leader + type=Dwarvish Steelclad 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 @@ -136,14 +70,14 @@ Gs^Fp , Gs^Fp , Wwf , Wwf , Mm , Rd [/side] [side] - #controller=human + side=2 + controller=ai + id=LuaAI 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 @@ -152,23 +86,6 @@ Gs^Fp , Gs^Fp , Wwf , Wwf , Mm , Rd 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" @@ -187,169 +104,80 @@ Gs^Fp , Gs^Fp , Wwf , Wwf , Mm , Rd 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] - [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= << + 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())) + wesnoth.message('Lua AI stage says hello.') + std_print('Lua AI stage says hello.') end - function my_ai:candidate_action_evaluation_hello() - wesnoth.message('hello from candidate action evaluation!') + wesnoth.message('Hello from candidate action evaluation!') + std_print('Hello from candidate action evaluation!') - return 42, {test=123} + return 42 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() + wesnoth.message('Hello from candidate action execution!') + std_print('Hello from candidate action execution!') end function my_ai:candidate_action_evaluation_hello2() - wesnoth.message('hello from second candidate action evaluation!') - return 99 + wesnoth.message('Hello from second candidate action evaluation!') + std_print('Hello from second candidate action evaluation!') + + return 99 end function my_ai:candidate_action_execution_hello2() - wesnoth.message('hello from second candidate action execution!') + wesnoth.message('Hello from second candidate action execution!') + std_print('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 + -- Note that there is no check whether these actions are possible. + -- The CA will therefore be blacklisted the second time it gets called. + ai.attack(2, 12, 3, 12, 1, 1) + ai.attack(3, 13, 3, 12, 2, 1) + ai.attack(3, 11, 3, 12) - --! 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 + if wesnoth.current.turn==1 then + ai.recruit("Vampire Bat", 10, 22) + ai.recall("Kiressh", 11, 21) + 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 + name=first_CA + id=first_CA evaluation="return (...):candidate_action_evaluation_hello()" - execution="local ai, cfg = ...; ai:candidate_action_execution_hello(cfg)" + execution="(...):candidate_action_execution_hello()" [/candidate_action] [candidate_action] engine=lua - name=second + id=second_CA + name=second_CA 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" @@ -359,5 +187,3 @@ return my_ai [/ai] [/side] [/test] - -# vim: tabstop=4: shiftwidth=4: expandtab: softtabstop=4: autoindent: diff --git a/data/ai/scenarios/scenario-no_engine.cfg b/data/ai/scenarios/scenario-no_engine.cfg index 4c9877bcc170..e3fcf9c2baed 100644 --- a/data/ai/scenarios/scenario-no_engine.cfg +++ b/data/ai/scenarios/scenario-no_engine.cfg @@ -1,8 +1,11 @@ #textdomain wesnoth-ai -# @file data/scenario-luaai.cfg [test] name= _ "Test scenario for Lua AI with no Lua engine defined" + id=lua_ai_no_engine + turns=90 + {DEFAULT_SCHEDULE} + 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 @@ -32,84 +35,14 @@ Gs^Fp , Gs^Fp , Wwf , Wwf , Mm , Rd 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_no_engine - - {DEFAULT_SCHEDULE} - - [label] - x,y=16,5 - text= _ "Patrol waypoint 1" # wmllint: no spellcheck - [/label] - - [label] - x,y=16,15 - text= _ "Patrol waypoint 2" # wmllint: no spellcheck - [/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)" # wmllint: no spellcheck - [/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 + controller=human + id=side_1_leader + type=Dwarvish Steelclad 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 @@ -136,38 +69,14 @@ Gs^Fp , Gs^Fp , Wwf , Wwf , Mm , Rd [/side] [side] - #controller=human + side=2 + controller=ai + id=LuaAI 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 @@ -187,71 +96,19 @@ Gs^Fp , Gs^Fp , Wwf , Wwf , Mm , Rd 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] - [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] [stage] name=ai_default_rca::candidate_action_evaluation_loop id=ca_loop [candidate_action] engine=lua - name=external + name=external_CA + id=external_CA location="ai/lua/extCAexample.lua" + eval_parms="" + exec_parms="" [/candidate_action] [/stage] [/ai] [/side] [/test] - -# vim: tabstop=4: shiftwidth=4: expandtab: softtabstop=4: autoindent: