Difference between revisions of "LuaAI"
(→Preload event) |
|||
Line 83: | Line 83: | ||
The code attribute can be further expanded by any Lua code needed. For example, we can set up some global variables there or include additional code libraries("wesnoth.require("ai/lua/patrol.lua")" - includes code that handles patrolling of units). | The code attribute can be further expanded by any Lua code needed. For example, we can set up some global variables there or include additional code libraries("wesnoth.require("ai/lua/patrol.lua")" - includes code that handles patrolling of units). | ||
+ | |||
+ | == Engine code == | ||
+ | |||
+ | In the engine tag you should define functions that will handle evaluation and execution of your custom candidate actions and stages. You can also run some code that is intended to be run once in the beginning.<br /> | ||
+ | The definition of the [engine] tag should be place inside the [ai] tag. | ||
+ | |||
+ | [engine] | ||
+ | name="lua" | ||
+ | code= << | ||
+ | -- your engine code here | ||
+ | >> | ||
+ | [/engine] | ||
== Stages == | == Stages == | ||
− | + | Once the engine has been set up, we can start adding stages to the configuration of our AI.<br /> | |
+ | To add a stage we just use the [stage] tag. | ||
+ | [stage] | ||
+ | engine=lua | ||
+ | code=<< | ||
+ | -- Code for stage execution here | ||
+ | -- It is better to call predefined functions for the [engine] code, | ||
+ | -- than to define the functions here, to keep the structure of the stages clear | ||
+ | >> | ||
+ | [/stage] | ||
== Candidate actions == | == Candidate actions == |
Revision as of 11:18, 11 July 2011
A page containing information on configuring the AI using Lua. NB: previous contents of the page moved to http://wiki.wesnoth.org/LuaAI(old)
Aspects
Patch r49721 enabled users to write aspects using Lua. This simplifies the definition of aspects that are meant to change depending on the game state. A good example could be aggression, which changes depending on the time of the day(since ToD affects the actual battle performance of your forces).
Static aggression:
[aspect] id="aggression" engine="lua" value="0.3" [/aspect]
Dynamic aggression:
[aspect] id=aggression engine=lua code=<< wesnoth.fire("store_time_of_day") local value = 0 tod = tostring(wesnoth.get_variable('time_of_day').name) if (tod == 'Morning') then value = 0.2 else value = 1 end wesnoth.fire("clear_variable", {name = "time_of_day"}) return value >> [/aspect]
Note: the way of getting the ToD is hacky here, but I will create a more elegant method soon(Nephro).
Also note the difference between 'code' and 'value' attributes, this is important.
At the moment, it is possible to create the following aspects using Lua(the list will be constantly updated):
aggression // double attack_depth // int avoid // exposed as map_location[], where map_location is a table of form {x, y} caution // double grouping // string leader_aggression // double leader_goal // exposed as a config leader_value // double number_of_possible_recruits_to_force_recruit // double passive_leader // bool passive_leader_shares_keep // bool recruitment_ignore_bad_combat // bool recruitment_ignore_bad_movement // bool recruitment_pattern // string[] scout_village_targeting // double simple_targeting // bool support_villages // bool village_value // double villages_per_scout // int
Note: simple numeric, bool and string aspect creation can be enabled just by adding a specific factory to registry.cpp, this will also soon be done.
Preload event
It is a good idea to have such a preload event in your scenario if you are intending to use Lua for AI programming or customizing. The code of this event will most probably be moved out to a macro(except for the line that requires patrol.lua, since it is not necessary).
[event] name=preload first_time_only=no [lua] code = << H = wesnoth.require "lua/helper.lua" W = H.set_wml_action_metatable {} _ = wesnoth.textdomain "my-campaign" ai = {} ca_counter = 0 H.set_wml_var_metatable(_G) wesnoth.require("ai/lua/patrol.lua") >> [/lua] [/event]
The code attribute can be further expanded by any Lua code needed. For example, we can set up some global variables there or include additional code libraries("wesnoth.require("ai/lua/patrol.lua")" - includes code that handles patrolling of units).
Engine code
In the engine tag you should define functions that will handle evaluation and execution of your custom candidate actions and stages. You can also run some code that is intended to be run once in the beginning.
The definition of the [engine] tag should be place inside the [ai] tag.
[engine] name="lua" code= << -- your engine code here >> [/engine]
Stages
Once the engine has been set up, we can start adding stages to the configuration of our AI.
To add a stage we just use the [stage] tag.
[stage] engine=lua code=<< -- Code for stage execution here -- It is better to call predefined functions for the [engine] code, -- than to define the functions here, to keep the structure of the stages clear >> [/stage]