Merge remote-tracking branch 'upstream/develop' into quickfort_skeleton
commit
ca1742243b
@ -0,0 +1,152 @@
|
|||||||
|
.. _installing:
|
||||||
|
|
||||||
|
=================
|
||||||
|
Installing DFHack
|
||||||
|
=================
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:local:
|
||||||
|
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
============
|
||||||
|
|
||||||
|
DFHack supports Windows, Linux, and macOS, and both 64-bit and 32-bit builds
|
||||||
|
of Dwarf Fortress.
|
||||||
|
|
||||||
|
.. _installing-df-version:
|
||||||
|
|
||||||
|
DFHack releases generally only support the version of Dwarf Fortress that they
|
||||||
|
are named after. For example, DFHack 0.40.24-r5 only supported DF 0.40.24.
|
||||||
|
DFHack releases *never* support newer versions of DF, because DFHack requires
|
||||||
|
data about DF that is only possible to obtain after DF has been released.
|
||||||
|
Occasionally, DFHack releases will be able to maintain support for older
|
||||||
|
versions of DF - for example, DFHack 0.34.11-r5 supported both DF 0.34.11 and
|
||||||
|
0.34.10. For maximum stability, you should usually use the latest versions of
|
||||||
|
both DF and DFHack.
|
||||||
|
|
||||||
|
Windows
|
||||||
|
-------
|
||||||
|
|
||||||
|
* DFHack only supports the SDL version of Dwarf Fortress. The "legacy" version
|
||||||
|
will *not* work with DFHack (the "small" SDL version is acceptable, however).
|
||||||
|
* Windows XP and older are *not* supported, due in part to a
|
||||||
|
`Visual C++ 2015 bug <https://stackoverflow.com/questions/32452777/visual-c-2015-express-stat-not-working-on-windows-xp>`_
|
||||||
|
|
||||||
|
The Windows build of DFHack should work under Wine on other operating systems,
|
||||||
|
although this is not tested very often. It is recommended to use the native
|
||||||
|
build for your operating system instead.
|
||||||
|
|
||||||
|
.. _installing-reqs-linux:
|
||||||
|
|
||||||
|
Linux
|
||||||
|
-----
|
||||||
|
|
||||||
|
Generally, DFHack should work on any modern Linux distribution. There are
|
||||||
|
multiple release binaries provided - as of DFHack 0.47.04-r1, there are built
|
||||||
|
with GCC 7 and GCC 4.8 (as indicated by the ``gcc`` component of their
|
||||||
|
filenames). Using the newest build that works on your system is recommended.
|
||||||
|
The GCC 4.8 build is built on Ubuntu 14.04 and targets an older glibc, so it
|
||||||
|
should work on older distributions.
|
||||||
|
|
||||||
|
In the event that none of the provided binaries work on your distribution,
|
||||||
|
you may need to `compile DFHack from source <compile>`.
|
||||||
|
|
||||||
|
macOS
|
||||||
|
-----
|
||||||
|
|
||||||
|
OS X 10.6.8 or later is required.
|
||||||
|
|
||||||
|
|
||||||
|
.. _downloading:
|
||||||
|
|
||||||
|
Downloading DFHack
|
||||||
|
==================
|
||||||
|
|
||||||
|
Stable builds of DFHack are available on `GitHub <https://github.com/dfhack/dfhack/releases>`_.
|
||||||
|
GitHub has been known to change their layout periodically, but as of July 2020,
|
||||||
|
downloads are available at the bottom of the release notes for each release, under a section
|
||||||
|
named "Assets" (which you may have to expand). The name of the file indicates
|
||||||
|
which DF version, platform, and architecture the build supports - the platform
|
||||||
|
and architecture (64-bit or 32-bit) **must** match your build of DF. The DF
|
||||||
|
version should also match your DF version - see `above <installing-df-version>`
|
||||||
|
for details. For example:
|
||||||
|
|
||||||
|
* ``dfhack-0.47.04-r1-Windows-64bit.zip`` supports 64-bit DF on Windows
|
||||||
|
* ``dfhack-0.47.04-r1-Linux-32bit-gcc-7.tar.bz2`` supports 32-bit DF on Linux
|
||||||
|
(see `installing-reqs-linux` for details on the GCC version indicator)
|
||||||
|
|
||||||
|
The `DFHack website <https://dfhack.org/builds>`_ also provides links to
|
||||||
|
unstable builds. These files have a different naming scheme, but the same
|
||||||
|
restrictions apply (e.g. a file named ``Windows64`` is for 64-bit Windows DF).
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
Do *not* download the source code from GitHub, either from the releases page
|
||||||
|
or by clicking "Download ZIP" on the repo homepage. This will give you an
|
||||||
|
incomplete copy of the DFHack source code, which will not work as-is. (If
|
||||||
|
you want to compile DFHack instead of using a pre-built release, see
|
||||||
|
`compile` for instructions.)
|
||||||
|
|
||||||
|
Installing DFHack
|
||||||
|
=================
|
||||||
|
|
||||||
|
When you `download DFHack <downloading>`, you will end up with a release archive
|
||||||
|
(a ``.zip`` file on Windows, or a ``.tar.bz2`` file on other platforms). Your
|
||||||
|
operating system should have built-in utilities capable of extracting files from
|
||||||
|
these archives.
|
||||||
|
|
||||||
|
The release archives contain several files and folders, including a ``hack``
|
||||||
|
folder, a ``dfhack-config`` folder, and a ``dfhack.init-example`` file. To
|
||||||
|
install DFHack, copy all of the files from the DFHack archive into the root DF
|
||||||
|
folder, which should already include a ``data`` folder and a ``raw`` folder,
|
||||||
|
among other things. Some packs and other redistributions of Dwarf Fortress may
|
||||||
|
place DF in another folder, so ensure that the ``hack`` folder ends up next to
|
||||||
|
the ``data`` folder.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
On Windows, installing DFHack will overwrite ``SDL.dll``. This is
|
||||||
|
intentional and necessary for DFHack to work, so be sure to choose to
|
||||||
|
overwrite ``SDL.dll`` if prompted. (If you are not prompted, you may be
|
||||||
|
installing DFHack in the wrong place.)
|
||||||
|
|
||||||
|
|
||||||
|
Uninstalling DFHack
|
||||||
|
===================
|
||||||
|
|
||||||
|
Uninstalling DFHack essentially involves reversing what you did to install
|
||||||
|
DFHack. On Windows, replace ``SDL.dll`` with ``SDLreal.dll`` first. Then, you
|
||||||
|
can remove any files that were part of the DFHack archive. DFHack does not
|
||||||
|
currently maintain a list of these files, so if you want to completely remove
|
||||||
|
them, you should consult the DFHack archive that you installed for a full list.
|
||||||
|
Generally, any files left behind should not negatively affect DF.
|
||||||
|
|
||||||
|
|
||||||
|
Upgrading DFHack
|
||||||
|
================
|
||||||
|
|
||||||
|
The recommended approach to upgrade DFHack is to uninstall DFHack first, then
|
||||||
|
install the new version. This will ensure that any files that are only part
|
||||||
|
of the older DFHack installation do not affect the new DFHack installation
|
||||||
|
(although this is unlikely to occur).
|
||||||
|
|
||||||
|
It is also possible to overwrite an existing DFHack installation in-place.
|
||||||
|
To do this, follow the installation instructions above, but overwrite all files
|
||||||
|
that exist in the new DFHack archive (on Windows, this includes ``SDL.dll`` again).
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
You may wish to make a backup of your ``dfhack-config`` folder first if you
|
||||||
|
have made changes to it. Some archive managers (e.g. Archive Utility on macOS)
|
||||||
|
will overwrite the entire folder, removing any files that you have added.
|
||||||
|
|
||||||
|
|
||||||
|
Pre-packaged DFHack installations
|
||||||
|
=================================
|
||||||
|
|
||||||
|
There are :wiki:`several packs available <Utility:Lazy_Newb_Pack>` that include
|
||||||
|
DF, DFHack, and other utilities. If you are new to Dwarf Fortress and DFHack,
|
||||||
|
these may be easier to set up. Note that these packs are not maintained by the
|
||||||
|
DFHack team and vary in their release schedules and contents. Some may make
|
||||||
|
significant configuration changes, and some may not include DFHack at all.
|
@ -0,0 +1,233 @@
|
|||||||
|
.. _remote:
|
||||||
|
|
||||||
|
=======================
|
||||||
|
DFHack Remote Interface
|
||||||
|
=======================
|
||||||
|
|
||||||
|
DFHack provides a remote access interface that external tools can connect to and
|
||||||
|
use to interact with DF. This is implemented with `Google protobuf`_ messages
|
||||||
|
exchanged over a TCP socket. Both the core and plugins can define
|
||||||
|
remotely-accessible methods, or **RPC methods**. The RPC methods currently
|
||||||
|
available are not comprehensive, but can be extended with plugins.
|
||||||
|
|
||||||
|
.. _Google protobuf: https://developers.google.com/protocol-buffers
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:local:
|
||||||
|
|
||||||
|
|
||||||
|
.. _remote-server-config:
|
||||||
|
|
||||||
|
Server configuration
|
||||||
|
====================
|
||||||
|
|
||||||
|
DFHack attempts to start a TCP server to listen for remote connections on
|
||||||
|
startup. If this fails (due to the port being in use, for example), an error
|
||||||
|
message will be logged to stderr.log.
|
||||||
|
|
||||||
|
The server can be configured by setting options in ``dfhack-config/remote-server.json``:
|
||||||
|
|
||||||
|
- ``allow_remote`` (default: ``false``): if true, allows connections from hosts
|
||||||
|
other than the local machine. This is insecure and may allow arbitrary code
|
||||||
|
execution on your machine, so it is disabled by default.
|
||||||
|
- ``port`` (default: ``5000``): the port that the remote server listens on.
|
||||||
|
Overriding this will allow the server to work if you have multiple instances
|
||||||
|
of DF running, or if you have something else running on port 5000. Note that
|
||||||
|
the ``DFHACK_PORT`` `environment variable <env-vars>` takes precedence over
|
||||||
|
this setting and may be more useful for overriding the port temporarily.
|
||||||
|
|
||||||
|
|
||||||
|
Developing with the remote API
|
||||||
|
==============================
|
||||||
|
|
||||||
|
At a high level, the core and plugins define RPC methods, and external clients
|
||||||
|
can call these methods. Each method is assigned an ID internally, which clients
|
||||||
|
use to call it. These method IDs can be obtained using the special ``BindMethod``
|
||||||
|
method, which has an ID of 0.
|
||||||
|
|
||||||
|
Examples
|
||||||
|
--------
|
||||||
|
|
||||||
|
The `dfhack-run` command uses the RPC interface to invoke DFHack commands
|
||||||
|
(or Lua functions) externally.
|
||||||
|
|
||||||
|
Plugins that implement RPC methods include:
|
||||||
|
|
||||||
|
- `rename`
|
||||||
|
- `remotefortressreader`
|
||||||
|
- `isoworldremote`
|
||||||
|
|
||||||
|
Plugins that use the RPC API include:
|
||||||
|
|
||||||
|
- `stonesense`
|
||||||
|
|
||||||
|
Third-party tools that use the RPC API include:
|
||||||
|
|
||||||
|
- `Armok Vision <https://github.com/RosaryMala/armok-vision>`_ (:forums:`Bay12 forums thread <146473>`)
|
||||||
|
|
||||||
|
Client libraries
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Some external libraries are available for interacting with the remote interface
|
||||||
|
from other (non-C++) languages, including:
|
||||||
|
|
||||||
|
- `RemoteClientDF-Net <https://github.com/RosaryMala/RemoteClientDF-Net>`_ for C#
|
||||||
|
- `dfhackrpc <https://github.com/BenLubar/dfhackrpc>`_ for Go
|
||||||
|
- `dfhack-remote <https://github.com/alexchandel/dfhack-remote>`_ for JavaScript
|
||||||
|
|
||||||
|
|
||||||
|
Protocol description
|
||||||
|
====================
|
||||||
|
|
||||||
|
This is a low-level description of the RPC protocol, which may be useful when
|
||||||
|
developing custom clients.
|
||||||
|
|
||||||
|
A WireShark dissector for this protocol is available in the
|
||||||
|
`df_misc repo <https://github.com/DFHack/df_misc/blob/master/wireshark_dfhack_rpc.lua>`_.
|
||||||
|
|
||||||
|
|
||||||
|
Built-in messages
|
||||||
|
-----------------
|
||||||
|
These messages have hardcoded IDs; all others must be obtained through ``BindMethod``.
|
||||||
|
|
||||||
|
=== ============ =============================== =======================
|
||||||
|
ID Method Input Output
|
||||||
|
=== ============ =============================== =======================
|
||||||
|
0 BindMethod dfproto.CoreBindRequest dfproto.CoreBindReply
|
||||||
|
1 RunCommand dfproto.CoreRunCommandRequest dfproto.EmptyMessage
|
||||||
|
=== ============ =============================== =======================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Conversation flow
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
* Client → Server: `handshake request`_
|
||||||
|
* Server → Client: `handshake reply`_
|
||||||
|
* Repeated 0 or more times:
|
||||||
|
* Client → Server: `request`_
|
||||||
|
* Server → Client: `text`_ (0 or more times)
|
||||||
|
* Server → Client: `result`_ or `failure`_
|
||||||
|
* Client → Server: `quit`_
|
||||||
|
|
||||||
|
Raw message types
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
* All numbers are little-endian
|
||||||
|
* All strings are ASCII
|
||||||
|
* A payload size of greater than 64MiB is an error
|
||||||
|
* See ``RemoteClient.h`` for definitions of constants starting with ``RPC``
|
||||||
|
|
||||||
|
handshake request
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. csv-table::
|
||||||
|
:align: left
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
Type, Name, Value
|
||||||
|
char[8], magic, ``DFHack?\n``
|
||||||
|
int32_t, version, 1
|
||||||
|
|
||||||
|
handshake reply
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. csv-table::
|
||||||
|
:align: left
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
Type, Name, Value
|
||||||
|
char[8], magic, ``DFHack!\n``
|
||||||
|
int32_t, version, 1
|
||||||
|
|
||||||
|
header
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
|
**Note:** the two fields of this message are sometimes repurposed. Uses of this
|
||||||
|
message are represented as ``header(x, y)``, where ``x`` corresponds to the ``id``
|
||||||
|
field and ``y`` corresponds to ``size``.
|
||||||
|
|
||||||
|
.. csv-table::
|
||||||
|
:align: left
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
Type, Name
|
||||||
|
int16_t, id
|
||||||
|
int16_t, (padding - unused)
|
||||||
|
int32_t, size
|
||||||
|
|
||||||
|
request
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:align: left
|
||||||
|
:header-rows: 1
|
||||||
|
:widths: 25 75
|
||||||
|
|
||||||
|
* - Type
|
||||||
|
- Description
|
||||||
|
* - `header`_
|
||||||
|
- ``header(id, size)``
|
||||||
|
* - buffer
|
||||||
|
- Protobuf-encoded payload of the input message type of the method specified by ``id``; length of ``size`` bytes
|
||||||
|
|
||||||
|
text
|
||||||
|
~~~~
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:align: left
|
||||||
|
:header-rows: 1
|
||||||
|
:widths: 25 75
|
||||||
|
|
||||||
|
* - Type
|
||||||
|
- Description
|
||||||
|
* - `header`_
|
||||||
|
- ``header(RPC_REPLY_TEXT, size)``
|
||||||
|
* - buffer
|
||||||
|
- Protobuf-encoded payload of type ``dfproto.CoreTextNotification``; length of ``size`` bytes
|
||||||
|
|
||||||
|
result
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:align: left
|
||||||
|
:header-rows: 1
|
||||||
|
:widths: 25 75
|
||||||
|
|
||||||
|
* - Type
|
||||||
|
- Description
|
||||||
|
* - `header`_
|
||||||
|
- ``header(RPC_REPLY_RESULT, size)``
|
||||||
|
* - buffer
|
||||||
|
- Protobuf-encoded payload of the output message type of the oldest incomplete method call; when received,
|
||||||
|
that method call is considered completed. Length of ``size`` bytes.
|
||||||
|
|
||||||
|
failure
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:align: left
|
||||||
|
:header-rows: 1
|
||||||
|
:widths: 25 75
|
||||||
|
|
||||||
|
* - Type
|
||||||
|
- Description
|
||||||
|
* - `header`_
|
||||||
|
- ``header(RPC_REPLY_FAIL, command_result)``
|
||||||
|
* - command_result
|
||||||
|
- return code of the command (a constant starting with ``CR_``; see ``RemoteClient.h``)
|
||||||
|
|
||||||
|
quit
|
||||||
|
~~~~
|
||||||
|
|
||||||
|
**Note:** the server closes the connection after receiving this message.
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:align: left
|
||||||
|
:header-rows: 1
|
||||||
|
:widths: 25 75
|
||||||
|
|
||||||
|
* - Type
|
||||||
|
- Description
|
||||||
|
* - `header`_
|
||||||
|
- ``header(RPC_REQUEST_QUIT, 0)``
|
@ -1 +1 @@
|
|||||||
Subproject commit bdab71c99a0a7cc268ca517a0cd3f0a5fb41042a
|
Subproject commit 87e6cf02b914daf6f7811d967db6fadc7ca115fe
|
@ -1 +1 @@
|
|||||||
Subproject commit af749e7086739a058cd5095a6ee1a60d7e795a7c
|
Subproject commit a5e385bb2a3c72f878be614cb0cc004aafa17f79
|
Loading…
Reference in New Issue