@ -360,13 +360,18 @@ ul.auto-toc {
< / li >
< / ul >
< / li >
< li > < a class = "reference internal" href = "# modules" id = "id29" > Modules< / a > < / li >
< li > < a class = "reference internal" href = "# plugins" id = "id30" > Plugins< / a > < ul >
< li > < a class = "reference internal" href = "# burrows" id = "id31" > burrow s< / a > < / li >
< li > < a class = "reference internal" href = "# sort" id = "id32" > sort < / a > < / li >
< li > < a class = "reference internal" href = "# lua- modules" id = "id29" > Lua Modules< / a > < ul >
< li > < a class = "reference internal" href = "# global-environment" id = "id30" > Global environment< / a > < / li >
< li > < a class = "reference internal" href = "# utils" id = "id31" > util s< / a > < / li >
< li > < a class = "reference internal" href = "# dumper" id = "id32" > dumper < / a > < / li >
< / ul >
< / 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 >
< / div >
< 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
native C++ commands, and invoked by plugins written in c++.< / p >
< 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 >
< div class = "section" id = "df-data-structure-wrapper" >
< 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 class = "section" id = " modules">
< h1 > < a class = "toc-backref" href = "#id29" > Modules< / a > < / h1 >
< div class = "section" id = " lua- modules">
< 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 >
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
< tt class = "docutils literal" > < span class = "pre" > require('dfhack')< / span > < / tt > , although it is initially created as a
global by C++ bootstrap code.< / p >
< p > The following functions are provided:< / p >
< p > The following module management functions are provided:< / p >
< ul >
< 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 >
@ -1509,16 +1514,183 @@ should be kept limited to the standard Lua library and API described
in this document.< / p >
< / li >
< / 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 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
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
module file is still necessary for < tt class = "docutils literal" > require< / tt > to read.< / p >
< p > The following plugins have lua support.< / p >
< 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 > Events:< / p >
< 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 >
< / div >
< 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
calls lua code to perform the actual ordering of list items.< / p >
< / div >
< / div >
< 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/*
are automatically used by the DFHack core as commands. The
matching command name consists of the name of the file sans
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
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.