|
|
@ -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">burrows</a></li>
|
|
|
|
<li><a class="reference internal" href="#utils" id="id31">utils</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 describe utility functions
|
|
|
|
It does not describe all of the 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,172 @@ 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 an ordering 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 a 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>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="#id33">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="#id34">burrows</a></h2>
|
|
|
|
<p>Implements extended burrow manipulations.</p>
|
|
|
|
<p>Implements extended burrow manipulations.</p>
|
|
|
|
<p>Events:</p>
|
|
|
|
<p>Events:</p>
|
|
|
|
<ul>
|
|
|
|
<ul>
|
|
|
@ -1556,13 +1717,13 @@ 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="#id32">sort</a></h2>
|
|
|
|
<h2><a class="toc-backref" href="#id35">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="#id33">Scripts</a></h1>
|
|
|
|
<h1><a class="toc-backref" href="#id36">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
|
|
|
|