@ -360,13 +360,18 @@ ul.auto-toc {
< / li >
< / li >
< / ul >
< / ul >
< / li >
< / li >
< li > < a class = "reference internal" href = "# modules" id = "id29" > Modules< / a > < / li >
< li > < a class = "reference internal" href = "# lua- modules" id = "id29" > Lua Modules< / a > < ul >
< li > < a class = "reference internal" href = "# plugins" id = "id30" > Plugins< / a > < ul >
< li > < a class = "reference internal" href = "# global-environment" id = "id30" > Global environment< / a > < / li >
< li > < a class = "reference internal" href = "# burrows" id = "id31" > burrow s< / a > < / li >
< li > < a class = "reference internal" href = "# utils" id = "id31" > util s< / a > < / li >
< li > < a class = "reference internal" href = "# sort" id = "id32" > sort < / a > < / li >
< li > < a class = "reference internal" href = "# dumper" id = "id32" > dumper < / a > < / li >
< / ul >
< / ul >
< / li >
< / li >
< li > < a class = "reference internal" href = "#scripts" id = "id33" > Scripts< / a > < / li >
< li > < a class = "reference internal" href = "#plugins" id = "id33" > Plugins< / a > < ul >
< li > < a class = "reference internal" href = "#burrows" id = "id34" > burrows< / a > < / li >
< li > < a class = "reference internal" href = "#sort" id = "id35" > sort< / a > < / li >
< / ul >
< / li >
< li > < a class = "reference internal" href = "#scripts" id = "id36" > Scripts< / a > < / li >
< / ul >
< / ul >
< / div >
< / div >
< p > The current version of DFHack has extensive support for
< p > The current version of DFHack has extensive support for
@ -381,7 +386,7 @@ structures, and interaction with dfhack itself.</li>
are treated by DFHack command line prompt almost as
are treated by DFHack command line prompt almost as
native C++ commands, and invoked by plugins written in c++.< / p >
native C++ commands, and invoked by plugins written in c++.< / p >
< p > This document describes native API available to Lua in detail.
< p > This document describes native API available to Lua in detail.
For the most part it does not describ e utility functions
It does not describe all of th e utility functions
implemented by Lua files located in hack/lua/...< / p >
implemented by Lua files located in hack/lua/...< / p >
< div class = "section" id = "df-data-structure-wrapper" >
< div class = "section" id = "df-data-structure-wrapper" >
< h1 > < a class = "toc-backref" href = "#id1" > DF data structure wrapper< / a > < / h1 >
< h1 > < a class = "toc-backref" href = "#id1" > DF data structure wrapper< / a > < / h1 >
@ -1480,14 +1485,14 @@ order using <tt class="docutils literal">dfhack.safecall</tt>.</p>
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "section" id = " modules">
< div class = "section" id = " lua- modules">
< h1 > < a class = "toc-backref" href = "#id29" > Modules< / a > < / h1 >
< h1 > < a class = "toc-backref" href = "#id29" > Lua Modules< / a > < / h1 >
< p > DFHack sets up the lua interpreter so that the built-in < tt class = "docutils literal" > require< / tt >
< p > DFHack sets up the lua interpreter so that the built-in < tt class = "docutils literal" > require< / tt >
function can be used to load shared lua code from hack/lua/.
function can be used to load shared lua code from hack/lua/.
The < tt class = "docutils literal" > dfhack< / tt > namespace reference itself may be obtained via
The < tt class = "docutils literal" > dfhack< / tt > namespace reference itself may be obtained via
< tt class = "docutils literal" > < span class = "pre" > require('dfhack')< / span > < / tt > , although it is initially created as a
< tt class = "docutils literal" > < span class = "pre" > require('dfhack')< / span > < / tt > , although it is initially created as a
global by C++ bootstrap code.< / p >
global by C++ bootstrap code.< / p >
< p > The following functions are provided:< / p >
< p > The following module management functions are provided:< / p >
< ul >
< ul >
< li > < p class = "first" > < tt class = "docutils literal" > mkmodule(name)< / tt > < / p >
< li > < p class = "first" > < tt class = "docutils literal" > mkmodule(name)< / tt > < / p >
< p > Creates an environment table for the module. Intended to be used as:< / p >
< p > Creates an environment table for the module. Intended to be used as:< / p >
@ -1509,16 +1514,183 @@ should be kept limited to the standard Lua library and API described
in this document.< / p >
in this document.< / p >
< / li >
< / li >
< / ul >
< / ul >
< div class = "section" id = "global-environment" >
< h2 > < a class = "toc-backref" href = "#id30" > Global environment< / a > < / h2 >
< p > A number of variables and functions are provided in the base global
environment by the mandatory init file dfhack.lua:< / p >
< ul >
< li > < p class = "first" > Color constants< / p >
< p > These are applicable both for < tt class = "docutils literal" > dfhack.color()< / tt > and color fields
in DF functions or structures:< / p >
< p > COLOR_RESET, COLOR_BLACK, COLOR_BLUE, COLOR_GREEN, COLOR_CYAN,
COLOR_RED, COLOR_MAGENTA, COLOR_BROWN, COLOR_GREY, COLOR_DARKGREY,
COLOR_LIGHTBLUE, COLOR_LIGHTGREEN, COLOR_LIGHTCYAN, COLOR_LIGHTRED,
COLOR_LIGHTMAGENTA, COLOR_YELLOW, COLOR_WHITE< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > dfhack.onStateChange< / tt > event codes< / p >
< p > Available only in the core context, as is the event itself:< / p >
< p > SC_WORLD_LOADED, SC_WORLD_UNLOADED, SC_MAP_LOADED,
SC_MAP_UNLOADED, SC_VIEWSCREEN_CHANGED, SC_CORE_INITIALIZED< / p >
< / li >
< li > < p class = "first" > Functions already described above< / p >
< p > safecall, qerror, mkmodule, reload< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > printall(obj)< / tt > < / p >
< p > If the argument is a lua table or DF object reference, prints all fields.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > copyall(obj)< / tt > < / p >
< p > Returns a shallow copy of the table or reference as a lua table.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > pos2xyz(obj)< / tt > < / p >
< p > The object must have fields x, y and z. Returns them as 3 values.
If obj is < em > nil< / em > , or x is -30000 (the usual marker for undefined
coordinates), returns < em > nil< / em > .< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > xyz2pos(x,y,z)< / tt > < / p >
< p > Returns a table with x, y and z as fields.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > < span class = "pre" > safe_index(obj,index...)< / span > < / tt > < / p >
< p > Walks a sequence of dereferences, which may be represented by numbers or strings.
Returns < em > nil< / em > if any of obj or indices is < em > nil< / em > , or a numeric index is out of array bounds.< / p >
< / li >
< / ul >
< / div >
< div class = "section" id = "utils" >
< h2 > < a class = "toc-backref" href = "#id31" > utils< / a > < / h2 >
< ul >
< li > < p class = "first" > < tt class = "docutils literal" > utils.compare(a,b)< / tt > < / p >
< p > Comparator function; returns < em > -1< / em > if a< b, < em > 1< / em > if a> b, < em > 0< / em > otherwise.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.compare_name(a,b)< / tt > < / p >
< p > Comparator for names; compares empty string last.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.is_container(obj)< / tt > < / p >
< p > Checks if obj is a container ref.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.make_index_sequence(start,end)< / tt > < / p >
< p > Returns a lua sequence of numbers in start..end.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.make_sort_order(data, ordering)< / tt > < / p >
< p > Computes a sorted permutation of objects in data, as a table of integer
indices into the data sequence. Uses < tt class = "docutils literal" > data.n< / tt > as input length
if present.< / p >
< p > The ordering argument is a sequence of ordering specs, represented
as lua tables with following possible fields:< / p >
< dl class = "docutils" >
< dt > ord.key = < em > function(value)< / em > < / dt >
< dd > < p class = "first last" > Computes comparison key from input data value. Not called on nil.
If omitted, the comparison key is the value itself.< / p >
< / dd >
< dt > ord.key_table = < em > function(data)< / em > < / dt >
< dd > < p class = "first last" > Computes a key table from the data table in one go.< / p >
< / dd >
< dt > ord.compare = < em > function(a,b)< / em > < / dt >
< dd > < p class = "first last" > Comparison function. Defaults to < tt class = "docutils literal" > utils.compare< / tt > above.
Called on non-nil keys; nil sorts last.< / p >
< / dd >
< dt > ord.nil_first = < em > true/false< / em > < / dt >
< dd > < p class = "first last" > If true, nil keys are sorted first instead of last.< / p >
< / dd >
< dt > ord.reverse = < em > true/false< / em > < / dt >
< dd > < p class = "first last" > If true, sort non-nil keys in descending order.< / p >
< / dd >
< / dl >
< p > For every comparison during sorting the specs are applied in
order until an unambiguous decision is reached. Sorting is stable.< / p >
< p > Example of sorting a sequence by field foo:< / p >
< pre class = "literal-block" >
local spec = { key = function(v) return v.foo end }
local order = utils.make_sort_order(data, { spec })
local output = {}
for i = 1,#order do output[i] = data[order[i]] end
< / pre >
< p > Separating the actual reordering of the sequence in this
way enables applying the same permutation to multiple arrays.
This function is used by the sort plugin.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.assign(tgt, src)< / tt > < / p >
< p > Does a recursive assignment of src into tgt.
Uses < tt class = "docutils literal" > df.assign< / tt > if tgt is a native object ref; otherwise
recurses into lua tables.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.clone(obj, deep)< / tt > < / p >
< p > Performs a shallow, or semi-deep copy of the object as a lua table tree.
The deep mode recurses into lua tables and subobjects, except pointers
to other heap objects.
Null pointers are represented as df.NULL. Zero-based native containers
are converted to 1-based lua sequences.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.clone_with_default(obj, default, force)< / tt > < / p >
< p > Copies the object, using the < tt class = "docutils literal" > default< / tt > lua table tree
as a guide to which values should be skipped as uninteresting.
The < tt class = "docutils literal" > force< / tt > argument makes it always return a non-< em > nil< / em > value.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.sort_vector(vector,field,cmpfun)< / tt > < / p >
< p > Sorts a native vector or lua sequence using the comparator function.
If < tt class = "docutils literal" > field< / tt > is not < em > nil< / em > , applies the comparator to the field instead
of the whole object.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.binsearch(vector,key,field,cmpfun,min,max)< / tt > < / p >
< p > Does a binary search in a native vector or lua sequence for
< tt class = "docutils literal" > key< / tt > , using < tt class = "docutils literal" > cmpfun< / tt > and < tt class = "docutils literal" > field< / tt > like sort_vector.
If < tt class = "docutils literal" > min< / tt > and < tt class = "docutils literal" > max< / tt > are specified, they are used as the
search subrange bounds.< / p >
< p > If found, returns < em > item, true, idx< / em > . Otherwise returns
< em > nil, false, insert_idx< / em > , where < em > insert_idx< / em > is the correct
insertion point.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.insert_sorted(vector,item,field,cmpfun)< / tt > < / p >
< p > Does a binary search, and inserts item if not found.
Returns < em > did_insert, vector[idx], idx< / em > .< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.insert_or_update(vector,item,field,cmpfun)< / tt > < / p >
< p > Like < tt class = "docutils literal" > insert_sorted< / tt > , but also assigns the item into
the vector cell if insertion didn't happen.< / p >
< p > As an example, you can use this to set skill values:< / p >
< pre class = "literal-block" >
utils.insert_or_update(soul.skills, {new=true, id=..., rating=...}, 'id')
< / pre >
< p > (For an explanation of < tt class = "docutils literal" > new=true< / tt > , see table assignment in the wrapper section)< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.prompt_yes_no(prompt, default)< / tt > < / p >
< p > Presents a yes/no prompt to the user. If < tt class = "docutils literal" > default< / tt > is not < em > nil< / em > ,
allows just pressing Enter to submit the default choice.
If the user enters < tt class = "docutils literal" > 'abort'< / tt > , throws an error.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.prompt_input(prompt, checkfun, quit_str)< / tt > < / p >
< p > Presents a prompt to input data, until a valid string is entered.
Once < tt class = "docutils literal" > checkfun(input)< / tt > returns < em > true, ...< / em > , passes the values
through. If the user enters the quit_str (defaults to < tt class = "docutils literal" > < span class = "pre" > '~~~'< / span > < / tt > ),
throws an error.< / p >
< / li >
< li > < p class = "first" > < tt class = "docutils literal" > utils.check_number(text)< / tt > < / p >
< p > A < tt class = "docutils literal" > prompt_input< / tt > < tt class = "docutils literal" > checkfun< / tt > that verifies a number input.< / p >
< / li >
< / ul >
< / div >
< div class = "section" id = "dumper" >
< h2 > < a class = "toc-backref" href = "#id32" > dumper< / a > < / h2 >
< p > A third-party lua table dumper module from
< a class = "reference external" href = "http://lua-users.org/wiki/DataDumper" > http://lua-users.org/wiki/DataDumper< / a > . Defines one
function:< / p >
< ul >
< li > < p class = "first" > < tt class = "docutils literal" > dumper.DataDumper(value, varname, fastmode, ident, indent_step)< / tt > < / p >
< p > Returns < tt class = "docutils literal" > value< / tt > converted to a string. The < tt class = "docutils literal" > indent_step< / tt >
argument specifies the indentation step size in spaces. For
the other arguments see the original documentation link above.< / p >
< / li >
< / ul >
< / div >
< / div >
< / div >
< div class = "section" id = "plugins" >
< div class = "section" id = "plugins" >
< h1 > < a class = "toc-backref" href = "#id30" > Plugins< / a > < / h1 >
< h1 > < a class = "toc-backref" href = "#id3 3 "> Plugins< / a > < / h1 >
< p > DFHack plugins may export native functions and events
< p > DFHack plugins may export native functions and events
to lua contexts. They are automatically imported by
to lua contexts. They are automatically imported by
< tt class = "docutils literal" > < span class = "pre" > mkmodule('plugins.< name> ')< / span > < / tt > ; this means that a lua
< tt class = "docutils literal" > < span class = "pre" > mkmodule('plugins.< name> ')< / span > < / tt > ; this means that a lua
module file is still necessary for < tt class = "docutils literal" > require< / tt > to read.< / p >
module file is still necessary for < tt class = "docutils literal" > require< / tt > to read.< / p >
< p > The following plugins have lua support.< / p >
< p > The following plugins have lua support.< / p >
< div class = "section" id = "burrows" >
< div class = "section" id = "burrows" >
< h2 > < a class = "toc-backref" href = "#id31" > burrows< / a > < / h2 >
< h2 > < a class = "toc-backref" href = "#id3 4 "> burrows< / a > < / h2 >
< p > Implements extended burrow manipulations.< / p >
< p > Implements extended burrow manipulations.< / p >
< p > Events:< / p >
< p > Events:< / p >
< ul >
< ul >
@ -1556,17 +1728,19 @@ set is the same as used by the command line.</p>
< p > The lua module file also re-exports functions from < tt class = "docutils literal" > dfhack.burrows< / tt > .< / p >
< p > The lua module file also re-exports functions from < tt class = "docutils literal" > dfhack.burrows< / tt > .< / p >
< / div >
< / div >
< div class = "section" id = "sort" >
< div class = "section" id = "sort" >
< h2 > < a class = "toc-backref" href = "#id3 2 "> sort< / a > < / h2 >
< h2 > < a class = "toc-backref" href = "#id3 5 "> sort< / a > < / h2 >
< p > Does not export any native functions as of now. Instead, it
< p > Does not export any native functions as of now. Instead, it
calls lua code to perform the actual ordering of list items.< / p >
calls lua code to perform the actual ordering of list items.< / p >
< / div >
< / div >
< / div >
< / div >
< div class = "section" id = "scripts" >
< div class = "section" id = "scripts" >
< h1 > < a class = "toc-backref" href = "#id3 3 "> Scripts< / a > < / h1 >
< h1 > < a class = "toc-backref" href = "#id3 6 "> Scripts< / a > < / h1 >
< p > Any files with the .lua extension placed into hack/scripts/*
< p > Any files with the .lua extension placed into hack/scripts/*
are automatically used by the DFHack core as commands. The
are automatically used by the DFHack core as commands. The
matching command name consists of the name of the file sans
matching command name consists of the name of the file sans
the extension.< / p >
the extension.< / p >
< p > If the first line of the script is a one-line comment, it is
used by the built-in < tt class = "docutils literal" > ls< / tt > and < tt class = "docutils literal" > help< / tt > commands.< / p >
< p > < strong > NOTE:< / strong > Scripts placed in subdirectories still can be accessed, but
< p > < strong > NOTE:< / strong > Scripts placed in subdirectories still can be accessed, but
do not clutter the < tt class = "docutils literal" > ls< / tt > command list; thus it is preferred
do not clutter the < tt class = "docutils literal" > ls< / tt > command list; thus it is preferred
for obscure developer-oriented scripts and scripts used by tools.
for obscure developer-oriented scripts and scripts used by tools.