@ -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.