Merge pull request #693 from PeridexisErrant/sphinx-experiments
Use Sphinx for generating documentation.develop
@ -1,655 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
|
||||
<title>Building DFHACK</title>
|
||||
<style type="text/css">
|
||||
|
||||
/*
|
||||
:Author: David Goodger (goodger@python.org)
|
||||
:Id: $Id: html4css1.css 7614 2013-02-21 15:55:51Z milde $
|
||||
:Copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
|
||||
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
||||
customize this style sheet.
|
||||
*/
|
||||
|
||||
/* used to remove borders from tables and images */
|
||||
.borderless, table.borderless td, table.borderless th {
|
||||
border: 0 }
|
||||
|
||||
table.borderless td, table.borderless th {
|
||||
/* Override padding for "table.docutils td" with "! important".
|
||||
The right padding separates the table cells. */
|
||||
padding: 0 0.5em 0 0 ! important }
|
||||
|
||||
.first {
|
||||
/* Override more specific margin styles with "! important". */
|
||||
margin-top: 0 ! important }
|
||||
|
||||
.last, .with-subtitle {
|
||||
margin-bottom: 0 ! important }
|
||||
|
||||
.hidden {
|
||||
display: none }
|
||||
|
||||
a.toc-backref {
|
||||
text-decoration: none ;
|
||||
color: black }
|
||||
|
||||
blockquote.epigraph {
|
||||
margin: 2em 5em ; }
|
||||
|
||||
dl.docutils dd {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||
dl.docutils dt {
|
||||
font-weight: bold }
|
||||
*/
|
||||
|
||||
div.abstract {
|
||||
margin: 2em 5em }
|
||||
|
||||
div.abstract p.topic-title {
|
||||
font-weight: bold ;
|
||||
text-align: center }
|
||||
|
||||
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||
div.hint, div.important, div.note, div.tip, div.warning {
|
||||
margin: 2em ;
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||
div.important p.admonition-title, div.note p.admonition-title,
|
||||
div.tip p.admonition-title {
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||
div.danger p.admonition-title, div.error p.admonition-title,
|
||||
div.warning p.admonition-title, .code .error {
|
||||
color: red ;
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||
compound paragraphs.
|
||||
div.compound .compound-first, div.compound .compound-middle {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
div.compound .compound-last, div.compound .compound-middle {
|
||||
margin-top: 0.5em }
|
||||
*/
|
||||
|
||||
div.dedication {
|
||||
margin: 2em 5em ;
|
||||
text-align: center ;
|
||||
font-style: italic }
|
||||
|
||||
div.dedication p.topic-title {
|
||||
font-weight: bold ;
|
||||
font-style: normal }
|
||||
|
||||
div.figure {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
div.footer, div.header {
|
||||
clear: both;
|
||||
font-size: smaller }
|
||||
|
||||
div.line-block {
|
||||
display: block ;
|
||||
margin-top: 1em ;
|
||||
margin-bottom: 1em }
|
||||
|
||||
div.line-block div.line-block {
|
||||
margin-top: 0 ;
|
||||
margin-bottom: 0 ;
|
||||
margin-left: 1.5em }
|
||||
|
||||
div.sidebar {
|
||||
margin: 0 0 0.5em 1em ;
|
||||
border: medium outset ;
|
||||
padding: 1em ;
|
||||
background-color: #ffffee ;
|
||||
width: 40% ;
|
||||
float: right ;
|
||||
clear: right }
|
||||
|
||||
div.sidebar p.rubric {
|
||||
font-family: sans-serif ;
|
||||
font-size: medium }
|
||||
|
||||
div.system-messages {
|
||||
margin: 5em }
|
||||
|
||||
div.system-messages h1 {
|
||||
color: red }
|
||||
|
||||
div.system-message {
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.system-message p.system-message-title {
|
||||
color: red ;
|
||||
font-weight: bold }
|
||||
|
||||
div.topic {
|
||||
margin: 2em }
|
||||
|
||||
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||
margin-top: 0.4em }
|
||||
|
||||
h1.title {
|
||||
text-align: center }
|
||||
|
||||
h2.subtitle {
|
||||
text-align: center }
|
||||
|
||||
hr.docutils {
|
||||
width: 75% }
|
||||
|
||||
img.align-left, .figure.align-left, object.align-left {
|
||||
clear: left ;
|
||||
float: left ;
|
||||
margin-right: 1em }
|
||||
|
||||
img.align-right, .figure.align-right, object.align-right {
|
||||
clear: right ;
|
||||
float: right ;
|
||||
margin-left: 1em }
|
||||
|
||||
img.align-center, .figure.align-center, object.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
text-align: left }
|
||||
|
||||
.align-center {
|
||||
clear: both ;
|
||||
text-align: center }
|
||||
|
||||
.align-right {
|
||||
text-align: right }
|
||||
|
||||
/* reset inner alignment in figures */
|
||||
div.align-right {
|
||||
text-align: inherit }
|
||||
|
||||
/* div.align-center * { */
|
||||
/* text-align: left } */
|
||||
|
||||
ol.simple, ul.simple {
|
||||
margin-bottom: 1em }
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal }
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha }
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha }
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman }
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman }
|
||||
|
||||
p.attribution {
|
||||
text-align: right ;
|
||||
margin-left: 50% }
|
||||
|
||||
p.caption {
|
||||
font-style: italic }
|
||||
|
||||
p.credits {
|
||||
font-style: italic ;
|
||||
font-size: smaller }
|
||||
|
||||
p.label {
|
||||
white-space: nowrap }
|
||||
|
||||
p.rubric {
|
||||
font-weight: bold ;
|
||||
font-size: larger ;
|
||||
color: maroon ;
|
||||
text-align: center }
|
||||
|
||||
p.sidebar-title {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold ;
|
||||
font-size: larger }
|
||||
|
||||
p.sidebar-subtitle {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
p.topic-title {
|
||||
font-weight: bold }
|
||||
|
||||
pre.address {
|
||||
margin-bottom: 0 ;
|
||||
margin-top: 0 ;
|
||||
font: inherit }
|
||||
|
||||
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
pre.code .ln { color: grey; } /* line numbers */
|
||||
pre.code, code { background-color: #eeeeee }
|
||||
pre.code .comment, code .comment { color: #5C6576 }
|
||||
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||
|
||||
span.classifier {
|
||||
font-family: sans-serif ;
|
||||
font-style: oblique }
|
||||
|
||||
span.classifier-delimiter {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
span.interpreted {
|
||||
font-family: sans-serif }
|
||||
|
||||
span.option {
|
||||
white-space: nowrap }
|
||||
|
||||
span.pre {
|
||||
white-space: pre }
|
||||
|
||||
span.problematic {
|
||||
color: red }
|
||||
|
||||
span.section-subtitle {
|
||||
/* font-size relative to parent (h1..h6 element) */
|
||||
font-size: 80% }
|
||||
|
||||
table.citation {
|
||||
border-left: solid 1px gray;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docinfo {
|
||||
margin: 2em 4em }
|
||||
|
||||
table.docutils {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid 1px black;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docutils td, table.docutils th,
|
||||
table.docinfo td, table.docinfo th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||
font-weight: bold ;
|
||||
text-align: left ;
|
||||
white-space: nowrap ;
|
||||
padding-left: 0 }
|
||||
|
||||
/* "booktabs" style (no vertical lines) */
|
||||
table.docutils.booktabs {
|
||||
border: 0px;
|
||||
border-top: 2px solid;
|
||||
border-bottom: 2px solid;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.docutils.booktabs * {
|
||||
border: 0px;
|
||||
}
|
||||
table.docutils.booktabs th {
|
||||
border-bottom: thin solid;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||
font-size: 100% }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="document" id="building-dfhack">
|
||||
<h1 class="title">Building DFHACK</h1>
|
||||
|
||||
<div class="contents topic" id="contents">
|
||||
<p class="topic-title first">Contents</p>
|
||||
<ul class="simple">
|
||||
<li><a class="reference internal" href="#linux" id="id4">Linux</a><ul>
|
||||
<li><a class="reference internal" href="#how-to-get-the-code" id="id5">How to get the code</a></li>
|
||||
<li><a class="reference internal" href="#dependencies" id="id6">Dependencies</a></li>
|
||||
<li><a class="reference internal" href="#build" id="id7">Build</a></li>
|
||||
<li><a class="reference internal" href="#fixing-the-libstdc-version-bug" id="id8">Fixing the libstdc++ version bug</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#mac-os-x" id="id9">Mac OS X</a><ul>
|
||||
<li><a class="reference internal" href="#snow-leopard-changes" id="id10">Snow Leopard Changes</a></li>
|
||||
<li><a class="reference internal" href="#yosemite-changes" id="id11">Yosemite Changes</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#windows" id="id12">Windows</a><ul>
|
||||
<li><a class="reference internal" href="#id1" id="id13">How to get the code</a></li>
|
||||
<li><a class="reference internal" href="#id2" id="id14">Dependencies</a></li>
|
||||
<li><a class="reference internal" href="#id3" id="id15">Build</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#build-types" id="id16">Build types</a></li>
|
||||
<li><a class="reference internal" href="#using-the-library-as-a-developer" id="id17">Using the library as a developer</a><ul>
|
||||
<li><a class="reference internal" href="#df-data-structure-definitions" id="id18">DF data structure definitions</a></li>
|
||||
<li><a class="reference internal" href="#remote-access-interface" id="id19">Remote access interface</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="linux">
|
||||
<h1><a class="toc-backref" href="#id4">Linux</a></h1>
|
||||
<p>On Linux, DFHack acts as a library that shadows parts of the SDL API using LD_PRELOAD.</p>
|
||||
<div class="section" id="how-to-get-the-code">
|
||||
<h2><a class="toc-backref" href="#id5">How to get the code</a></h2>
|
||||
<p>DFHack doesn't have any kind of system of code snapshots in place, so you will have to get code from the github repository using git.
|
||||
Having a 'git' package installed is the minimal requirement, but some sort of git gui or git integration for your favorite text editor/IDE will certainly help.</p>
|
||||
<p>The code resides here: <a class="reference external" href="https://github.com/DFHack/dfhack">https://github.com/DFHack/dfhack</a></p>
|
||||
<p>If you just want to compile DFHack or work on it by contributing patches, it's quite enough to clone from the read-only address:</p>
|
||||
<pre class="literal-block">
|
||||
git clone git://github.com/DFHack/dfhack.git
|
||||
cd dfhack
|
||||
git submodule init
|
||||
git submodule update
|
||||
</pre>
|
||||
<p>If you want to get really involved with the development, create an account on github, make a clone there and then use that as your remote repository instead. Detailed instructions are beyond the scope of this document. If you need help, join us on IRC (#dfhack channel on freenode).</p>
|
||||
</div>
|
||||
<div class="section" id="dependencies">
|
||||
<h2><a class="toc-backref" href="#id6">Dependencies</a></h2>
|
||||
<p>DFHack is meant to be installed into an existing DF folder, so get one ready.</p>
|
||||
<p>For building, you need a 32-bit version of GCC. For example, to build DFHack on
|
||||
a 64-bit distribution like Arch, you'll need the multilib development tools and libraries.
|
||||
Alternatively, you might be able to use <tt class="docutils literal">lxc</tt> to
|
||||
<a class="reference external" href="http://www.bay12forums.com/smf/index.php?topic=139553.msg5435310#msg5435310">create a virtual 32-bit environment</a>.</p>
|
||||
<p>Before you can build anything, you'll also need <tt class="docutils literal">cmake</tt>. It is advisable to also get
|
||||
<tt class="docutils literal">ccmake</tt> on distributions that split the cmake package into multiple parts.</p>
|
||||
<p>You also need perl and the XML::LibXML and XML::LibXSLT perl packages (for the code generation parts).
|
||||
You should be able to find them in your distro repositories (on Arch linux 'perl-xml-libxml' and 'perl-xml-libxslt') or through <tt class="docutils literal">cpan</tt>.</p>
|
||||
<p>To build Stonesense, you'll also need OpenGL headers.</p>
|
||||
</div>
|
||||
<div class="section" id="build">
|
||||
<h2><a class="toc-backref" href="#id7">Build</a></h2>
|
||||
<p>Building is fairly straightforward. Enter the <tt class="docutils literal">build</tt> folder and start the build like this:</p>
|
||||
<pre class="literal-block">
|
||||
cd build
|
||||
cmake .. -DCMAKE_BUILD_TYPE:string=Release -DCMAKE_INSTALL_PREFIX=/home/user/DF
|
||||
make install
|
||||
</pre>
|
||||
<p>Obviously, replace the install path with path to your DF. This will build the library
|
||||
along with the normal set of plugins and install them into your DF folder.</p>
|
||||
<p>Alternatively, you can use ccmake instead of cmake:</p>
|
||||
<pre class="literal-block">
|
||||
cd build
|
||||
ccmake ..
|
||||
make install
|
||||
</pre>
|
||||
<p>This will show a curses-based interface that lets you set all of the
|
||||
extra options.</p>
|
||||
<p>You can also use a cmake-friendly IDE like KDevelop 4 or the cmake-gui
|
||||
program.</p>
|
||||
</div>
|
||||
<div class="section" id="fixing-the-libstdc-version-bug">
|
||||
<h2><a class="toc-backref" href="#id8">Fixing the libstdc++ version bug</a></h2>
|
||||
<p>When compiling dfhack yourself, it builds against your system libc.
|
||||
When Dwarf Fortress runs, it uses a libstdc++ shipped with the binary, which
|
||||
is usually way older, and incompatible with your dfhack. This manifests with
|
||||
the error message:</p>
|
||||
<pre class="literal-block">
|
||||
./libs/Dwarf_Fortress: /pathToDF/libs/libstdc++.so.6: version
|
||||
`GLIBCXX_3.4.15' not found (required by ./hack/libdfhack.so)
|
||||
</pre>
|
||||
<p>To fix this, simply remove the libstdc++ shipped with DF, it will fall back
|
||||
to your system lib and everything will work fine:</p>
|
||||
<pre class="literal-block">
|
||||
cd /path/to/DF/
|
||||
rm libs/libstdc++.so.6
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="mac-os-x">
|
||||
<h1><a class="toc-backref" href="#id9">Mac OS X</a></h1>
|
||||
<p>If you are building on 10.6, please read the subsection below titled "Snow Leopard Changes" FIRST.</p>
|
||||
<ol class="arabic">
|
||||
<li><p class="first">Download and unpack a copy of the latest DF</p>
|
||||
</li>
|
||||
<li><p class="first">Install Xcode from Mac App Store</p>
|
||||
</li>
|
||||
<li><p class="first">Open Xcode, go to Preferences > Downloads, and install the Command Line Tools.</p>
|
||||
</li>
|
||||
<li><p class="first">Install dependencies</p>
|
||||
<blockquote>
|
||||
<p>Option 1: Using MacPorts:</p>
|
||||
<blockquote>
|
||||
<ul class="simple">
|
||||
<li><a class="reference external" href="http://www.macports.org/">Install MacPorts</a></li>
|
||||
<li>Run <tt class="docutils literal">sudo port install gcc45 +universal cmake +universal <span class="pre">git-core</span> +universal</tt>
|
||||
This will take some time—maybe hours, depending on your machine.</li>
|
||||
</ul>
|
||||
<p>At some point during this process, it may ask you to install a Java environment; let it do so.</p>
|
||||
</blockquote>
|
||||
<p>Option 2: Using Homebrew:</p>
|
||||
<blockquote>
|
||||
<ul class="simple">
|
||||
<li><a class="reference external" href="http://brew.sh/">Install Homebrew</a> and run:</li>
|
||||
<li><tt class="docutils literal">brew tap homebrew/versions</tt></li>
|
||||
<li><tt class="docutils literal">brew install git</tt></li>
|
||||
<li><tt class="docutils literal">brew install cmake</tt></li>
|
||||
<li><tt class="docutils literal">brew install gcc45 <span class="pre">--enable-multilib</span></tt></li>
|
||||
</ul>
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
</li>
|
||||
<li><p class="first">Install perl dependencies</p>
|
||||
<blockquote>
|
||||
<ol class="arabic">
|
||||
<li><p class="first"><tt class="docutils literal">sudo cpan</tt></p>
|
||||
<p>If this is the first time you've run cpan, you will need to go through the setup
|
||||
process. Just stick with the defaults for everything and you'll be fine.</p>
|
||||
</li>
|
||||
<li><p class="first"><tt class="docutils literal">install <span class="pre">XML::LibXML</span></tt></p>
|
||||
</li>
|
||||
<li><p class="first"><tt class="docutils literal">install <span class="pre">XML::LibXSLT</span></tt></p>
|
||||
</li>
|
||||
</ol>
|
||||
</blockquote>
|
||||
</li>
|
||||
<li><p class="first">Get the dfhack source:</p>
|
||||
<pre class="literal-block">
|
||||
git clone git://github.com/DFHack/dfhack.git
|
||||
cd dfhack
|
||||
git submodule init
|
||||
git submodule update
|
||||
</pre>
|
||||
</li>
|
||||
<li><p class="first">Set environment variables:</p>
|
||||
</li>
|
||||
</ol>
|
||||
<blockquote>
|
||||
<p>Macports:</p>
|
||||
<pre class="literal-block">
|
||||
export CC=/opt/local/bin/gcc-mp-4.5
|
||||
export CXX=/opt/local/bin/g++-mp-4.5
|
||||
</pre>
|
||||
<p>Homebrew:</p>
|
||||
<pre class="literal-block">
|
||||
export CC=/usr/local/bin/gcc-4.5
|
||||
export CXX=/usr/local/bin/g++-4.5
|
||||
</pre>
|
||||
</blockquote>
|
||||
<ol class="arabic" start="8">
|
||||
<li><p class="first">Build dfhack:</p>
|
||||
<pre class="literal-block">
|
||||
mkdir build-osx
|
||||
cd build-osx
|
||||
cmake .. -DCMAKE_BUILD_TYPE:string=Release -DCMAKE_INSTALL_PREFIX=/path/to/DF/directory
|
||||
make
|
||||
make install
|
||||
</pre>
|
||||
</li>
|
||||
</ol>
|
||||
<div class="section" id="snow-leopard-changes">
|
||||
<h2><a class="toc-backref" href="#id10">Snow Leopard Changes</a></h2>
|
||||
<ol class="arabic">
|
||||
<li><dl class="first docutils">
|
||||
<dt>Add a step 6.2a (before Install XML::LibXSLT)::</dt>
|
||||
<dd><p class="first last">In a separate Terminal window or tab, run:
|
||||
<tt class="docutils literal">sudo ln <span class="pre">-s</span> /usr/include/libxml2/libxml /usr/include/libxml</tt></p>
|
||||
</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li><dl class="first docutils">
|
||||
<dt>Add a step 7a (before building)::</dt>
|
||||
<dd><dl class="first last docutils">
|
||||
<dt>In <dfhack directory>/library/LuaTypes.cpp, change line 467 to</dt>
|
||||
<dd><p class="first last"><tt class="docutils literal">int len = <span class="pre">strlen((char*)ptr);</span></tt></p>
|
||||
</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
<div class="section" id="yosemite-changes">
|
||||
<h2><a class="toc-backref" href="#id11">Yosemite Changes</a></h2>
|
||||
<p>If you have issues building on OS X Yosemite (or above), try definining the following environment variable:</p>
|
||||
<blockquote>
|
||||
export MACOSX_DEPLOYMENT_TARGET=10.9</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="windows">
|
||||
<h1><a class="toc-backref" href="#id12">Windows</a></h1>
|
||||
<p>On Windows, DFHack replaces the SDL library distributed with DF.</p>
|
||||
<div class="section" id="id1">
|
||||
<h2><a class="toc-backref" href="#id13">How to get the code</a></h2>
|
||||
<p>DFHack doesn't have any kind of system of code snapshots in place, so you will have to get code from the github repository using git.
|
||||
You will need some sort of Windows port of git, or a GUI. Some examples:</p>
|
||||
<blockquote>
|
||||
<ul class="simple">
|
||||
<li><a class="reference external" href="http://msysgit.github.io/">http://msysgit.github.io/</a> - this is a command line version of git for windows. Most tutorials on git usage will apply.</li>
|
||||
<li><a class="reference external" href="http://code.google.com/p/tortoisegit/">http://code.google.com/p/tortoisegit/</a> - this puts a pretty, graphical face on top of msysgit :)</li>
|
||||
</ul>
|
||||
</blockquote>
|
||||
<p>The code resides here: <a class="reference external" href="https://github.com/DFHack/dfhack">https://github.com/DFHack/dfhack</a></p>
|
||||
<p>If you just want to compile DFHack or work on it by contributing patches, it's quite enough to clone from the read-only address:</p>
|
||||
<pre class="literal-block">
|
||||
git clone git://github.com/DFHack/dfhack.git
|
||||
cd dfhack
|
||||
git submodule init
|
||||
git submodule update
|
||||
</pre>
|
||||
<p>The tortoisegit GUI should have the equivalent options included.</p>
|
||||
<p>If you want to get really involved with the development, create an account on github, make a clone there and then use that as your remote repository instead. Detailed instructions are beyond the scope of this document. If you need help, join us on IRC (#dfhack channel on freenode).</p>
|
||||
</div>
|
||||
<div class="section" id="id2">
|
||||
<h2><a class="toc-backref" href="#id14">Dependencies</a></h2>
|
||||
<p>First, you need <tt class="docutils literal">cmake</tt>. Get the win32 installer version from the official
|
||||
site: <a class="reference external" href="http://www.cmake.org/cmake/resources/software.html">http://www.cmake.org/cmake/resources/software.html</a></p>
|
||||
<p>It has the usual installer wizard. Make sure you let it add its binary folder
|
||||
to your binary search PATH so the tool can be later run from anywhere.</p>
|
||||
<p>You'll need a copy of Microsoft Visual C++ 2010. The Express version is sufficient.
|
||||
Grab it from Microsoft's site.</p>
|
||||
<p>You'll also need the Visual Studio 2010 SP1 update.</p>
|
||||
<p>For the code generation parts, you'll need perl with XML::LibXML and XML::LibXSLT. Strawberry Perl works nicely for this: http://strawberryperl.com/</p>
|
||||
<p>If you already have a different version of perl (for example the one from cygwin), you can run into some trouble. Either remove the other perl install from PATH, or install libxml and libxslt for it instead. Strawberry perl works though and has all the required packages.</p>
|
||||
</div>
|
||||
<div class="section" id="id3">
|
||||
<h2><a class="toc-backref" href="#id15">Build</a></h2>
|
||||
<p>There are several different batch files in the <tt class="docutils literal">build</tt> folder along with a script that's used for picking the DF path.</p>
|
||||
<p>First, run set_df_path.vbs and point the dialog that pops up at your DF folder that you want to use for development.
|
||||
Next, run one of the scripts with <tt class="docutils literal">generate</tt> prefix. These create the MSVC solution file(s):</p>
|
||||
<ul class="simple">
|
||||
<li><tt class="docutils literal">all</tt> will create a solution with everything enabled (and the kitchen sink).</li>
|
||||
<li><tt class="docutils literal">gui</tt> will pop up the cmake gui and let you pick and choose what to build. This is probably what you want most of the time. Set the options you are interested in, then hit configure, then generate. More options can appear after the configure step.</li>
|
||||
<li><tt class="docutils literal">minimal</tt> will create a minimal solution with just the bare necessities - the main library and standard plugins.</li>
|
||||
</ul>
|
||||
<p>Then you can either open the solution with MSVC or use one of the msbuild scripts:</p>
|
||||
<ul class="simple">
|
||||
<li>Scripts with <tt class="docutils literal">build</tt> prefix will only build.</li>
|
||||
<li>Scripts with <tt class="docutils literal">install</tt> prefix will build DFHack and install it to the previously selected DF path.</li>
|
||||
<li>Scripts with <tt class="docutils literal">package</tt> prefix will build and create a .zip package of DFHack.</li>
|
||||
</ul>
|
||||
<p>When you open the solution in MSVC, make sure you never use the Debug builds. Those aren't
|
||||
binary-compatible with DF. If you try to use a debug build with DF, you'll only get crashes.
|
||||
So pick either Release or RelWithDebInfo build and build the INSTALL target.</p>
|
||||
<p>The <tt class="docutils literal">debug</tt> scripts actually do RelWithDebInfo builds.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="build-types">
|
||||
<h1><a class="toc-backref" href="#id16">Build types</a></h1>
|
||||
<p><tt class="docutils literal">cmake</tt> allows you to pick a build type by changing this
|
||||
variable: <tt class="docutils literal">CMAKE_BUILD_TYPE</tt></p>
|
||||
<pre class="literal-block">
|
||||
cmake .. -DCMAKE_BUILD_TYPE:string=BUILD_TYPE
|
||||
</pre>
|
||||
<p>Without specifying a build type or 'None', cmake uses the
|
||||
<tt class="docutils literal">CMAKE_CXX_FLAGS</tt> variable for building.</p>
|
||||
<p>Valid and useful build types include 'Release', 'Debug' and
|
||||
'RelWithDebInfo'. 'Debug' is not available on Windows.</p>
|
||||
</div>
|
||||
<div class="section" id="using-the-library-as-a-developer">
|
||||
<h1><a class="toc-backref" href="#id17">Using the library as a developer</a></h1>
|
||||
<p>Currently, the most direct way to use the library is to write a plugin that can be loaded by it.
|
||||
All the plugins can be found in the 'plugins' folder. There's no in-depth documentation
|
||||
on how to write one yet, but it should be easy enough to copy one and just follow the pattern.</p>
|
||||
<p>Other than through plugins, it is possible to use DFHack via remote access interface, or by writing Lua scripts.</p>
|
||||
<p>The most important parts of DFHack are the Core, Console, Modules and Plugins.</p>
|
||||
<ul class="simple">
|
||||
<li>Core acts as the centerpiece of DFHack - it acts as a filter between DF and SDL and synchronizes the various plugins with DF.</li>
|
||||
<li>Console is a thread-safe console that can be used to invoke commands exported by Plugins.</li>
|
||||
<li>Modules actually describe the way to access information in DF's memory. You can get them from the Core. Most modules are split into two parts: high-level and low-level. Higl-level is mostly method calls, low-level publicly visible pointers to DF's data structures.</li>
|
||||
<li>Plugins are the tools that use all the other stuff to make things happen. A plugin can have a list of commands that it exports and an onupdate function that will be called each DF game tick.</li>
|
||||
</ul>
|
||||
<p>Rudimentary API documentation can be built using doxygen (see build options with <tt class="docutils literal">ccmake</tt> or <tt class="docutils literal"><span class="pre">cmake-gui</span></tt>).</p>
|
||||
<p>DFHack consists of variously licensed code, but invariably weak copyleft.
|
||||
The main license is zlib/libpng, some bits are MIT licensed, and some are BSD licensed.</p>
|
||||
<p>Feel free to add your own extensions and plugins. Contributing back to
|
||||
the dfhack repository is welcome and the right thing to do :)</p>
|
||||
<div class="section" id="df-data-structure-definitions">
|
||||
<h2><a class="toc-backref" href="#id18">DF data structure definitions</a></h2>
|
||||
<p>DFHack uses information about the game data structures, represented via xml files in the library/xml/ submodule.</p>
|
||||
<p>Data structure layouts are described in files following the df.*.xml name pattern. This information is transformed by a perl script into C++ headers describing the structures, and associated metadata for the Lua wrapper. These headers and data are then compiled into the DFHack libraries, thus necessitating a compatibility break every time layouts change; in return it significantly boosts the efficiency and capabilities of DFHack code.</p>
|
||||
<p>Global object addresses are stored in symbols.xml, which is copied to the dfhack release package and loaded as data at runtime.</p>
|
||||
</div>
|
||||
<div class="section" id="remote-access-interface">
|
||||
<h2><a class="toc-backref" href="#id19">Remote access interface</a></h2>
|
||||
<p>DFHack supports remote access by exchanging Google protobuf messages via a TCP socket. Both the core and plugins can define remotely accessible methods. The <tt class="docutils literal"><span class="pre">dfhack-run</span></tt> command uses this interface to invoke ordinary console commands.</p>
|
||||
<p>Currently the supported set of requests is limited, because the developers don't know what exactly is most useful.</p>
|
||||
<p>Protocol client implementations exist for Java and C#.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,410 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
|
||||
<title>Contributing to DFHACK</title>
|
||||
<style type="text/css">
|
||||
|
||||
/*
|
||||
:Author: David Goodger (goodger@python.org)
|
||||
:Id: $Id: html4css1.css 7614 2013-02-21 15:55:51Z milde $
|
||||
:Copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
|
||||
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
||||
customize this style sheet.
|
||||
*/
|
||||
|
||||
/* used to remove borders from tables and images */
|
||||
.borderless, table.borderless td, table.borderless th {
|
||||
border: 0 }
|
||||
|
||||
table.borderless td, table.borderless th {
|
||||
/* Override padding for "table.docutils td" with "! important".
|
||||
The right padding separates the table cells. */
|
||||
padding: 0 0.5em 0 0 ! important }
|
||||
|
||||
.first {
|
||||
/* Override more specific margin styles with "! important". */
|
||||
margin-top: 0 ! important }
|
||||
|
||||
.last, .with-subtitle {
|
||||
margin-bottom: 0 ! important }
|
||||
|
||||
.hidden {
|
||||
display: none }
|
||||
|
||||
a.toc-backref {
|
||||
text-decoration: none ;
|
||||
color: black }
|
||||
|
||||
blockquote.epigraph {
|
||||
margin: 2em 5em ; }
|
||||
|
||||
dl.docutils dd {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||
dl.docutils dt {
|
||||
font-weight: bold }
|
||||
*/
|
||||
|
||||
div.abstract {
|
||||
margin: 2em 5em }
|
||||
|
||||
div.abstract p.topic-title {
|
||||
font-weight: bold ;
|
||||
text-align: center }
|
||||
|
||||
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||
div.hint, div.important, div.note, div.tip, div.warning {
|
||||
margin: 2em ;
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||
div.important p.admonition-title, div.note p.admonition-title,
|
||||
div.tip p.admonition-title {
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||
div.danger p.admonition-title, div.error p.admonition-title,
|
||||
div.warning p.admonition-title, .code .error {
|
||||
color: red ;
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||
compound paragraphs.
|
||||
div.compound .compound-first, div.compound .compound-middle {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
div.compound .compound-last, div.compound .compound-middle {
|
||||
margin-top: 0.5em }
|
||||
*/
|
||||
|
||||
div.dedication {
|
||||
margin: 2em 5em ;
|
||||
text-align: center ;
|
||||
font-style: italic }
|
||||
|
||||
div.dedication p.topic-title {
|
||||
font-weight: bold ;
|
||||
font-style: normal }
|
||||
|
||||
div.figure {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
div.footer, div.header {
|
||||
clear: both;
|
||||
font-size: smaller }
|
||||
|
||||
div.line-block {
|
||||
display: block ;
|
||||
margin-top: 1em ;
|
||||
margin-bottom: 1em }
|
||||
|
||||
div.line-block div.line-block {
|
||||
margin-top: 0 ;
|
||||
margin-bottom: 0 ;
|
||||
margin-left: 1.5em }
|
||||
|
||||
div.sidebar {
|
||||
margin: 0 0 0.5em 1em ;
|
||||
border: medium outset ;
|
||||
padding: 1em ;
|
||||
background-color: #ffffee ;
|
||||
width: 40% ;
|
||||
float: right ;
|
||||
clear: right }
|
||||
|
||||
div.sidebar p.rubric {
|
||||
font-family: sans-serif ;
|
||||
font-size: medium }
|
||||
|
||||
div.system-messages {
|
||||
margin: 5em }
|
||||
|
||||
div.system-messages h1 {
|
||||
color: red }
|
||||
|
||||
div.system-message {
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.system-message p.system-message-title {
|
||||
color: red ;
|
||||
font-weight: bold }
|
||||
|
||||
div.topic {
|
||||
margin: 2em }
|
||||
|
||||
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||
margin-top: 0.4em }
|
||||
|
||||
h1.title {
|
||||
text-align: center }
|
||||
|
||||
h2.subtitle {
|
||||
text-align: center }
|
||||
|
||||
hr.docutils {
|
||||
width: 75% }
|
||||
|
||||
img.align-left, .figure.align-left, object.align-left {
|
||||
clear: left ;
|
||||
float: left ;
|
||||
margin-right: 1em }
|
||||
|
||||
img.align-right, .figure.align-right, object.align-right {
|
||||
clear: right ;
|
||||
float: right ;
|
||||
margin-left: 1em }
|
||||
|
||||
img.align-center, .figure.align-center, object.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
text-align: left }
|
||||
|
||||
.align-center {
|
||||
clear: both ;
|
||||
text-align: center }
|
||||
|
||||
.align-right {
|
||||
text-align: right }
|
||||
|
||||
/* reset inner alignment in figures */
|
||||
div.align-right {
|
||||
text-align: inherit }
|
||||
|
||||
/* div.align-center * { */
|
||||
/* text-align: left } */
|
||||
|
||||
ol.simple, ul.simple {
|
||||
margin-bottom: 1em }
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal }
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha }
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha }
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman }
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman }
|
||||
|
||||
p.attribution {
|
||||
text-align: right ;
|
||||
margin-left: 50% }
|
||||
|
||||
p.caption {
|
||||
font-style: italic }
|
||||
|
||||
p.credits {
|
||||
font-style: italic ;
|
||||
font-size: smaller }
|
||||
|
||||
p.label {
|
||||
white-space: nowrap }
|
||||
|
||||
p.rubric {
|
||||
font-weight: bold ;
|
||||
font-size: larger ;
|
||||
color: maroon ;
|
||||
text-align: center }
|
||||
|
||||
p.sidebar-title {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold ;
|
||||
font-size: larger }
|
||||
|
||||
p.sidebar-subtitle {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
p.topic-title {
|
||||
font-weight: bold }
|
||||
|
||||
pre.address {
|
||||
margin-bottom: 0 ;
|
||||
margin-top: 0 ;
|
||||
font: inherit }
|
||||
|
||||
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
pre.code .ln { color: grey; } /* line numbers */
|
||||
pre.code, code { background-color: #eeeeee }
|
||||
pre.code .comment, code .comment { color: #5C6576 }
|
||||
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||
|
||||
span.classifier {
|
||||
font-family: sans-serif ;
|
||||
font-style: oblique }
|
||||
|
||||
span.classifier-delimiter {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
span.interpreted {
|
||||
font-family: sans-serif }
|
||||
|
||||
span.option {
|
||||
white-space: nowrap }
|
||||
|
||||
span.pre {
|
||||
white-space: pre }
|
||||
|
||||
span.problematic {
|
||||
color: red }
|
||||
|
||||
span.section-subtitle {
|
||||
/* font-size relative to parent (h1..h6 element) */
|
||||
font-size: 80% }
|
||||
|
||||
table.citation {
|
||||
border-left: solid 1px gray;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docinfo {
|
||||
margin: 2em 4em }
|
||||
|
||||
table.docutils {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid 1px black;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docutils td, table.docutils th,
|
||||
table.docinfo td, table.docinfo th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||
font-weight: bold ;
|
||||
text-align: left ;
|
||||
white-space: nowrap ;
|
||||
padding-left: 0 }
|
||||
|
||||
/* "booktabs" style (no vertical lines) */
|
||||
table.docutils.booktabs {
|
||||
border: 0px;
|
||||
border-top: 2px solid;
|
||||
border-bottom: 2px solid;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.docutils.booktabs * {
|
||||
border: 0px;
|
||||
}
|
||||
table.docutils.booktabs th {
|
||||
border-bottom: thin solid;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||
font-size: 100% }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="document" id="contributing-to-dfhack">
|
||||
<h1 class="title">Contributing to DFHACK</h1>
|
||||
|
||||
<div class="contents topic" id="contents">
|
||||
<p class="topic-title first">Contents</p>
|
||||
<ul class="simple">
|
||||
<li><a class="reference internal" href="#id1" id="id2">Contributing to DFHack</a><ul>
|
||||
<li><a class="reference internal" href="#code-format" id="id3">Code Format</a></li>
|
||||
<li><a class="reference internal" href="#how-to-get-new-code-into-dfhack" id="id4">How to get new code into DFHack</a></li>
|
||||
<li><a class="reference internal" href="#memory-research" id="id5">Memory research</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="id1">
|
||||
<h1><a class="toc-backref" href="#id2">Contributing to DFHack</a></h1>
|
||||
<p>Several things should be kept in mind when contributing to DFHack.</p>
|
||||
<div class="section" id="code-format">
|
||||
<h2><a class="toc-backref" href="#id3">Code Format</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Four space indents for C++. Never use tabs for indentation in any language.</li>
|
||||
<li>LF (Unix style) line terminators</li>
|
||||
<li>Avoid trailing whitespace</li>
|
||||
<li>UTF-8 encoding</li>
|
||||
<li>For C++:<ul>
|
||||
<li>Opening and closing braces on their own lines or opening brace at the end of the previous line</li>
|
||||
<li>Braces placed at original indent level if on their own lines</li>
|
||||
<li>#includes should be sorted. C++ libraries first, then dfhack modules, then df structures, then local includes. Within each category they should be sorted alphabetically. This policy is currently broken by most C++ files but try to follow it if you can.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="how-to-get-new-code-into-dfhack">
|
||||
<h2><a class="toc-backref" href="#id4">How to get new code into DFHack</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Submit pull requests to the develop branch, not the master branch. The master branch always points at the most recent release.</li>
|
||||
<li>Use new branches for each feature/fix so that your changes can be merged independently.</li>
|
||||
<li>If possible, compile on multiple platforms</li>
|
||||
<li>Do update NEWS/Contributors.rst</li>
|
||||
<li>Do <strong>NOT</strong> run fix-texts.sh or update .html files (except to locally test changes to .rst files)</li>
|
||||
<li>Create a Github Pull Request once finished</li>
|
||||
<li>Work done against <a class="reference external" href="http://github.com/DFHack/dfhack/issues">issues</a> that are tagged "bug report" gets priority<ul>
|
||||
<li>Submit ideas and bug reports as issues on github. Posts in the forum thread are also acceptable but can get missed or forgotten more easily.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="memory-research">
|
||||
<h2><a class="toc-backref" href="#id5">Memory research</a></h2>
|
||||
<p>If you want to do memory research, you'll need some tools and some knowledge.
|
||||
In general, you'll need a good memory viewer and optionally something
|
||||
to look at machine code without getting crazy :)</p>
|
||||
<p>Good windows tools include:</p>
|
||||
<ul class="simple">
|
||||
<li>Cheat Engine</li>
|
||||
<li>IDA Pro 5.0 (freely available for non-commercial use)</li>
|
||||
</ul>
|
||||
<p>Good linux tools:</p>
|
||||
<ul class="simple">
|
||||
<li>angavrilov's df-structures gui (visit us on IRC for details).</li>
|
||||
<li>edb (Evan's Debugger)</li>
|
||||
<li>IDA Pro 5.0 running under Wine</li>
|
||||
<li>Some of the tools residing in the <tt class="docutils literal">legacy</tt> dfhack branch.</li>
|
||||
</ul>
|
||||
<p>Using publicly known information and analyzing the game's data is preferred.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,59 +0,0 @@
|
||||
######################
|
||||
Contributing to DFHACK
|
||||
######################
|
||||
|
||||
.. contents::
|
||||
|
||||
Contributing to DFHack
|
||||
======================
|
||||
|
||||
Several things should be kept in mind when contributing to DFHack.
|
||||
|
||||
-----------
|
||||
Code Format
|
||||
-----------
|
||||
|
||||
* Four space indents for C++. Never use tabs for indentation in any language.
|
||||
* LF (Unix style) line terminators
|
||||
* Avoid trailing whitespace
|
||||
* UTF-8 encoding
|
||||
* For C++:
|
||||
|
||||
* Opening and closing braces on their own lines or opening brace at the end of the previous line
|
||||
* Braces placed at original indent level if on their own lines
|
||||
* #includes should be sorted. C++ libraries first, then dfhack modules, then df structures, then local includes. Within each category they should be sorted alphabetically. This policy is currently broken by most C++ files but try to follow it if you can.
|
||||
|
||||
-------------------------------
|
||||
How to get new code into DFHack
|
||||
-------------------------------
|
||||
|
||||
* Submit pull requests to the ``develop`` branch, not the master branch. The master branch always points at the most recent release.
|
||||
* Use new branches for each feature/fix so that your changes can be merged independently (i.e. not the master or develop branch of your fork).
|
||||
* If possible, compile on multiple platforms
|
||||
* Update NEWS and Contributors.rst when applicable
|
||||
* Do **NOT** run fixTexts.sh or update .html files (except to locally test changes to .rst files)
|
||||
* Create a Github Pull Request once finished
|
||||
* Work done against `issues <http://github.com/DFHack/dfhack/issues>`_ that are tagged "bug report" gets priority
|
||||
|
||||
* Submit ideas and bug reports as issues on Github. Posts in the forum thread are also acceptable but can get missed or forgotten more easily.
|
||||
|
||||
---------------
|
||||
Memory research
|
||||
---------------
|
||||
If you want to do memory research, you'll need some tools and some knowledge.
|
||||
In general, you'll need a good memory viewer and optionally something
|
||||
to look at machine code without getting crazy :)
|
||||
|
||||
Good windows tools include:
|
||||
|
||||
* Cheat Engine
|
||||
* IDA Pro 5.0 (freely available for non-commercial use)
|
||||
|
||||
Good linux tools:
|
||||
|
||||
* angavrilov's df-structures gui (visit us on IRC for details).
|
||||
* edb (Evan's Debugger)
|
||||
* IDA Pro 5.0 running under Wine
|
||||
* Some of the tools residing in the ``legacy`` dfhack branch.
|
||||
|
||||
Using publicly known information and analyzing the game's data is preferred.
|
@ -1,703 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
|
||||
<title>Contributors</title>
|
||||
<style type="text/css">
|
||||
|
||||
/*
|
||||
:Author: David Goodger (goodger@python.org)
|
||||
:Id: $Id: html4css1.css 7614 2013-02-21 15:55:51Z milde $
|
||||
:Copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
|
||||
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
||||
customize this style sheet.
|
||||
*/
|
||||
|
||||
/* used to remove borders from tables and images */
|
||||
.borderless, table.borderless td, table.borderless th {
|
||||
border: 0 }
|
||||
|
||||
table.borderless td, table.borderless th {
|
||||
/* Override padding for "table.docutils td" with "! important".
|
||||
The right padding separates the table cells. */
|
||||
padding: 0 0.5em 0 0 ! important }
|
||||
|
||||
.first {
|
||||
/* Override more specific margin styles with "! important". */
|
||||
margin-top: 0 ! important }
|
||||
|
||||
.last, .with-subtitle {
|
||||
margin-bottom: 0 ! important }
|
||||
|
||||
.hidden {
|
||||
display: none }
|
||||
|
||||
a.toc-backref {
|
||||
text-decoration: none ;
|
||||
color: black }
|
||||
|
||||
blockquote.epigraph {
|
||||
margin: 2em 5em ; }
|
||||
|
||||
dl.docutils dd {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||
dl.docutils dt {
|
||||
font-weight: bold }
|
||||
*/
|
||||
|
||||
div.abstract {
|
||||
margin: 2em 5em }
|
||||
|
||||
div.abstract p.topic-title {
|
||||
font-weight: bold ;
|
||||
text-align: center }
|
||||
|
||||
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||
div.hint, div.important, div.note, div.tip, div.warning {
|
||||
margin: 2em ;
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||
div.important p.admonition-title, div.note p.admonition-title,
|
||||
div.tip p.admonition-title {
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||
div.danger p.admonition-title, div.error p.admonition-title,
|
||||
div.warning p.admonition-title, .code .error {
|
||||
color: red ;
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||
compound paragraphs.
|
||||
div.compound .compound-first, div.compound .compound-middle {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
div.compound .compound-last, div.compound .compound-middle {
|
||||
margin-top: 0.5em }
|
||||
*/
|
||||
|
||||
div.dedication {
|
||||
margin: 2em 5em ;
|
||||
text-align: center ;
|
||||
font-style: italic }
|
||||
|
||||
div.dedication p.topic-title {
|
||||
font-weight: bold ;
|
||||
font-style: normal }
|
||||
|
||||
div.figure {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
div.footer, div.header {
|
||||
clear: both;
|
||||
font-size: smaller }
|
||||
|
||||
div.line-block {
|
||||
display: block ;
|
||||
margin-top: 1em ;
|
||||
margin-bottom: 1em }
|
||||
|
||||
div.line-block div.line-block {
|
||||
margin-top: 0 ;
|
||||
margin-bottom: 0 ;
|
||||
margin-left: 1.5em }
|
||||
|
||||
div.sidebar {
|
||||
margin: 0 0 0.5em 1em ;
|
||||
border: medium outset ;
|
||||
padding: 1em ;
|
||||
background-color: #ffffee ;
|
||||
width: 40% ;
|
||||
float: right ;
|
||||
clear: right }
|
||||
|
||||
div.sidebar p.rubric {
|
||||
font-family: sans-serif ;
|
||||
font-size: medium }
|
||||
|
||||
div.system-messages {
|
||||
margin: 5em }
|
||||
|
||||
div.system-messages h1 {
|
||||
color: red }
|
||||
|
||||
div.system-message {
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.system-message p.system-message-title {
|
||||
color: red ;
|
||||
font-weight: bold }
|
||||
|
||||
div.topic {
|
||||
margin: 2em }
|
||||
|
||||
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||
margin-top: 0.4em }
|
||||
|
||||
h1.title {
|
||||
text-align: center }
|
||||
|
||||
h2.subtitle {
|
||||
text-align: center }
|
||||
|
||||
hr.docutils {
|
||||
width: 75% }
|
||||
|
||||
img.align-left, .figure.align-left, object.align-left {
|
||||
clear: left ;
|
||||
float: left ;
|
||||
margin-right: 1em }
|
||||
|
||||
img.align-right, .figure.align-right, object.align-right {
|
||||
clear: right ;
|
||||
float: right ;
|
||||
margin-left: 1em }
|
||||
|
||||
img.align-center, .figure.align-center, object.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
text-align: left }
|
||||
|
||||
.align-center {
|
||||
clear: both ;
|
||||
text-align: center }
|
||||
|
||||
.align-right {
|
||||
text-align: right }
|
||||
|
||||
/* reset inner alignment in figures */
|
||||
div.align-right {
|
||||
text-align: inherit }
|
||||
|
||||
/* div.align-center * { */
|
||||
/* text-align: left } */
|
||||
|
||||
ol.simple, ul.simple {
|
||||
margin-bottom: 1em }
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal }
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha }
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha }
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman }
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman }
|
||||
|
||||
p.attribution {
|
||||
text-align: right ;
|
||||
margin-left: 50% }
|
||||
|
||||
p.caption {
|
||||
font-style: italic }
|
||||
|
||||
p.credits {
|
||||
font-style: italic ;
|
||||
font-size: smaller }
|
||||
|
||||
p.label {
|
||||
white-space: nowrap }
|
||||
|
||||
p.rubric {
|
||||
font-weight: bold ;
|
||||
font-size: larger ;
|
||||
color: maroon ;
|
||||
text-align: center }
|
||||
|
||||
p.sidebar-title {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold ;
|
||||
font-size: larger }
|
||||
|
||||
p.sidebar-subtitle {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
p.topic-title {
|
||||
font-weight: bold }
|
||||
|
||||
pre.address {
|
||||
margin-bottom: 0 ;
|
||||
margin-top: 0 ;
|
||||
font: inherit }
|
||||
|
||||
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
pre.code .ln { color: grey; } /* line numbers */
|
||||
pre.code, code { background-color: #eeeeee }
|
||||
pre.code .comment, code .comment { color: #5C6576 }
|
||||
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||
|
||||
span.classifier {
|
||||
font-family: sans-serif ;
|
||||
font-style: oblique }
|
||||
|
||||
span.classifier-delimiter {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
span.interpreted {
|
||||
font-family: sans-serif }
|
||||
|
||||
span.option {
|
||||
white-space: nowrap }
|
||||
|
||||
span.pre {
|
||||
white-space: pre }
|
||||
|
||||
span.problematic {
|
||||
color: red }
|
||||
|
||||
span.section-subtitle {
|
||||
/* font-size relative to parent (h1..h6 element) */
|
||||
font-size: 80% }
|
||||
|
||||
table.citation {
|
||||
border-left: solid 1px gray;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docinfo {
|
||||
margin: 2em 4em }
|
||||
|
||||
table.docutils {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid 1px black;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docutils td, table.docutils th,
|
||||
table.docinfo td, table.docinfo th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||
font-weight: bold ;
|
||||
text-align: left ;
|
||||
white-space: nowrap ;
|
||||
padding-left: 0 }
|
||||
|
||||
/* "booktabs" style (no vertical lines) */
|
||||
table.docutils.booktabs {
|
||||
border: 0px;
|
||||
border-top: 2px solid;
|
||||
border-bottom: 2px solid;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.docutils.booktabs * {
|
||||
border: 0px;
|
||||
}
|
||||
table.docutils.booktabs th {
|
||||
border-bottom: thin solid;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||
font-size: 100% }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="document" id="contributors">
|
||||
<h1 class="title">Contributors</h1>
|
||||
|
||||
<p>If you belong here and are missing, please add yourself and send me (peterix) a pull request :-)</p>
|
||||
<p>The following is a list of people who have contributed to <strong>DFHack</strong>.</p>
|
||||
<table border="1" class="docutils">
|
||||
<colgroup>
|
||||
<col width="31%" />
|
||||
<col width="27%" />
|
||||
<col width="43%" />
|
||||
</colgroup>
|
||||
<thead valign="bottom">
|
||||
<tr><th class="head">Name</th>
|
||||
<th class="head">Github</th>
|
||||
<th class="head">Email</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<tr><td>Petr Mrázek</td>
|
||||
<td>peterix</td>
|
||||
<td><a class="reference external" href="mailto:peterix@gmail.com">peterix@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Alexander Gavrilov</td>
|
||||
<td>angavrilov</td>
|
||||
<td><a class="reference external" href="mailto:angavrilov@gmail.com">angavrilov@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>doomchild</td>
|
||||
<td>doomchild</td>
|
||||
<td><a class="reference external" href="mailto:lee.crabtree@gmail.com">lee.crabtree@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Quietust</td>
|
||||
<td>quietust</td>
|
||||
<td><a class="reference external" href="mailto:quietust@gmail.com">quietust@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>jj</td>
|
||||
<td>jjyg</td>
|
||||
<td><a class="reference external" href="mailto:john-git@ofjj.net">john-git@ofjj.net</a></td>
|
||||
</tr>
|
||||
<tr><td>Warmist</td>
|
||||
<td>warmist</td>
|
||||
<td><a class="reference external" href="mailto:warmist@gmail.com">warmist@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Robert Heinrich</td>
|
||||
<td>rh73</td>
|
||||
<td><a class="reference external" href="mailto:robertheinrich73@googlemail.com">robertheinrich73@googlemail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>simon</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:simon@banquise.net">simon@banquise.net</a></td>
|
||||
</tr>
|
||||
<tr><td>Kelly Martin</td>
|
||||
<td>ab9rf</td>
|
||||
<td><a class="reference external" href="mailto:kelly.lynn.martin@gmail.com">kelly.lynn.martin@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>mizipzor</td>
|
||||
<td>mizipzor</td>
|
||||
<td><a class="reference external" href="mailto:mizipzor@gmail.com">mizipzor@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Simon Jackson</td>
|
||||
<td>sizeak</td>
|
||||
<td><a class="reference external" href="mailto:sizeak@hotmail.com">sizeak@hotmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>belal</td>
|
||||
<td>jimhester</td>
|
||||
<td><a class="reference external" href="mailto:jimbelal@gmail.com">jimbelal@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>RusAnon</td>
|
||||
<td>RusAnon</td>
|
||||
<td><a class="reference external" href="mailto:rusanon@dollchan.ru">rusanon@dollchan.ru</a></td>
|
||||
</tr>
|
||||
<tr><td>Raoul XQ</td>
|
||||
<td>raoulxq</td>
|
||||
<td><a class="reference external" href="mailto:raoulxq@gmail.com">raoulxq@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Matthew Cline</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:zelgadis@sourceforge.net">zelgadis@sourceforge.net</a></td>
|
||||
</tr>
|
||||
<tr><td>Mike Stewart</td>
|
||||
<td>thewonderidiot</td>
|
||||
<td><a class="reference external" href="mailto:thewonderidiot@gmail.com">thewonderidiot@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Timothy Collett</td>
|
||||
<td>danaris</td>
|
||||
<td><a class="reference external" href="mailto:tcollett+github@topazgryphon.org">tcollett+github@topazgryphon.org</a></td>
|
||||
</tr>
|
||||
<tr><td>RossM</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:Ross@Gnome">Ross@Gnome</a></td>
|
||||
</tr>
|
||||
<tr><td>Tom Prince</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:tom.prince@ualberta.net">tom.prince@ualberta.net</a></td>
|
||||
</tr>
|
||||
<tr><td>Jared Adams</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:jaxad0127@gmail.com">jaxad0127@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>expwnent</td>
|
||||
<td>expwnent</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>Erik Youngren</td>
|
||||
<td>Artanis</td>
|
||||
<td><a class="reference external" href="mailto:artanis.00@gmail.com">artanis.00@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Espen Wiborg</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:espen.wiborg@telio.no">espen.wiborg@telio.no</a></td>
|
||||
</tr>
|
||||
<tr><td>Tim Walberg</td>
|
||||
<td>twalberg</td>
|
||||
<td><a class="reference external" href="mailto:twalberg@comcast.net">twalberg@comcast.net</a></td>
|
||||
</tr>
|
||||
<tr><td>Mikko Juola</td>
|
||||
<td>Noeda</td>
|
||||
<td><a class="reference external" href="mailto:mikko.juola@kolumbus.fi">mikko.juola@kolumbus.fi</a></td>
|
||||
</tr>
|
||||
<tr><td>rampaging-poet</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:yrudoingthis@hotmail.com">yrudoingthis@hotmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>U-glouglou\simon</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:simon@glouglou">simon@glouglou</a></td>
|
||||
</tr>
|
||||
<tr><td>Clayton Hughes</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:clayton.hughes@gmail.com">clayton.hughes@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>zilpin</td>
|
||||
<td>zilpin</td>
|
||||
<td><a class="reference external" href="mailto:ziLpin@gmail.com">ziLpin@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Will Rogers</td>
|
||||
<td>wjrogers</td>
|
||||
<td><a class="reference external" href="mailto:wjrogers@gmail.com">wjrogers@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>NMLittle</td>
|
||||
<td>nmlittle</td>
|
||||
<td><a class="reference external" href="mailto:nmlittle@gmail.com">nmlittle@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>root</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>reverb</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>Zhentar</td>
|
||||
<td>Zhentar</td>
|
||||
<td><a class="reference external" href="mailto:Zhentar@gmail.com">Zhentar@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Valentin Ochs</td>
|
||||
<td>Cat-Ion</td>
|
||||
<td><a class="reference external" href="mailto:a@0au.de">a@0au.de</a></td>
|
||||
</tr>
|
||||
<tr><td>Priit Laes</td>
|
||||
<td>plaes</td>
|
||||
<td><a class="reference external" href="mailto:plaes@plaes.org">plaes@plaes.org</a></td>
|
||||
</tr>
|
||||
<tr><td>kmartin</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>Neil Little</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>rout</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:rout.mail+github@gmail.com">rout.mail+github@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>rofl0r</td>
|
||||
<td>rofl0r</td>
|
||||
<td><a class="reference external" href="mailto:retnyg@gmx.net">retnyg@gmx.net</a></td>
|
||||
</tr>
|
||||
<tr><td>harlanplayford</td>
|
||||
<td>playfordh</td>
|
||||
<td><a class="reference external" href="mailto:harlanplayford@gmail.com">harlanplayford@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>John Shade</td>
|
||||
<td>gsvslto</td>
|
||||
<td><a class="reference external" href="mailto:gsvslto@gmail.com">gsvslto@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>sami</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>potato</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>feng1st</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:nf_xp@hotmail.com">nf_xp@hotmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>comestible</td>
|
||||
<td>nickrart</td>
|
||||
<td><a class="reference external" href="mailto:nickolas.g.russell@gmail.com">nickolas.g.russell@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Rumrusher</td>
|
||||
<td>rumrusher</td>
|
||||
<td><a class="reference external" href="mailto:Anuleakage@yahoo.com">Anuleakage@yahoo.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Rinin</td>
|
||||
<td>Rinin</td>
|
||||
<td><a class="reference external" href="mailto:RininS@Gmail.com">RininS@Gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Raoul van Putten</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>John Beisley</td>
|
||||
<td>huin</td>
|
||||
<td><a class="reference external" href="mailto:greatred@gmail.com">greatred@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Feng</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:nf_xp@hotmail.com">nf_xp@hotmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Donald Ruegsegger</td>
|
||||
<td>hashaash</td>
|
||||
<td><a class="reference external" href="mailto:druegsegger@gmail.com">druegsegger@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Caldfir</td>
|
||||
<td>caldfir</td>
|
||||
<td><a class="reference external" href="mailto:caldfir@hotmail.com">caldfir@hotmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Antalia</td>
|
||||
<td>tamarakorr</td>
|
||||
<td><a class="reference external" href="mailto:tamarakorr@gmail.com">tamarakorr@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Angus Mezick</td>
|
||||
<td>amezick</td>
|
||||
<td><a class="reference external" href="mailto:amezick@gmail.com">amezick@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Japa</td>
|
||||
<td>JapaMala</td>
|
||||
<td><a class="reference external" href="mailto:japa.mala.illo@gmail.com">japa.mala.illo@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Putnam</td>
|
||||
<td>Putnam3145</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>Lethosor</td>
|
||||
<td>lethosor</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>PeridexisErrant</td>
|
||||
<td>PeridexisErrant</td>
|
||||
<td><a class="reference external" href="mailto:PeridexisErrant@gmail.com">PeridexisErrant@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Eswald</td>
|
||||
<td>eswald</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>Ramblurr</td>
|
||||
<td>Ramblurr</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>MithrilTuxedo</td>
|
||||
<td>MithrilTuxedo</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>AndreasPK</td>
|
||||
<td>AndreasPK</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>Chris Dombroski</td>
|
||||
<td>cdombroski</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>Ben Lubar</td>
|
||||
<td>BenLubar</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>miffedmap</td>
|
||||
<td>miffedmap</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>scamtank</td>
|
||||
<td>scamtank</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>Mason11987</td>
|
||||
<td>Mason11987</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>James Logsdon</td>
|
||||
<td>jlogsdon</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>melkor217</td>
|
||||
<td>melkor217</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>And these are the cool people who made <strong>Stonesense</strong>.</p>
|
||||
<table border="1" class="docutils">
|
||||
<colgroup>
|
||||
<col width="31%" />
|
||||
<col width="27%" />
|
||||
<col width="43%" />
|
||||
</colgroup>
|
||||
<thead valign="bottom">
|
||||
<tr><th class="head">Name</th>
|
||||
<th class="head">Github</th>
|
||||
<th class="head">Email</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<tr><td>Kris Parker</td>
|
||||
<td>kaypy</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>Japa</td>
|
||||
<td>JapaMala</td>
|
||||
<td><a class="reference external" href="mailto:japa.mala.illo@gmail.com">japa.mala.illo@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Jonas Ask</td>
|
||||
<td> </td>
|
||||
<td><a class="reference external" href="mailto:jonask84@gmail.com">jonask84@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Petr Mrázek</td>
|
||||
<td>peterix</td>
|
||||
<td><a class="reference external" href="mailto:peterix@gmail.com">peterix@gmail.com</a>></td>
|
||||
</tr>
|
||||
<tr><td>Caldfir</td>
|
||||
<td>caldfir</td>
|
||||
<td><a class="reference external" href="mailto:aitken.tim@gmail.com">aitken.tim@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>8Z</td>
|
||||
<td>8Z</td>
|
||||
<td><a class="reference external" href="mailto:git8z@ya.ru">git8z@ya.ru</a></td>
|
||||
</tr>
|
||||
<tr><td>Alexander Gavrilov</td>
|
||||
<td>angavrilov</td>
|
||||
<td><a class="reference external" href="mailto:angavrilov@gmail.com">angavrilov@gmail.com</a></td>
|
||||
</tr>
|
||||
<tr><td>Timothy Collett</td>
|
||||
<td>danaris</td>
|
||||
<td><a class="reference external" href="mailto:tcollett+github@topazgryphon.org">tcollett+github@topazgryphon.org</a></td>
|
||||
</tr>
|
||||
<tr><td>Lethosor</td>
|
||||
<td>lethosor</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>Eswald</td>
|
||||
<td>eswald</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr><td>PeridexisErrant</td>
|
||||
<td>PeridexisErrant</td>
|
||||
<td><a class="reference external" href="mailto:PeridexisErrant@gmail.com">PeridexisErrant@gmail.com</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,192 @@
|
||||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = docs/_build
|
||||
|
||||
# User-friendly check for sphinx-build
|
||||
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
|
||||
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
|
||||
endif
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
# the i18n builder cannot share the environment and doctrees with the others
|
||||
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " applehelp to make an Apple Help Book"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " texinfo to make Texinfo files"
|
||||
@echo " info to make Texinfo files and run them through makeinfo"
|
||||
@echo " gettext to make PO message catalogs"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " xml to make Docutils-native XML files"
|
||||
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
@echo " coverage to run coverage check of the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml:
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/DFHack.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/DFHack.qhc"
|
||||
|
||||
applehelp:
|
||||
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
|
||||
@echo
|
||||
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
|
||||
@echo "N.B. You won't be able to view it unless you put it in" \
|
||||
"~/Library/Documentation/Help or install it in your application" \
|
||||
"bundle."
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/DFHack"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/DFHack"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
latexpdf:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
latexpdfja:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through platex and dvipdfmx..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
texinfo:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo
|
||||
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
||||
@echo "Run \`make' in that directory to run these through makeinfo" \
|
||||
"(use \`make info' here to do that automatically)."
|
||||
|
||||
info:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo "Running Texinfo files through makeinfo..."
|
||||
make -C $(BUILDDIR)/texinfo info
|
||||
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
||||
|
||||
gettext:
|
||||
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
||||
@echo
|
||||
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
||||
|
||||
coverage:
|
||||
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
|
||||
@echo "Testing of coverage in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/coverage/python.txt."
|
||||
|
||||
xml:
|
||||
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
|
||||
@echo
|
||||
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
|
||||
|
||||
pseudoxml:
|
||||
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
|
||||
@echo
|
||||
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
|
@ -0,0 +1,16 @@
|
||||
<!DOCTYPE HTML>
|
||||
<!-- DO NOT CHANGE THIS FILE - it redirects to the actual documentation. -->
|
||||
<!-- If the page is not found, you can read the raw docs in the docs folder. -->
|
||||
<html lang="en-US">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="refresh" content="0;url=./docs/_build/html/README.html">
|
||||
<script type="text/javascript">
|
||||
window.location.href = "./docs/_build/html/README.html"
|
||||
</script>
|
||||
<title>Page Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
If you are not redirected automatically, follow the <a href='./docs/_build/html/README.html'>link to the documentation.</a>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,56 @@
|
||||
Welcome to DFHack's documentation!
|
||||
==================================
|
||||
|
||||
Introduction
|
||||
============
|
||||
DFHack is a Dwarf Fortress memory access library, distributed with scripts
|
||||
and plugins implementing a wide variety of useful functions and tools.
|
||||
|
||||
For users, it provides a significant suite of bugfixes and interface
|
||||
enhancements by default, and more can be enabled. There are also many tools
|
||||
(such as ``workflow`` or ``autodump``) which can make life easier. You can
|
||||
even add third-party scripts and plugins to do almost anything!
|
||||
|
||||
For modders, DFHack makes many things possible. Custom reactions, new
|
||||
interactions, magic creature abilities, and more can be set through scripts
|
||||
and custom raws. Non-standard DFHack scripts and inits can be stored in the
|
||||
raw directory, making raws or saves fully self-contained for distribution -
|
||||
or for coexistence in a single DF install, even with incompatible components.
|
||||
|
||||
For developers, DFHack unites the various ways tools access DF memory and
|
||||
allows easier development of new tools. As an open-source project under
|
||||
various copyleft licences, contributions are welcome.
|
||||
|
||||
|
||||
Documentation
|
||||
=============
|
||||
DFHack documentation is generated by Sphinx. Check out the table of contents
|
||||
below, or the sources in the docs folder!
|
||||
|
||||
|
||||
User Manual:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
docs/Readme
|
||||
docs/Plugins
|
||||
docs/Scripts
|
||||
|
||||
Other Contents:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
docs/Authors
|
||||
docs/Licenses
|
||||
docs/Changelog
|
||||
|
||||
For Developers:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
docs/Contributing
|
||||
docs/Compile
|
||||
docs/Lua API
|
@ -0,0 +1,297 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# DFHack documentation build configuration file, created by
|
||||
# sphinx-quickstart on Tue Sep 22 17:34:54 2015.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its
|
||||
# containing dir.
|
||||
#
|
||||
# Note that not all possible configuration values are present in this
|
||||
# autogenerated file.
|
||||
#
|
||||
# All configuration values have a default; values that are commented out
|
||||
# serve to show the default.
|
||||
|
||||
import fnmatch
|
||||
import sys
|
||||
import os
|
||||
import shlex
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
# -- General configuration ------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
#needs_sphinx = '1.0'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = []
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = []
|
||||
|
||||
# The suffix(es) of source filenames.
|
||||
# You can specify multiple suffix as a list of string:
|
||||
# source_suffix = ['.rst', '.md']
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The encoding of source files.
|
||||
#source_encoding = 'utf-8-sig'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'README'
|
||||
|
||||
# General information about the project.
|
||||
project = 'DFHack'
|
||||
copyright = '2015, The DFHack Team'
|
||||
author = 'The DFHack Team'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
|
||||
def get_version():
|
||||
"""Return the DFHack version string, from CMakeLists.txt"""
|
||||
version, release = '', ''
|
||||
with open('CMakeLists.txt') as f:
|
||||
for s in f.readlines():
|
||||
if fnmatch.fnmatch(s.upper(), 'SET(DF_VERSION "?.??.??")\n'):
|
||||
version = s.upper().replace('SET(DF_VERSION "', '')
|
||||
elif fnmatch.fnmatch(s.upper(), 'SET(DFHACK_RELEASE "r*")\n'):
|
||||
release = s.upper().replace('SET(DFHACK_RELEASE "', '').lower()
|
||||
return (version + '-' + release).replace('")\n', '')
|
||||
|
||||
# The short X.Y version.
|
||||
version = get_version()
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = get_version()
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#
|
||||
# This is also used if you do content translation via gettext catalogs.
|
||||
# Usually you set "language" from the command line for these cases.
|
||||
language = None
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
#today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
exclude_patterns = ['docs/_build/*', 'depends/*']
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all
|
||||
# documents.
|
||||
#default_role = None
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
#add_function_parentheses = True
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
#add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
#show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
#modindex_common_prefix = []
|
||||
|
||||
# If true, keep warnings as "system message" paragraphs in the built documents.
|
||||
#keep_warnings = False
|
||||
|
||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||
todo_include_todos = False
|
||||
|
||||
|
||||
# -- Options for HTML output ----------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
html_theme = 'alabaster'
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#html_theme_options = {}
|
||||
|
||||
# Add any paths that contain custom themes here, relative to this directory.
|
||||
#html_theme_path = []
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
#html_title = None
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
#html_short_title = None
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top
|
||||
# of the sidebar.
|
||||
#html_logo = None
|
||||
|
||||
# The name of an image file (within the static path) to use as favicon of the
|
||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
# pixels large.
|
||||
#html_favicon = None
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = []
|
||||
|
||||
# Add any extra paths that contain custom files (such as robots.txt or
|
||||
# .htaccess) here, relative to this directory. These files are copied
|
||||
# directly to the root of the documentation.
|
||||
#html_extra_path = []
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
#html_last_updated_fmt = '%b %d, %Y'
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
#html_use_smartypants = True
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
#html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
#html_domain_indices = True
|
||||
|
||||
# If false, no index is generated.
|
||||
#html_use_index = True
|
||||
|
||||
# If true, the index is split into individual pages for each letter.
|
||||
#html_split_index = False
|
||||
|
||||
# If true, links to the reST sources are added to the pages.
|
||||
#html_show_sourcelink = True
|
||||
|
||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||
#html_show_sphinx = True
|
||||
|
||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||
#html_show_copyright = True
|
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will
|
||||
# contain a <link> tag referring to it. The value of this option must be the
|
||||
# base URL from which the finished HTML is served.
|
||||
#html_use_opensearch = ''
|
||||
|
||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||
#html_file_suffix = None
|
||||
|
||||
# Language to be used for generating the HTML full-text search index.
|
||||
# Sphinx supports the following languages:
|
||||
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja'
|
||||
# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr'
|
||||
#html_search_language = 'en'
|
||||
|
||||
# A dictionary with options for the search language support, empty by default.
|
||||
# Now only 'ja' uses this config value
|
||||
#html_search_options = {'type': 'default'}
|
||||
|
||||
# The name of a javascript file (relative to the configuration directory) that
|
||||
# implements a search results scorer. If empty, the default will be used.
|
||||
#html_search_scorer = 'scorer.js'
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'DFHackdoc'
|
||||
|
||||
# -- Options for LaTeX output ---------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#'papersize': 'letterpaper',
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#'pointsize': '10pt',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#'preamble': '',
|
||||
|
||||
# Latex figure (float) alignment
|
||||
#'figure_align': 'htbp',
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
(master_doc, 'DFHack.tex', 'DFHack Documentation',
|
||||
'The DFHack Team', 'manual'),
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
# the title page.
|
||||
#latex_logo = None
|
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||
# not chapters.
|
||||
#latex_use_parts = False
|
||||
|
||||
# If true, show page references after internal links.
|
||||
#latex_show_pagerefs = False
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
#latex_show_urls = False
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#latex_domain_indices = True
|
||||
|
||||
|
||||
# -- Options for manual page output ---------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
(master_doc, 'dfhack', 'DFHack Documentation',
|
||||
[author], 1)
|
||||
]
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
#man_show_urls = False
|
||||
|
||||
|
||||
# -- Options for Texinfo output -------------------------------------------
|
||||
|
||||
# Grouping the document tree into Texinfo files. List of tuples
|
||||
# (source start file, target name, title, author,
|
||||
# dir menu entry, description, category)
|
||||
texinfo_documents = [
|
||||
(master_doc, 'DFHack', 'DFHack Documentation',
|
||||
author, 'DFHack', 'One line description of project.',
|
||||
'Miscellaneous'),
|
||||
]
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#texinfo_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#texinfo_domain_indices = True
|
||||
|
||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
||||
#texinfo_show_urls = 'footnote'
|
||||
|
||||
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
||||
#texinfo_no_detailmenu = False
|
@ -0,0 +1,7 @@
|
||||
#########
|
||||
Changelog
|
||||
#########
|
||||
|
||||
.. contents::
|
||||
|
||||
.. include:: ../NEWS
|
@ -0,0 +1,108 @@
|
||||
###########################
|
||||
How to contribute to DFHack
|
||||
###########################
|
||||
|
||||
.. contents::
|
||||
|
||||
You can help without coding
|
||||
===========================
|
||||
DFHack is a software project, but there's a lot more to it than programming.
|
||||
If you're not comfortable pregramming, you can help by:
|
||||
|
||||
* reporting bugs and incomplete documentation,
|
||||
* improving the documentation,
|
||||
* finding third-party scripts to add,
|
||||
* writing tutorials for newbies
|
||||
|
||||
All those things are crucial, and all under-represented. So if that's
|
||||
your thing, the rest of this document is about contributing code - go get started!
|
||||
|
||||
Contributing Code
|
||||
=================
|
||||
Several things should be kept in mind when contributing code to DFHack.
|
||||
|
||||
Code Format
|
||||
-----------
|
||||
|
||||
* Four space indents for C++. Never use tabs for indentation in any language.
|
||||
* LF (Unix style) line terminators
|
||||
* Avoid trailing whitespace
|
||||
* UTF-8 encoding
|
||||
* For C++:
|
||||
|
||||
* Opening and closing braces on their own lines or opening brace at the end of the previous line
|
||||
* Braces placed at original indent level if on their own lines
|
||||
* #includes should be sorted. C++ libraries first, then dfhack modules, then df structures,
|
||||
then local includes. Within each category they should be sorted alphabetically.
|
||||
|
||||
How to get new code into DFHack
|
||||
-------------------------------
|
||||
|
||||
* Submit pull requests to the ``develop`` branch, not the master branch. The master branch always points at the most recent release.
|
||||
* Use new branches for each feature/fix so that your changes can be merged independently (i.e. not the master or develop branch of your fork).
|
||||
* If possible, compile on multiple platforms when changing anything that compiles
|
||||
* Update NEWS and doc/Authors.rst when applicable
|
||||
* Create a Github Pull Request once finished
|
||||
* Work done against Github issues tagged "bug report" get priority
|
||||
* Submit ideas and bug reports as issues on Github. Posts in the forum thread can easily get missed or forgotten.
|
||||
|
||||
Memory research
|
||||
---------------
|
||||
If you want to do memory research, you'll need some tools and some knowledge.
|
||||
In general, you'll need a good memory viewer and optionally something
|
||||
to look at machine code without getting crazy :)
|
||||
Using publicly known information and analyzing the game's data is preferred.
|
||||
|
||||
Good windows tools include:
|
||||
|
||||
* Cheat Engine
|
||||
* IDA Pro 5.0 (freely available for non-commercial use)
|
||||
|
||||
Good linux tools:
|
||||
|
||||
* angavrilov's df-structures gui (visit us on IRC for details).
|
||||
* edb (Evan's Debugger)
|
||||
* IDA Pro 5.0 running under Wine
|
||||
* Some of the tools residing in the ``legacy`` dfhack branch.
|
||||
|
||||
Using the library as a developer
|
||||
================================
|
||||
Currently, the most direct way to use the library is to write a script or plugin that can be loaded by it.
|
||||
All the plugins can be found in the 'plugins' folder. There's no in-depth documentation
|
||||
on how to write one yet, but it should be easy enough to copy one and just follow the pattern.
|
||||
|
||||
Other than through plugins, it is possible to use DFHack via remote access interface, or by writing Lua scripts.
|
||||
|
||||
The most important parts of DFHack are the Core, Console, Modules and Plugins.
|
||||
|
||||
* Core acts as the centerpiece of DFHack - it acts as a filter between DF and SDL and synchronizes the various plugins with DF.
|
||||
* Console is a thread-safe console that can be used to invoke commands exported by Plugins.
|
||||
* Modules actually describe the way to access information in DF's memory. You can get them from the Core. Most modules are split into two parts: high-level and low-level. High-level is mostly method calls, low-level publicly visible pointers to DF's data structures.
|
||||
* Plugins are the tools that use all the other stuff to make things happen. A plugin can have a list of commands that it exports and an onupdate function that will be called each DF game tick.
|
||||
|
||||
Rudimentary API documentation can be built using doxygen (see build options with ``ccmake`` or ``cmake-gui``).
|
||||
|
||||
DFHack consists of variously licensed code, but invariably weak copyleft.
|
||||
The main license is zlib/libpng, some bits are MIT licensed, and some are BSD licensed.
|
||||
|
||||
Feel free to add your own extensions and plugins. Contributing back to
|
||||
the dfhack repository is welcome and the right thing to do :)
|
||||
|
||||
DF data structure definitions
|
||||
-----------------------------
|
||||
|
||||
DFHack uses information about the game data structures, represented via xml files in the library/xml/ submodule.
|
||||
|
||||
See https://github.com/DFHack/df-structures
|
||||
|
||||
Data structure layouts are described in files following the df.\*.xml name pattern. This information is transformed by a perl script into C++ headers describing the structures, and associated metadata for the Lua wrapper. These headers and data are then compiled into the DFHack libraries, thus necessitating a compatibility break every time layouts change; in return it significantly boosts the efficiency and capabilities of DFHack code.
|
||||
|
||||
Global object addresses are stored in symbols.xml, which is copied to the dfhack release package and loaded as data at runtime.
|
||||
|
||||
Remote access interface
|
||||
-----------------------
|
||||
DFHack supports remote access by exchanging Google protobuf messages via a TCP socket. Both the core and plugins can define remotely accessible methods. The ``dfhack-run`` command uses this interface to invoke ordinary console commands.
|
||||
|
||||
Currently the supported set of requests is limited, because the developers don't know what exactly is most useful.
|
||||
``remotefortressreader`` provides a fairly comprehensive interface for visualisers such as Armok Vision.
|
||||
|
@ -0,0 +1,10 @@
|
||||
########
|
||||
Licenses
|
||||
########
|
||||
|
||||
DFHack is distributed under a range of permissive and weakly copyleft licenses.
|
||||
|
||||
The core uses the ZLib license; the others are described below.
|
||||
|
||||
.. include:: ../LICENSE
|
||||
:literal:
|
@ -0,0 +1,305 @@
|
||||
#############
|
||||
DFHack Readme
|
||||
#############
|
||||
|
||||
.. contents::
|
||||
|
||||
|
||||
==============
|
||||
Getting DFHack
|
||||
==============
|
||||
The project is currently hosted at http://www.github.com/
|
||||
|
||||
Recent releases are available in source and binary formats `on the releases
|
||||
page`_, while the binaries for releases 0.40.15-r1 to 0.34.11-r4 are on DFFD_.
|
||||
Even older versions are available here_.
|
||||
|
||||
.. _`on the releases page`: http://github.com/DFHack/dfhack/releases
|
||||
.. _DFFD: http://dffd.bay12games.com/search.php?string=DFHack&id=15
|
||||
.. _here: http://dethware.org/dfhack/download
|
||||
|
||||
All new releases are announced in `the bay12 forums thread`_, which is also a
|
||||
good place for discussion and questions.
|
||||
|
||||
.. _`the bay12 forums thread`: http://www.bay12forums.com/smf/index.php?topic=139553
|
||||
|
||||
If this sounds too complicated, you might prefer to `get a Starter Pack`_.
|
||||
These are packages for new players or those who don't want to set up everything
|
||||
themselves, and are available - with DFHack configured - for all OSes.
|
||||
|
||||
.. _`get a Starter Pack`: http://dwarffortresswiki.org/index.php/Utility:Lazy_Newb_Pack
|
||||
|
||||
Compatibility
|
||||
=============
|
||||
DFHack is available for Windows (XP or later), Linux (any modern distribution),
|
||||
or OS X (10.6.8 to 10.9).
|
||||
|
||||
Most releases only support the version of DF mentioned in their title - for
|
||||
example, DFHack 0.40.24-r2 only supports DF 0.40.24 - but some releases
|
||||
support earlier DF versions as well. Wherever possible, use the latest version
|
||||
built for the target version of DF.
|
||||
|
||||
On Windows, DFHack is compatible with the SDL version of DF, but not the legacy version.
|
||||
|
||||
It is also possible to use the Windows DFHack with Wine under Linux and OS X.
|
||||
|
||||
Installation/Removal
|
||||
====================
|
||||
Installing DFhack involves copying files into your DF folder.
|
||||
Copy the files from a release archive so that:
|
||||
|
||||
* On Windows, SDL.dll is replaced
|
||||
* On Linux, the 'dfhack' script is placed in the same folder as the 'df' script
|
||||
|
||||
Uninstalling is basically the same, in reverse:
|
||||
|
||||
* On Windows, first delete SDL.dll and rename SDLreal.dll to SDL.dll. Then
|
||||
remove the other DFHack files
|
||||
* On Linux, Remove the DFHack files.
|
||||
|
||||
The stonesense plugin might require some additional libraries on Linux.
|
||||
|
||||
If any of the plugins or dfhack itself refuses to load, check the stderr.log
|
||||
file created in your DF folder.
|
||||
|
||||
|
||||
===============
|
||||
Getting started
|
||||
===============
|
||||
If DFHack is installed correctly, it will automatically pop up a console
|
||||
window once DF is started as usual on windows. Linux and Mac OS X require
|
||||
running the dfhack script from the terminal, and will use that terminal for
|
||||
the console.
|
||||
|
||||
**NOTE**: The dfhack-run executable is there for calling DFHack commands in
|
||||
an already running DF+DFHack instance from external OS scripts and programs,
|
||||
and is *not* the way how you use DFHack normally.
|
||||
|
||||
DFHack has a lot of features, which can be accessed by typing commands in the
|
||||
console, or by mapping them to keyboard shortcuts. Most of the newer and more
|
||||
user-friendly tools are designed to be at least partially used via the latter
|
||||
way.
|
||||
|
||||
In order to set keybindings, you have to create a text configuration file
|
||||
called ``dfhack.init``; the installation comes with an example version called
|
||||
``dfhack.init-example``, which is fully functional, covers all of the recent
|
||||
features and can be simply renamed to ``dfhack.init``. You are encouraged to look
|
||||
through it to learn which features it makes available under which key combinations.
|
||||
|
||||
For more information, refer to the rest of this document.
|
||||
|
||||
Using DFHack
|
||||
============
|
||||
DFHack basically extends what DF can do with something similar to the drop-down
|
||||
console found in Quake engine games. On Windows, this is a separate command line
|
||||
window. On linux, the terminal used to launch the dfhack script is taken over
|
||||
(so, make sure you start from a terminal). Basic interaction with dfhack
|
||||
involves entering commands into the console. For some basic instructions,
|
||||
use the 'help' command. To list all possible commands, use the 'ls' command.
|
||||
Many commands have their own help or detailed description. You can use
|
||||
'command help' or 'command ?' to show that.
|
||||
|
||||
The command line has some nice line editing capabilities, including history
|
||||
that's preserved between different runs of DF (use up/down keys to go through
|
||||
the history).
|
||||
|
||||
The second way to interact with DFHack is to bind the available commands
|
||||
to in-game hotkeys. The old way to do this is via the hotkey/zoom menu (normally
|
||||
opened with the 'h' key). Binding the commands is done by assigning a command as
|
||||
a hotkey name (with 'n').
|
||||
|
||||
A new and more flexible way is the keybinding command in the dfhack console.
|
||||
However, bindings created this way are not automatically remembered between runs
|
||||
of the game, so it becomes necessary to use the dfhack.init file to ensure that
|
||||
they are re-created every time it is loaded.
|
||||
|
||||
Interactive commands like 'liquids' cannot be used as hotkeys.
|
||||
|
||||
Most of the commands come from plugins. Those reside in 'hack/plugins/'.
|
||||
|
||||
Something doesn't work, help!
|
||||
=============================
|
||||
First, don't panic :)
|
||||
|
||||
Second, dfhack keeps a few log files in DF's folder (``stderr.log`` and
|
||||
``stdout.log``). Looking at these might help you solve the problem.
|
||||
If it doesn't, you can ask for help in the forum thread or on IRC.
|
||||
|
||||
If you found a bug, you can report it in the Bay12 DFHack thread, the issues
|
||||
tracker on github, or visit the #dfhack IRC channel on freenode.
|
||||
|
||||
Commands
|
||||
========
|
||||
DFHack command syntax consists of a command name, followed by arguments separated
|
||||
by whitespace. To include whitespace in an argument, quote it in double quotes.
|
||||
To include a double quote character, use ``\"`` inside double quotes.
|
||||
|
||||
If the first non-whitespace character of a line is ``#``, the line is treated
|
||||
as a comment, i.e. a silent no-op command.
|
||||
|
||||
When reading commands from dfhack.init or with the ``script`` command, if the final character on a line is a backslash then the next uncommented line is considered a continuation of that line, with the backslash deleted.
|
||||
Commented lines are skipped, so it is possible to comment out parts of a command with the ``#`` character.
|
||||
|
||||
If the first non-whitespace character is ``:``, the command is parsed in a special
|
||||
alternative mode: first, non-whitespace characters immediately following the ``:``
|
||||
are used as the command name; the remaining part of the line, starting with the first
|
||||
non-whitespace character *after* the command name, is used verbatim as the first argument.
|
||||
The following two command lines are exactly equivalent::
|
||||
|
||||
:foo a b "c d" e f
|
||||
foo "a b \"c d\" e f"
|
||||
|
||||
This is intended for commands like ``rb_eval`` that evaluate script language statements.
|
||||
|
||||
Almost all the commands support using the 'help <command-name>' built-in command
|
||||
to retrieve further help without having to look at this document. Alternatively,
|
||||
some accept a 'help'/'?' option on their command line.
|
||||
|
||||
The init file
|
||||
=============
|
||||
DFHack allows users to automatically run commonly-used DFHack commands when DF is first loaded, when a game is loaded, and when a game is unloaded.
|
||||
Init scripts function the same way they would if the user manually typed in their contents, but are much more convenient.
|
||||
If your DF folder contains at least one file with a name following the format ``dfhack*.init`` where ``*`` is a placeholder for any string (including the empty string), then all such files are executed in alphabetical order as init scripts when DF is first loaded.
|
||||
If your DF folder does not contain any such files, then DFHack will execute ``dfhack.init-example`` as an example of useful commands to be run automatically.
|
||||
If you want DFHack to do nothing on its own, then create an empty ``dfhack.init`` file in the main DF directory, or delete ``dfhack.init-example``.
|
||||
The file ``dfhack.init-example`` is included as an example for users to follow if they need DFHack command executed automatically.
|
||||
We highly recommend modifying or deleting ``dfhack.init-example`` as its settings will not be optimal for all players.
|
||||
|
||||
In order to facilitate savegave portability, mod merging, and general organization of init files, DFHack supports multiple init files both in the main DF directory and save-specific init files in the save folders.
|
||||
DFHack looks for init files in three places.
|
||||
It will look for them in the main DF directory, and in ``data/save/_____/raw`` and ``data/save/_____/raw/objects`` where ``_____`` is the name of the current savegame.
|
||||
When a game is loaded, DFHack looks for files of the form ``onLoad*.init``, where ``*`` can be any string, including the empty string.
|
||||
When a game is unloaded, DFHack looks for files of the form ``onUnload*.init``.
|
||||
Again, these files may be in any of the above three places.
|
||||
All matching init files will be sorted and executed in alphebetical order.
|
||||
|
||||
Setting keybindings
|
||||
===================
|
||||
To set keybindings, use the built-in ``keybinding`` command. Like any other
|
||||
command it can be used at any time from the console, but it is most useful
|
||||
in the DFHack init file.
|
||||
|
||||
Currently, any combinations of Ctrl/Alt/Shift with A-Z, 0-9, or F1-F12 are supported.
|
||||
|
||||
Possible ways to call the command:
|
||||
|
||||
``keybinding list <key>``
|
||||
List bindings active for the key combination.
|
||||
``keybinding clear <key> <key>...``
|
||||
Remove bindings for the specified keys.
|
||||
``keybinding add <key> "cmdline" "cmdline"...``
|
||||
Add bindings for the specified key.
|
||||
``keybinding set <key> "cmdline" "cmdline"...``
|
||||
Clear, and then add bindings for the specified key.
|
||||
|
||||
The *<key>* parameter above has the following *case-sensitive* syntax::
|
||||
|
||||
[Ctrl-][Alt-][Shift-]KEY[@context[|context...]]
|
||||
|
||||
where the *KEY* part can be any recognized key and [] denote optional parts.
|
||||
|
||||
When multiple commands are bound to the same key combination, DFHack selects
|
||||
the first applicable one. Later 'add' commands, and earlier entries within one
|
||||
'add' command have priority. Commands that are not specifically intended for use
|
||||
as a hotkey are always considered applicable.
|
||||
|
||||
The *context* part in the key specifier above can be used to explicitly restrict
|
||||
the UI state where the binding would be applicable. If called without parameters,
|
||||
the ``keybinding`` command among other things prints the current context string.
|
||||
Only bindings with a *context* tag that either matches the current context fully,
|
||||
or is a prefix ending at a '/' boundary would be considered for execution, i.e.
|
||||
for context ``foo/bar/baz``, possible matches are any of ``@foo/bar/baz``, ``@foo/bar``,
|
||||
``@foo`` or none. Multiple contexts can be specified by separating them with a
|
||||
pipe (``|``) - for example, ``@foo|bar|baz/foo``.
|
||||
|
||||
Hotkeys
|
||||
=======
|
||||
Opens an in-game screen showing DFHack keybindings that are active in the current context.
|
||||
|
||||
.. image:: images/hotkeys.png
|
||||
|
||||
Type ``hotkeys`` into the DFHack console to open the screen, or bind the command to a
|
||||
globally active hotkey. The default keybinding is ``Ctrl-F1``.
|
||||
|
||||
Enabling plugins
|
||||
================
|
||||
Many plugins can be in a distinct enabled or disabled state. Some of
|
||||
them activate and deactivate automatically depending on the contents
|
||||
of the world raws. Others store their state in world data. However a
|
||||
number of them have to be enabled globally, and the init file is the
|
||||
right place to do it.
|
||||
|
||||
Most such plugins or scripts support the built-in ``enable`` and ``disable``
|
||||
commands. Calling them at any time without arguments prints a list
|
||||
of enabled and disabled plugins, and shows whether that can be changed
|
||||
through the same commands.
|
||||
|
||||
To enable or disable plugins that support this, use their names as
|
||||
arguments for the command::
|
||||
|
||||
enable manipulator search
|
||||
|
||||
|
||||
In-game interface tools
|
||||
=======================
|
||||
Some tools work by displaying dialogs or overlays in the game window.
|
||||
|
||||
In order to avoid user confusion, as a matter of policy all these tools
|
||||
must display the word "DFHack" on the screen somewhere while active.
|
||||
When that is not appropriate because they merely add keybinding hints to
|
||||
existing DF screens, they deliberately use red instead of green for the key.
|
||||
|
||||
Game progress
|
||||
=============
|
||||
|
||||
die
|
||||
---
|
||||
Instantly kills DF without saving.
|
||||
|
||||
quicksave
|
||||
---------
|
||||
Save immediately, without exiting. Only available in fortress mode.
|
||||
|
||||
forcepause
|
||||
----------
|
||||
Forces DF to pause. This is useful when your FPS drops below 1 and you lose
|
||||
control of the game. Activate with ``forcepause 1``; deactivate with ``forcepause 0``.
|
||||
|
||||
hide / show
|
||||
-----------
|
||||
Hides or shows the DFHack terminal window, respectively. To use ``show``, use
|
||||
the in-game console (default keybinding ``Ctrl-Shift-P``). Only available on Windows.
|
||||
|
||||
nopause
|
||||
-------
|
||||
Disables pausing (both manual and automatic) with the exception of pause forced
|
||||
by 'reveal hell'. This is nice for digging under rivers.
|
||||
|
||||
Patched binaries
|
||||
================
|
||||
As an alternative to permanently modifying the binary, you can use the
|
||||
``binpatch`` dfhack command to apply patches live in memory during a DF session.
|
||||
|
||||
In this case, updating symbols.xml is not necessary - otherwise Linux and OSX
|
||||
users of patched binaries may have to find the relevant section in ``symbols.xml``,
|
||||
and add a new line with the checksum of their executable::
|
||||
|
||||
<md5-hash value='????????????????????????????????'/>
|
||||
|
||||
In order to find the correct value of the hash, look into stderr.log;
|
||||
DFHack prints an error there if it does not recognize the hash.
|
||||
|
||||
DFHack includes a small stand-alone utility for applying and removing
|
||||
binary patches from the game executable. Use it from the regular operating
|
||||
system console:
|
||||
|
||||
``binpatch check "Dwarf Fortress.exe" patch.dif``
|
||||
Checks and prints if the patch is currently applied.
|
||||
|
||||
``binpatch apply "Dwarf Fortress.exe" patch.dif``
|
||||
Applies the patch, unless it is already applied or in conflict.
|
||||
|
||||
``binpatch remove "Dwarf Fortress.exe" patch.dif``
|
||||
Removes the patch, unless it is already removed.
|
||||
|
||||
The patches are expected to be encoded in text format used by IDA.
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
@ -1,57 +0,0 @@
|
||||
#!/bin/bash
|
||||
# regenerate documentation after editing the .rst files. Requires python and docutils.
|
||||
|
||||
force=
|
||||
reset=
|
||||
while [ $# -gt 0 ]
|
||||
do
|
||||
case "$1" in
|
||||
--force) force=1
|
||||
;;
|
||||
--reset) reset=1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
rst2html=$(which rst2html || which rst2html.py)
|
||||
if [[ -z "$rst2html" ]]; then
|
||||
echo "Docutils not found: See http://docutils.sourceforge.net/"
|
||||
exit 1
|
||||
fi
|
||||
rst2html_version=$("$rst2html" --version | cut -d' ' -f3)
|
||||
|
||||
if [[ $(echo $rst2html_version | cut -d. -f2) -lt 12 ]]; then
|
||||
echo "You are using docutils $rst2html_version. Docutils 0.12+ is recommended
|
||||
to build these documents."
|
||||
read -r -n1 -p "Continue? [y/N] " reply
|
||||
echo
|
||||
if [[ ! $reply =~ ^[Yy]$ ]]; then
|
||||
exit
|
||||
fi
|
||||
fi
|
||||
|
||||
cd `dirname $0`
|
||||
status=0
|
||||
|
||||
function process() {
|
||||
if [ -n "$reset" ]; then
|
||||
git checkout -- "$2"
|
||||
elif [ "$1" -nt "$2" ] || [ -n "$force" ]; then
|
||||
echo -n "Updating $2... "
|
||||
if "$rst2html" --no-generator --no-datestamp "$1" "$2"; then
|
||||
echo "Done"
|
||||
else
|
||||
status=1
|
||||
fi
|
||||
else
|
||||
echo "$2 - up to date."
|
||||
fi
|
||||
}
|
||||
|
||||
process Readme.rst Readme.html
|
||||
process Compile.rst Compile.html
|
||||
process Lua\ API.rst Lua\ API.html
|
||||
process Contributors.rst Contributors.html
|
||||
process Contributing.rst Contributing.html
|
||||
exit $status
|
Before Width: | Height: | Size: 57 KiB |
@ -0,0 +1,263 @@
|
||||
@ECHO OFF
|
||||
|
||||
REM Command file for Sphinx documentation
|
||||
|
||||
if "%SPHINXBUILD%" == "" (
|
||||
set SPHINXBUILD=sphinx-build
|
||||
)
|
||||
set BUILDDIR=docs\_build
|
||||
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
|
||||
set I18NSPHINXOPTS=%SPHINXOPTS% .
|
||||
if NOT "%PAPER%" == "" (
|
||||
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
|
||||
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
|
||||
)
|
||||
|
||||
if "%1" == "" goto help
|
||||
|
||||
if "%1" == "help" (
|
||||
:help
|
||||
echo.Please use `make ^<target^>` where ^<target^> is one of
|
||||
echo. html to make standalone HTML files
|
||||
echo. dirhtml to make HTML files named index.html in directories
|
||||
echo. singlehtml to make a single large HTML file
|
||||
echo. pickle to make pickle files
|
||||
echo. json to make JSON files
|
||||
echo. htmlhelp to make HTML files and a HTML help project
|
||||
echo. qthelp to make HTML files and a qthelp project
|
||||
echo. devhelp to make HTML files and a Devhelp project
|
||||
echo. epub to make an epub
|
||||
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
|
||||
echo. text to make text files
|
||||
echo. man to make manual pages
|
||||
echo. texinfo to make Texinfo files
|
||||
echo. gettext to make PO message catalogs
|
||||
echo. changes to make an overview over all changed/added/deprecated items
|
||||
echo. xml to make Docutils-native XML files
|
||||
echo. pseudoxml to make pseudoxml-XML files for display purposes
|
||||
echo. linkcheck to check all external links for integrity
|
||||
echo. doctest to run all doctests embedded in the documentation if enabled
|
||||
echo. coverage to run coverage check of the documentation if enabled
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "clean" (
|
||||
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
|
||||
del /q /s %BUILDDIR%\*
|
||||
goto end
|
||||
)
|
||||
|
||||
|
||||
REM Check if sphinx-build is available and fallback to Python version if any
|
||||
%SPHINXBUILD% 2> nul
|
||||
if errorlevel 9009 goto sphinx_python
|
||||
goto sphinx_ok
|
||||
|
||||
:sphinx_python
|
||||
|
||||
set SPHINXBUILD=python -m sphinx.__init__
|
||||
%SPHINXBUILD% 2> nul
|
||||
if errorlevel 9009 (
|
||||
echo.
|
||||
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
|
||||
echo.installed, then set the SPHINXBUILD environment variable to point
|
||||
echo.to the full path of the 'sphinx-build' executable. Alternatively you
|
||||
echo.may add the Sphinx directory to PATH.
|
||||
echo.
|
||||
echo.If you don't have Sphinx installed, grab it from
|
||||
echo.http://sphinx-doc.org/
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:sphinx_ok
|
||||
|
||||
|
||||
if "%1" == "html" (
|
||||
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "dirhtml" (
|
||||
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "singlehtml" (
|
||||
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "pickle" (
|
||||
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can process the pickle files.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "json" (
|
||||
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can process the JSON files.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "htmlhelp" (
|
||||
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can run HTML Help Workshop with the ^
|
||||
.hhp project file in %BUILDDIR%/htmlhelp.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "qthelp" (
|
||||
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can run "qcollectiongenerator" with the ^
|
||||
.qhcp project file in %BUILDDIR%/qthelp, like this:
|
||||
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\DFHack.qhcp
|
||||
echo.To view the help file:
|
||||
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\DFHack.ghc
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "devhelp" (
|
||||
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "epub" (
|
||||
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The epub file is in %BUILDDIR%/epub.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "latex" (
|
||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "latexpdf" (
|
||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
|
||||
cd %BUILDDIR%/latex
|
||||
make all-pdf
|
||||
cd %~dp0
|
||||
echo.
|
||||
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "latexpdfja" (
|
||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
|
||||
cd %BUILDDIR%/latex
|
||||
make all-pdf-ja
|
||||
cd %~dp0
|
||||
echo.
|
||||
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "text" (
|
||||
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The text files are in %BUILDDIR%/text.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "man" (
|
||||
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The manual pages are in %BUILDDIR%/man.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "texinfo" (
|
||||
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "gettext" (
|
||||
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "changes" (
|
||||
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.The overview file is in %BUILDDIR%/changes.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "linkcheck" (
|
||||
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Link check complete; look for any errors in the above output ^
|
||||
or in %BUILDDIR%/linkcheck/output.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "doctest" (
|
||||
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Testing of doctests in the sources finished, look at the ^
|
||||
results in %BUILDDIR%/doctest/output.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "coverage" (
|
||||
%SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Testing of coverage in the sources finished, look at the ^
|
||||
results in %BUILDDIR%/coverage/python.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "xml" (
|
||||
%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The XML files are in %BUILDDIR%/xml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "pseudoxml" (
|
||||
%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
|
||||
goto end
|
||||
)
|
||||
|
||||
:end
|
@ -0,0 +1,30 @@
|
||||
import os, sys
|
||||
|
||||
scriptdir = 'scripts'
|
||||
|
||||
def is_script(fname):
|
||||
if not os.path.isfile(fname):
|
||||
return False
|
||||
return fname.endswith('.lua') or fname.endswith('.rb')
|
||||
|
||||
def main():
|
||||
files = []
|
||||
for item in os.listdir(scriptdir):
|
||||
path = os.path.join(scriptdir, item)
|
||||
if is_script(path):
|
||||
files.append(item)
|
||||
elif os.path.isdir(path) and item not in ('devel', '3rdparty'):
|
||||
files.extend([item + '/' + f for f in os.listdir(path)
|
||||
if is_script(os.path.join(path, f))])
|
||||
with open('docs/Scripts.rst') as f:
|
||||
text = f.read()
|
||||
error = 0
|
||||
for f, _ in [os.path.splitext(p) for p in files]:
|
||||
heading = '\n' + f + '\n' + '=' * len(f) + '\n'
|
||||
if heading not in text:
|
||||
print('WARNING: {:28} not documented in docs/Scripts'.format(f))
|
||||
error = 1
|
||||
sys.exit(error)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|