Merge branch 'develop' into cmake-ctest

develop
Myk 2022-11-12 11:50:33 -08:00 committed by GitHub
commit afe85137c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
461 changed files with 19958 additions and 15109 deletions

@ -17,8 +17,8 @@ jobs:
plugins:
- default
include:
- os: ubuntu-20.04
gcc: 11
- os: ubuntu-22.04
gcc: 12
plugins: all
steps:
- name: Set up Python 3
@ -29,6 +29,7 @@ jobs:
run: |
sudo apt-get update
sudo apt-get install \
ccache \
libgtk2.0-0 \
libncursesw5 \
libsdl-image1.2-dev \
@ -55,15 +56,24 @@ jobs:
echo "::set-output name=df_version::${DF_VERSION}"
echo "DF_VERSION=${DF_VERSION}" >> $GITHUB_ENV
echo "DF_FOLDER=${HOME}/DF/${DF_VERSION}/df_linux" >> $GITHUB_ENV
echo "CCACHE_DIR=${HOME}/.ccache" >> $GITHUB_ENV
- name: Fetch DF cache
uses: actions/cache@v2
with:
path: ~/DF
key: ${{ steps.env_setup.outputs.df_version }}
key: dfcache-${{ steps.env_setup.outputs.df_version }}-${{ hashFiles('ci/download-df.sh') }}
- name: Fetch ccache
uses: actions/cache@v2
with:
path: ~/.ccache
key: ccache-v2-${{ matrix.os }}-gcc-${{ matrix.gcc }}-${{ github.ref_name }}-${{ github.sha }}
restore-keys: |
ccache-v2-${{ matrix.os }}-gcc-${{ matrix.gcc }}-${{ github.ref_name }}
ccache-v2-${{ matrix.os }}-gcc-${{ matrix.gcc }}
- name: Download DF
run: |
sh ci/download-df.sh
- name: Build DFHack
- name: Configure DFHack
env:
CC: gcc-${{ matrix.gcc }}
CXX: g++-${{ matrix.gcc }}
@ -76,16 +86,21 @@ jobs:
-DBUILD_TESTS:BOOL=ON \
-DBUILD_DEV_PLUGINS:BOOL=${{ matrix.plugins == 'all' }} \
-DBUILD_SIZECHECK:BOOL=${{ matrix.plugins == 'all' }} \
-DBUILD_SKELETON:BOOL=${{ matrix.plugins == 'all' }} \
-DBUILD_STONESENSE:BOOL=${{ matrix.plugins == 'all' }} \
-DBUILD_SUPPORTED:BOOL=1 \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DCMAKE_INSTALL_PREFIX="$DF_FOLDER"
- name: Build DFHack
run: |
ninja -C build-ci install
ccache --show-stats
- name: Run tests
id: run_tests
run: |
export TERM=dumb
status=0
mv "$DF_FOLDER"/dfhack.init-example "$DF_FOLDER"/dfhack.init
script -qe -c "python ci/run-tests.py --headless --keep-status \"$DF_FOLDER\"" || status=$((status + 1))
python ci/check-rpc.py "$DF_FOLDER/dfhack-rpc.txt" || status=$((status + 2))
mkdir -p artifacts
@ -114,14 +129,14 @@ jobs:
python-version: 3
- name: Install dependencies
run: |
pip install 'sphinx<4.4.0'
pip install 'sphinx'
- name: Clone DFHack
uses: actions/checkout@v1
with:
submodules: true
- name: Build docs
run: |
sphinx-build -W --keep-going -j3 . docs/html
sphinx-build -W --keep-going -j auto --color . docs/html
- name: Upload docs
uses: actions/upload-artifact@v1
with:

8
.gitignore vendored

@ -15,9 +15,14 @@ build/VC2010
!build/
# Sphinx generated documentation
docs/_*
docs/changelogs/
docs/html/
docs/pdf/
docs/pseudoxml/
docs/tags/
docs/text/
docs/tools/
docs/xml/
# in-place build
build/Makefile
@ -74,5 +79,4 @@ tags
.idea
# external plugins
/plugins/external/
/plugins/CMakeLists.custom.txt

@ -1,9 +1,10 @@
ci:
autofix_prs: false
autoupdate_schedule: monthly
repos:
# shared across repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.2.0
rev: v4.3.0
hooks:
- id: check-added-large-files
- id: check-case-conflict
@ -19,11 +20,11 @@ repos:
args: ['--fix=lf']
- id: trailing-whitespace
- repo: https://github.com/python-jsonschema/check-jsonschema
rev: 0.14.3
rev: 0.18.4
hooks:
- id: check-github-workflows
- repo: https://github.com/Lucas-C/pre-commit-hooks
rev: v1.1.13
rev: v1.3.1
hooks:
- id: forbid-tabs
exclude_types:
@ -32,4 +33,12 @@ repos:
exclude_types:
- json
# specific to dfhack:
exclude: '^(depends/|data/examples/.*\.json$|.*\.diff$)'
- repo: local
hooks:
- id: authors-rst
name: Check Authors.rst
language: python
entry: python3 ci/authors-rst.py
files: docs/Authors\.rst
pass_filenames: false
exclude: '^(depends/|data/.*\.json$|.*\.diff$)'

@ -0,0 +1,22 @@
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
version: 2
build:
os: ubuntu-20.04
tools:
python: "3"
submodules:
include: all
sphinx:
configuration: conf.py
formats: all
python:
install:
- requirements: .readthedocs.requirements.txt

@ -1,7 +1,7 @@
# main project file. use it from a build sub-folder, see COMPILE for details
## some generic CMake magic
cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
cmake_minimum_required(VERSION 3.6 FATAL_ERROR)
cmake_policy(SET CMP0048 NEW)
project(dfhack)
@ -192,7 +192,7 @@ endif()
# set up versioning.
set(DF_VERSION "0.47.05")
set(DFHACK_RELEASE "r4")
set(DFHACK_RELEASE "r7")
set(DFHACK_PRERELEASE FALSE)
set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}")
@ -206,11 +206,9 @@ set(DFHACK_BUILD_ID "" CACHE STRING "Build ID (should be specified on command li
if(UNIX)
# put the lib into DF/hack
set(DFHACK_LIBRARY_DESTINATION hack)
set(DFHACK_EGGY_DESTINATION libs)
else()
# windows is crap, therefore we can't do nice things with it. leave the libs on a nasty pile...
set(DFHACK_LIBRARY_DESTINATION .)
set(DFHACK_EGGY_DESTINATION .)
endif()
# external tools will be installed here:
@ -444,43 +442,67 @@ endif()
add_subdirectory(data)
add_subdirectory(scripts)
find_package(Sphinx QUIET)
if(BUILD_DOCS)
find_package(Python3)
find_package(Sphinx)
if(NOT SPHINX_FOUND)
message(SEND_ERROR "Sphinx not found but BUILD_DOCS enabled")
endif()
file(GLOB SPHINX_DEPS
"${CMAKE_CURRENT_SOURCE_DIR}/docs/*.rst"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/guides/*.rst"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/changelog.txt"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/gen_changelog.py"
file(GLOB SPHINX_GLOB_DEPS
LIST_DIRECTORIES false
"${CMAKE_CURRENT_SOURCE_DIR}/docs/images/*.png"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/styles/*"
"${CMAKE_CURRENT_SOURCE_DIR}/conf.py"
"${CMAKE_CURRENT_SOURCE_DIR}/scripts/about.txt"
"${CMAKE_CURRENT_SOURCE_DIR}/scripts/*/about.txt"
"${CMAKE_CURRENT_SOURCE_DIR}/data/init/*init"
)
file(GLOB_RECURSE SPHINX_GLOB_RECURSE_DEPS
"${CMAKE_CURRENT_SOURCE_DIR}/*.rst"
"${CMAKE_CURRENT_SOURCE_DIR}/changelog.txt"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/*py"
)
list(FILTER SPHINX_GLOB_RECURSE_DEPS
EXCLUDE REGEX "docs/changelogs"
)
list(FILTER SPHINX_GLOB_RECURSE_DEPS
EXCLUDE REGEX "docs/html"
)
file(GLOB_RECURSE SPHINX_SCRIPT_DEPS
"${CMAKE_CURRENT_SOURCE_DIR}/scripts/*.lua"
"${CMAKE_CURRENT_SOURCE_DIR}/scripts/*.rb"
list(FILTER SPHINX_GLOB_RECURSE_DEPS
EXCLUDE REGEX "docs/tags"
)
set(SPHINX_DEPS ${SPHINX_DEPS} ${SPHINX_SCRIPT_DEPS}
"${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.rst"
list(FILTER SPHINX_GLOB_RECURSE_DEPS
EXCLUDE REGEX "docs/text"
)
list(FILTER SPHINX_GLOB_RECURSE_DEPS
EXCLUDE REGEX "docs/tools"
)
set(SPHINX_DEPS ${SPHINX_GLOB_DEPS} ${SPHINX_GLOB_RECURSE_DEPS} ${SPHINX_SCRIPT_DEPS}
"${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt"
"${CMAKE_CURRENT_SOURCE_DIR}/conf.py"
)
set(SPHINX_OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/docs/html/.buildinfo")
set_source_files_properties(${SPHINX_OUTPUT} PROPERTIES GENERATED TRUE)
set_property(
DIRECTORY PROPERTY ADDITIONAL_CLEAN_FILES TRUE
"${CMAKE_CURRENT_SOURCE_DIR}/docs/changelogs"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/html"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/pdf"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/pseudoxml"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/tags"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/text"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/tools"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/xml"
"${CMAKE_BINARY_DIR}/docs/html"
"${CMAKE_BINARY_DIR}/docs/pdf"
"${CMAKE_BINARY_DIR}/docs/pseudoxml"
"${CMAKE_BINARY_DIR}/docs/text"
"${CMAKE_BINARY_DIR}/docs/xml"
)
add_custom_command(OUTPUT ${SPHINX_OUTPUT}
COMMAND ${SPHINX_EXECUTABLE}
-a -E -q -b html
"${CMAKE_CURRENT_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/html"
-w "${CMAKE_CURRENT_SOURCE_DIR}/docs/_sphinx-warnings.txt"
-j 2
COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/docs/build.py"
html text --sphinx="${SPHINX_EXECUTABLE}" -- -q
DEPENDS ${SPHINX_DEPS}
COMMENT "Building HTML documentation with Sphinx"
COMMENT "Building documentation with Sphinx"
)
add_custom_target(dfhack_docs ALL
@ -492,8 +514,12 @@ if(BUILD_DOCS)
COMMAND ${CMAKE_COMMAND} -E touch ${SPHINX_OUTPUT})
install(DIRECTORY ${dfhack_SOURCE_DIR}/docs/html/
DESTINATION ${DFHACK_USERDOC_DESTINATION}/docs
FILES_MATCHING PATTERN "*"
PATTERN html/_sources EXCLUDE)
install(DIRECTORY ${dfhack_SOURCE_DIR}/docs/text/
DESTINATION ${DFHACK_USERDOC_DESTINATION}/docs)
install(FILES docs/_auto/news.rst docs/_auto/news-dev.rst DESTINATION ${DFHACK_USERDOC_DESTINATION})
install(FILES docs/changelogs/news.rst docs/changelogs/news-dev.rst DESTINATION ${DFHACK_USERDOC_DESTINATION})
install(FILES "README.html" DESTINATION "${DFHACK_DATA_DESTINATION}")
endif()

@ -8,9 +8,9 @@
DFHack is a Dwarf Fortress memory access library, distributed with scripts
and plugins implementing a wide variety of useful functions and tools.
The full documentation [is available online here](https://dfhack.readthedocs.org),
from the README.html page in the DFHack distribution, or as raw text in the `./docs` folder.
The full documentation [is available online here](https://dfhack.readthedocs.org).
It is also accessible via the README.html page in the DFHack distribution or as raw text in the `./docs` folder.
If you're an end-user, modder, or interested in contributing to DFHack -
go read those docs.
If that's unclear, or you need more help checkout our [support page](https://docs.dfhack.org/en/latest/docs/Support.html) for up-to-date options.
If the docs are unclear or you need more help, please check out our [support page](https://docs.dfhack.org/en/latest/docs/Support.html) for ways to contact the DFHack developers.

@ -2,10 +2,8 @@
set -e
tardest="df.tar.bz2"
selfmd5=$(openssl md5 < "$0")
echo $selfmd5
df_tardest="df.tar.bz2"
save_tardest="test_save.tgz"
cd "$(dirname "$0")"
echo "DF_VERSION: $DF_VERSION"
@ -14,43 +12,41 @@ mkdir -p "$DF_FOLDER"
# back out of df_linux
cd "$DF_FOLDER/.."
if [ -f receipt ]; then
if [ "$selfmd5" != "$(cat receipt)" ]; then
echo "download-df.sh changed; removing DF"
rm receipt
else
echo "Already downloaded $DF_VERSION"
fi
fi
if [ ! -f receipt ]; then
rm -f "$tardest"
if ! test -f "$df_tardest"; then
minor=$(echo "$DF_VERSION" | cut -d. -f2)
patch=$(echo "$DF_VERSION" | cut -d. -f3)
url="http://www.bay12games.com/dwarves/df_${minor}_${patch}_linux.tar.bz2"
echo Downloading
echo "Downloading DF $DF_VERSION"
while read url; do
echo "Attempting download: ${url}"
if wget -v "$url" -O "$tardest"; then
if wget -v "$url" -O "$df_tardest"; then
break
fi
done <<URLS
https://www.bay12games.com/dwarves/df_${minor}_${patch}_linux.tar.bz2
https://files.dfhack.org/DF/0.${minor}.${patch}/df_${minor}_${patch}_linux.tar.bz2
URLS
echo $tardest
if ! test -f "$tardest"; then
echo "DF failed to download: $tardest not found"
echo $df_tardest
if ! test -f "$df_tardest"; then
echo "DF failed to download: $df_tardest not found"
exit 1
fi
echo "Downloading test save"
#test_save_url="https://files.dfhack.org/DF/0.${minor}.${patch}/test_save.tgz"
test_save_url="https://drive.google.com/uc?export=download&id=1XvYngl-DFONiZ9SD9OC4B2Ooecu8rPFz"
if ! wget -v "$test_save_url" -O "$save_tardest"; then
echo "failed to download test save"
exit 1
fi
echo $save_tardest
fi
rm -rf df_linux
mkdir df_linux
mkdir -p df_linux/data/save
echo Extracting
tar xf "$tardest" --strip-components=1 -C df_linux
tar xf "$df_tardest" --strip-components=1 -C df_linux
tar xf "$save_tardest" -C df_linux/data/save
echo Done
echo "$selfmd5" > receipt
ls
ls -l

@ -68,12 +68,21 @@ init_contents = change_setting(init_contents, 'FPS', 'YES')
if args.headless:
init_contents = change_setting(init_contents, 'PRINT_MODE', 'TEXT')
test_init_file = 'dfhackzzz_test.init' # Core sorts these alphabetically
init_path = 'dfhack-config/init'
if not os.path.isdir('hack/init'):
# we're on an old branch that still reads init files from the root dir
init_path = '.'
try:
os.mkdir(init_path)
except OSError as error:
# ignore already exists errors
pass
test_init_file = os.path.join(init_path, 'dfhackzzz_test.init') # Core sorts these alphabetically
with open(test_init_file, 'w') as f:
f.write('''
devel/dump-rpc dfhack-rpc.txt
:lua dfhack.internal.addScriptPath(dfhack.getHackPath())
test --resume --modes=none,title "lua scr.breakdown_level=df.interface_breakdown_types.%s"
test --resume -- lua scr.breakdown_level=df.interface_breakdown_types.%s
''' % ('NONE' if args.no_quit else 'QUIT'))
test_config_file = 'test_config.json'

@ -1,12 +1,13 @@
#!/usr/bin/env python3
import os
from os.path import basename, dirname, join, splitext
from os.path import basename, dirname, exists, join, splitext
import sys
SCRIPT_PATH = sys.argv[1] if len(sys.argv) > 1 else 'scripts'
DOCS_PATH = join(SCRIPT_PATH, 'docs')
IS_GITHUB_ACTIONS = bool(os.environ.get('GITHUB_ACTIONS'))
def expected_cmd(path):
def get_cmd(path):
"""Get the command from the name of a script."""
dname, fname = basename(dirname(path)), splitext(basename(path))[0]
if dname in ('devel', 'fix', 'gui', 'modtools'):
@ -14,16 +15,6 @@ def expected_cmd(path):
return fname
def check_ls(fname, line):
"""Check length & existence of leading comment for "ls" builtin command."""
line = line.strip()
comment = '--' if fname.endswith('.lua') else '#'
if '[====[' in line or not line.startswith(comment):
print_error('missing leading comment (requred for `ls`)', fname)
return 1
return 0
def print_error(message, filename, line=None):
if not isinstance(line, int):
line = 1
@ -32,48 +23,42 @@ def print_error(message, filename, line=None):
print('::error file=%s,line=%i::%s' % (filename, line, message))
def check_ls(docfile, lines):
"""Check length & existence of first sentence for "ls" builtin command."""
# TODO
return 0
def check_file(fname):
errors, doclines = 0, []
tok1, tok2 = ('=begin', '=end') if fname.endswith('.rb') else \
('[====[', ']====]')
doc_start_line = None
with open(fname, errors='ignore') as f:
errors, doc_start_line = 0, None
docfile = join(DOCS_PATH, get_cmd(fname)+'.rst')
if not exists(docfile):
print_error('missing documentation file: {!r}'.format(docfile), fname)
return 1
with open(docfile, errors='ignore') as f:
lines = f.readlines()
if not lines:
print_error('empty file', fname)
print_error('empty documentation file', docfile)
return 1
errors += check_ls(fname, lines[0])
for i, l in enumerate(lines):
if doclines or l.strip().endswith(tok1):
if not doclines:
doc_start_line = i + 1
doclines.append(l.rstrip())
if l.startswith(tok2):
break
else:
if doclines:
print_error('docs start but do not end', fname, doc_start_line)
else:
print_error('no documentation found', fname)
return 1
if not doclines:
print_error('missing or malformed documentation', fname)
return 1
l = l.strip()
if l and not doc_start_line and doc_start_line != 0:
doc_start_line = i
doc_end_line = i
lines[i] = l
title, underline = [d for d in doclines
if d and '=begin' not in d and '[====[' not in d][:2]
title_line = doc_start_line + doclines.index(title)
errors += check_ls(docfile, lines)
title, underline = lines[doc_start_line:doc_start_line+2]
expected_underline = '=' * len(title)
if underline != expected_underline:
print_error('title/underline mismatch: expected {!r}, got {!r}'.format(
expected_underline, underline),
fname, title_line + 1)
docfile, doc_start_line+1)
errors += 1
if title != expected_cmd(fname):
if title != get_cmd(fname):
print_error('expected script title {!r}, got {!r}'.format(
expected_cmd(fname), title),
fname, title_line)
get_cmd(fname), title),
docfile, doc_start_line)
errors += 1
return errors
@ -81,11 +66,11 @@ def check_file(fname):
def main():
"""Check that all DFHack scripts include documentation"""
err = 0
exclude = set(['internal', 'test'])
exclude = {'.git', 'internal', 'test'}
for root, dirs, files in os.walk(SCRIPT_PATH, topdown=True):
dirs[:] = [d for d in dirs if d not in exclude]
for f in files:
if f[-3:] in {'.rb', 'lua'}:
if f.split('.')[-1] in {'rb', 'lua'}:
err += check_file(join(root, f))
return err

@ -240,7 +240,7 @@ end
-- output doesn't trigger its own dfhack.printerr usage detection (see
-- detect_printerr below)
local orig_printerr = dfhack.printerr
local function wrap_expect(func, private)
local function wrap_expect(func, private, path)
return function(...)
private.checks = private.checks + 1
local ret = {func(...)}
@ -269,7 +269,7 @@ local function wrap_expect(func, private)
end
-- Skip any frames corresponding to C calls, or Lua functions defined in another file
-- these could include pcall(), with_finalize(), etc.
if info.what == 'Lua' and info.short_src == caller_src then
if info.what == 'Lua' and (info.short_src == caller_src or info.short_src == path) then
orig_printerr((' at %s:%d'):format(info.short_src, info.currentline))
end
frame = frame + 1
@ -278,7 +278,7 @@ local function wrap_expect(func, private)
end
end
local function build_test_env()
local function build_test_env(path)
local env = {
test = utils.OrderedTable(),
-- config values can be overridden in the test file to define
@ -309,7 +309,7 @@ local function build_test_env()
checks_ok = 0,
}
for name, func in pairs(expect) do
env.expect[name] = wrap_expect(func, private)
env.expect[name] = wrap_expect(func, private, path)
end
setmetatable(env, {__index = _G})
return env, private
@ -345,9 +345,9 @@ local function finish_tests(done_command)
end
local function load_tests(file, tests)
local short_filename = file:sub((file:find('test') or -4)+5, -1)
local short_filename = file:sub((file:find('test') or -4) + 5, -1)
print('Loading file: ' .. short_filename)
local env, env_private = build_test_env()
local env, env_private = build_test_env(file)
local code, err = loadfile(file, 't', env)
if not code then
dfhack.printerr('Failed to load file: ' .. tostring(err))

@ -1,7 +1,9 @@
library/xml master
scripts master
plugins/stonesense master
plugins/isoworld dfhack
depends/libzip dfhack
depends/libexpat dfhack
depends/xlsxio dfhack
depends/luacov dfhack
depends/jsoncpp-sub dfhack

@ -15,178 +15,81 @@ serve to show the default.
# pylint:disable=redefined-builtin
import datetime
from io import open
import os
import re
import shlex # pylint:disable=unused-import
import sphinx
import sys
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'docs', 'sphinx_extensions'))
from dfhack.util import write_file_if_changed
# -- Support :dfhack-keybind:`command` ------------------------------------
# this is a custom directive that pulls info from dfhack.init-example
if os.environ.get('DFHACK_DOCS_BUILD_OFFLINE'):
# block attempted image downloads, particularly for the PDF builder
def request_disabled(*args, **kwargs):
raise RuntimeError('Offline build - network request blocked')
from docutils import nodes
from docutils.parsers.rst import roles
import urllib3.util
urllib3.util.create_connection = request_disabled
import urllib3.connection
urllib3.connection.HTTPConnection.connect = request_disabled
def get_keybinds():
"""Get the implemented keybinds, and return a dict of
{tool: [(full_command, keybinding, context), ...]}.
"""
with open('dfhack.init-example') as f:
lines = [l.replace('keybinding add', '').strip() for l in f.readlines()
if l.startswith('keybinding add')]
keybindings = dict()
for k in lines:
first, command = k.split(' ', 1)
bind, context = (first.split('@') + [''])[:2]
if ' ' not in command:
command = command.replace('"', '')
tool = command.split(' ')[0].replace('"', '')
keybindings[tool] = keybindings.get(tool, []) + [
(command, bind.split('-'), context)]
return keybindings
KEYBINDS = get_keybinds()
# pylint:disable=unused-argument,dangerous-default-value,too-many-arguments
def dfhack_keybind_role_func(role, rawtext, text, lineno, inliner,
options={}, content=[]):
"""Custom role parser for DFHack default keybinds."""
roles.set_classes(options)
if text not in KEYBINDS:
msg = inliner.reporter.error(
'no keybinding for {} in dfhack.init-example'.format(text),
line=lineno)
prb = inliner.problematic(rawtext, rawtext, msg)
return [prb], [msg]
newnode = nodes.paragraph()
for cmd, key, ctx in KEYBINDS[text]:
n = nodes.paragraph()
newnode += n
n += nodes.strong('Keybinding: ', 'Keybinding: ')
for k in key:
n += nodes.inline(k, k, classes=['kbd'])
if cmd != text:
n += nodes.inline(' -> ', ' -> ')
n += nodes.literal(cmd, cmd, classes=['guilabel'])
if ctx:
n += nodes.inline(' in ', ' in ')
n += nodes.literal(ctx, ctx)
return [newnode], []
roles.register_canonical_role('dfhack-keybind', dfhack_keybind_role_func)
# -- Autodoc for DFhack scripts -------------------------------------------
def doc_dir(dirname, files):
"""Yield (command, includepath) for each script in the directory."""
import requests
requests.request = request_disabled
requests.get = request_disabled
# -- Autodoc for DFhack plugins and scripts -------------------------------
def doc_dir(dirname, files, prefix):
"""Yield (name, includepath) for each file in the directory."""
sdir = os.path.relpath(dirname, '.').replace('\\', '/').replace('../', '')
if prefix == '.':
prefix = ''
else:
prefix += '/'
for f in files:
if f[-3:] not in ('lua', '.rb'):
if f[-4:] != '.rst':
continue
with open(os.path.join(dirname, f), 'r', encoding='utf8') as fstream:
text = [l.rstrip() for l in fstream.readlines() if l.strip()]
# Some legacy lua files use the ruby tokens (in 3rdparty scripts)
tokens = ('=begin', '=end')
if f[-4:] == '.lua' and any('[====[' in line for line in text):
tokens = ('[====[', ']====]')
command = None
for line in text:
if command and line == len(line) * '=':
yield command, sdir + '/' + f, tokens[0], tokens[1]
break
command = line
yield prefix + f[:-4], sdir + '/' + f
def doc_all_dirs():
"""Collect the commands and paths to include in our docs."""
scripts = []
for root, _, files in os.walk('scripts'):
scripts.extend(doc_dir(root, files))
return tuple(scripts)
DOC_ALL_DIRS = doc_all_dirs()
tools = []
for root, _, files in os.walk('docs/builtins'):
tools.extend(doc_dir(root, files, os.path.relpath(root, 'docs/builtins')))
for root, _, files in os.walk('docs/plugins'):
tools.extend(doc_dir(root, files, os.path.relpath(root, 'docs/plugins')))
for root, _, files in os.walk('scripts/docs'):
tools.extend(doc_dir(root, files, os.path.relpath(root, 'scripts/docs')))
return tuple(tools)
def document_scripts():
"""Autodoc for files with the magic script documentation marker strings.
Returns a dict of script-kinds to lists of .rst include directives.
"""
# Next we split by type and create include directives sorted by command
kinds = {'base': [], 'devel': [], 'fix': [], 'gui': [], 'modtools': []}
for s in DOC_ALL_DIRS:
k_fname = s[0].split('/', 1)
if len(k_fname) == 1:
kinds['base'].append(s)
else:
kinds[k_fname[0]].append(s)
def template(arg):
tmp = '.. _{}:\n\n.. include:: /{}\n' +\
' :start-after: {}\n :end-before: {}\n'
if arg[0] in KEYBINDS:
tmp += '\n:dfhack-keybind:`{}`\n'.format(arg[0])
return tmp.format(*arg)
return {key: '\n\n'.join(map(template, sorted(value)))
for key, value in kinds.items()}
def write_script_docs():
def write_tool_docs():
"""
Creates a file for eack kind of script (base/devel/fix/gui/modtools)
with all the ".. include::" directives to pull out docs between the
magic strings.
Creates a file for each tool with the ".. include::" directives to pull in
the original documentation.
"""
kinds = document_scripts()
head = {
'base': 'Basic Scripts',
'devel': 'Development Scripts',
'fix': 'Bugfixing Scripts',
'gui': 'GUI Scripts',
'modtools': 'Scripts for Modders'}
for k in head:
title = ('.. _scripts-{k}:\n\n{l}\n{t}\n{l}\n\n'
'.. include:: /scripts/{a}about.txt\n\n'
'.. contents:: Contents\n'
' :local:\n\n').format(
k=k, t=head[k],
l=len(head[k])*'#',
a=('' if k == 'base' else k + '/')
)
mode = 'w' if sys.version_info.major > 2 else 'wb'
with open('docs/_auto/{}.rst'.format(k), mode) as outfile:
outfile.write(title)
outfile.write(kinds[k])
def all_keybinds_documented():
"""Check that all keybindings are documented with the :dfhack-keybind:
directive somewhere."""
configured_binds = set(KEYBINDS)
script_commands = set(i[0] for i in DOC_ALL_DIRS)
with open('./docs/Plugins.rst') as f:
plugin_binds = set(re.findall(':dfhack-keybind:`(.*?)`', f.read()))
undocumented_binds = configured_binds - script_commands - plugin_binds
if undocumented_binds:
raise ValueError('The following DFHack commands have undocumented '
'keybindings: {}'.format(sorted(undocumented_binds)))
# Actually call the docs generator and run test
write_script_docs()
all_keybinds_documented()
for k in doc_all_dirs():
label = ('.. _{name}:\n\n').format(name=k[0])
include = ('.. include:: /{path}\n\n').format(path=k[1])
os.makedirs(os.path.join('docs/tools', os.path.dirname(k[0])),
mode=0o755, exist_ok=True)
with write_file_if_changed('docs/tools/{}.rst'.format(k[0])) as outfile:
if k[0] != 'search':
outfile.write(label)
outfile.write(include)
# -- General configuration ------------------------------------------------
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'docs', 'sphinx_extensions'))
write_tool_docs()
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
needs_sphinx = '1.8'
needs_sphinx = '3.4.3'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
@ -195,22 +98,33 @@ extensions = [
'sphinx.ext.extlinks',
'dfhack.changelog',
'dfhack.lexer',
'dfhack.tool_docs',
]
sphinx_major_version = sphinx.version_info[0]
def get_caption_str(prefix=''):
return prefix + (sphinx_major_version >= 5 and '%s' or '')
# This config value must be a dictionary of external sites, mapping unique
# short alias names to a base URL and a prefix.
# See http://sphinx-doc.org/ext/extlinks.html
extlinks = {
'wiki': ('https://dwarffortresswiki.org/%s', ''),
'wiki': ('https://dwarffortresswiki.org/%s', get_caption_str()),
'forums': ('http://www.bay12forums.com/smf/index.php?topic=%s',
'Bay12 forums thread '),
'dffd': ('https://dffd.bay12games.com/file.php?id=%s', 'DFFD file '),
get_caption_str('Bay12 forums thread ')),
'dffd': ('https://dffd.bay12games.com/file.php?id=%s',
get_caption_str('DFFD file ')),
'bug': ('https://www.bay12games.com/dwarves/mantisbt/view.php?id=%s',
'Bug '),
'source': ('https://github.com/DFHack/dfhack/tree/develop/%s', ''),
'source-scripts': ('https://github.com/DFHack/scripts/tree/master/%s', ''),
'issue': ('https://github.com/DFHack/dfhack/issues/%s', 'Issue '),
'commit': ('https://github.com/DFHack/dfhack/commit/%s', 'Commit '),
get_caption_str('Bug ')),
'source': ('https://github.com/DFHack/dfhack/tree/develop/%s',
get_caption_str()),
'source-scripts': ('https://github.com/DFHack/scripts/tree/master/%s',
get_caption_str()),
'issue': ('https://github.com/DFHack/dfhack/issues/%s',
get_caption_str('Issue ')),
'commit': ('https://github.com/DFHack/dfhack/commit/%s',
get_caption_str('Commit ')),
}
# Add any paths that contain templates here, relative to this directory.
@ -259,7 +173,7 @@ version = release = get_version()
# 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
language = 'en'
# strftime format for |today| and 'Last updated on:' timestamp at page bottom
today_fmt = html_last_updated_fmt = '%Y-%m-%d'
@ -268,11 +182,18 @@ today_fmt = html_last_updated_fmt = '%Y-%m-%d'
# directories to ignore when looking for source files.
exclude_patterns = [
'README.md',
'docs/html*',
'depends/*',
'build*',
'docs/_auto/news*',
'docs/_changelogs/',
'depends/*',
'docs/html/*',
'docs/tags/*',
'docs/text/*',
'docs/builtins/*',
'docs/pdf/*',
'docs/plugins/*',
'docs/pseudoxml/*',
'docs/xml/*',
'scripts/docs/*',
'plugins/*',
]
# The reST default role (used for this markup: `text`) to use for all
@ -345,16 +266,20 @@ html_sidebars = {
]
}
# If false, no module index is generated.
html_domain_indices = False
# If false, no index is generated.
# generate domain indices but not the (unused) genindex
html_use_index = False
html_domain_indices = True
# don't link to rst sources in the generated pages
html_show_sourcelink = False
html_css_files = [
'dfhack.css',
]
if sphinx_major_version >= 5:
html_css_files.append('sphinx5.css')
# -- Options for LaTeX output ---------------------------------------------
# Grouping the document tree into LaTeX files. List of tuples
@ -366,3 +291,15 @@ latex_documents = [
]
latex_toplevel_sectioning = 'part'
# -- Options for text output ---------------------------------------------
from sphinx.writers import text
# this value is arbitrary. it just needs to be bigger than the number of
# characters in the longest paragraph in the DFHack docs
text.MAXWIDTH = 1000000000
# this is the order that section headers will use the characters for underlines
# they are in the order of (subjective) text-mode readability
text_sectionchars = '=-~`+"*'

@ -1,9 +1,21 @@
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/init/
DESTINATION "${DFHACK_DATA_DESTINATION}/init")
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/base_command_counts.json
DESTINATION "${DFHACK_DATA_DESTINATION}/data/base_command_counts.json")
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/quickfort/
DESTINATION "${DFHACK_DATA_DESTINATION}/data/quickfort")
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/orders/
DESTINATION dfhack-config/orders/library)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/examples/
DESTINATION "${DFHACK_DATA_DESTINATION}/examples")
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/professions/
DESTINATION dfhack-config/professions/library)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/blueprints/
DESTINATION blueprints
FILES_MATCHING PATTERN "*"

@ -0,0 +1,145 @@
{
"manipulator": 75,
"autolabor": 59,
"reveal": 51,
"help": 50,
"ls": 50,
"die": 50,
"tags": 50,
"embark-assistant": 42,
"prospect": 37,
"autodump": 36,
"clean": 35,
"gui/workflow": 28,
"workflow": 28,
"exportlegends": 26,
"gui/autobutcher": 25,
"autobutcher": 25,
"digv": 24,
"fastdwarf": 22,
"autonestbox": 20,
"showmood": 19,
"gui/liquids": 18,
"liquids": 18,
"search": 18,
"gui/quickfort": 15,
"quickfort": 15,
"createitem": 14,
"stocks": 14,
"autofarm": 12,
"autochop": 12,
"tiletypes": 12,
"exterminate": 12,
"buildingplan": 12,
"quicksave": 11,
"gui/gm-editor": 11,
"cleanowned": 10,
"gui/autogems": 9,
"autogems": 9,
"stonesense": 9,
"gui/stockpiles": 8,
"stockpiles": 8,
"changevein": 8,
"gui/teleport": 7,
"teleport": 7,
"seedwatch": 6,
"automelt": 6,
"embark-tools": 6,
"cursecheck": 5,
"open-legends": 5,
"ban-cooking": 5,
"burial": 5,
"automaterial": 5,
"remove-stress": 5,
"gui/blueprint": 5,
"blueprint": 5,
"tailor": 4,
"startdwarf": 4,
"3dveins": 4,
"digcircle": 4,
"nestboxes": 3,
"deathcause": 3,
"list-agreements": 3,
"gui/room-list": 3,
"points": 3,
"region-pops": 3,
"gui/advfort": 3,
"unsuspend": 3,
"locate-ore": 3,
"changelayer": 3,
"source": 3,
"gui/gm-unit": 3,
"combine-drinks": 3,
"combine-plants": 3,
"deteriorate": 3,
"warn-starving": 3,
"gaydar": 2,
"gui/dfstatus": 2,
"gui/rename": 2,
"rename": 2,
"fix-ster": 2,
"job-material": 2,
"stockflow": 2,
"drain-aquifer": 2,
"full-heal": 2,
"spawnunit": 2,
"flashstep": 2,
"gui/family-affairs": 2,
"caravan": 2,
"mousequery": 2,
"tweak": 2,
"confirm": 2,
"autoclothing": 1,
"autounsuspend": 1,
"prioritize": 1,
"dwarfmonitor": 1,
"show-unit-syndromes": 1,
"troubleshoot-item": 1,
"gui/mechanisms": 1,
"gui/pathable": 1,
"hotkeys": 1,
"infiniteSky": 1,
"force": 1,
"hermit": 1,
"strangemood": 1,
"weather": 1,
"add-recipe": 1,
"autotrade": 1,
"zone": 1,
"autonick": 1,
"stripcaged": 1,
"unforbid": 1,
"workorder": 1,
"gui/mod-manager": 1,
"spotclean": 1,
"plant": 1,
"regrass": 1,
"dig-now": 1,
"build-now": 1,
"clear-webs": 1,
"gui/siege-engine": 1,
"assign-skills": 1,
"brainwash": 1,
"elevate-mental": 1,
"elevate-physical": 1,
"launch": 1,
"linger": 1,
"make-legendary": 1,
"rejuvenate": 1,
"resurrect-adv": 1,
"questport": 1,
"getplants": 1,
"gui/stamper": 1,
"tweak": 1,
"fixveins": 1,
"deramp": 1,
"fix/dead-units": 1,
"fix/fat-dwarves": 1,
"fix/loyaltycascade": 1,
"fix/retrieve-units": 1,
"tweak": 1,
"sort-items": 1,
"gui/color-schemes": 1,
"color-schemes": 1,
"season-palette": 1
}

@ -5,21 +5,21 @@ Here's the procedure:
""
1) Dig a tunnel from where you want the water to end up (e.g. your well cistern) off to an unused portion of the map. Be sure to dig a one-tile-wide diagonal segment in this tunnel so water that will eventually flow through the tunnel is depressurized.
""
"2) From the end of that tunnel, dig a staircase straight up to the z-level just below the lowest aquifer level. Also dig the staircase down one z-level."
"2) From the end of that tunnel, dig a staircase straight up to the z-level just below the lowest aquifer level. Also dig the staircase down one z-level below the tunnel level."
""
"3) From the bottom of the staircase (the z-level below where the water will flow to your cisterns), dig a straight, one-tile wide tunnel to the edge of the map. Smooth the map edge tile and carve a fortification. The water can flow through the fortification and off the map, allowing the dwarves to dig out the aquifer tap without drowning."
"3) From the bottom of the staircase (the z-level below where the water will flow to your cisterns), dig a straight, one-tile wide tunnel to the edge of the map. This is your drainage tunnel. Smooth the map edge tile and carve a fortification. The water can flow through the fortification and off the map, allowing the dwarves to dig out the aquifer tap without drowning."
""
4) Place a lever-controlled floodgate in the drainage tunnel and open the floodgate.
4) Place a lever-controlled floodgate in the drainage tunnel and open the floodgate. Place the lever somewhere else in your fort so that it will remain dry and accessible.
""
"5) If you care about how nice things look, haul away any boulders and smooth the tiles. You won't be able to access any of this area once it fills up with water!"
"5) If you care about how nice things look, haul away any boulders in the tunnels and smooth the tiles. You won't be able to access any of this area once it fills up with water!"
""
"6) Apply this blueprint (quickfort run library/aquifer_tap.csv -n /dig) to the z-level above the top of the staircase, inside the lowest aquifer level. Do not unpause until after the next step."
"6) Apply this blueprint (gui/quickfort library/aquifer_tap.csv -n /dig) to the z-level above the top of the staircase, inside the lowest aquifer level. Do not unpause until after the next step."
""
"7) Damp tiles cancel dig designations if the tile is currently hidden, so to avoid having to re-apply this blueprint after every tile your dwarves dig, position the cursor straight up (north) of the left-most tile designated for digging and straight left (west) of the topmost designated tile and run the following commands in the DFHack console:"
tiletypes-command f any ; f designated 1 ; p any ; p hidden 0 ; r 23 23 1
tiletypes-here
""
"8) Unpause and dig out the tap. If you care about appearances, haul away any boulders and feel free to remove the ramps (d-z). The water will safely flow down the staircase, through the open floodgate, and off the map until you choose to close the floodgate."
"8) Unpause and dig out the tap. If you care about appearances, haul away any boulders and feel free to remove the ramps (d-z). The water will safely flow down the staircase, through the open floodgate, down the drainage tunnel, and off the map until you choose to close the floodgate."
"9) Once everything is dug out and all dwarves are out of the waterways, close the floodgate. Your cisterns will fill with water. Since the waterway to your cisterns is depressurized, the cisterns will stay forever full, but will not flood."
""

1 #notes label(help)
5
6 1) Dig a tunnel from where you want the water to end up (e.g. your well cistern) off to an unused portion of the map. Be sure to dig a one-tile-wide diagonal segment in this tunnel so water that will eventually flow through the tunnel is depressurized.
7
8 2) From the end of that tunnel, dig a staircase straight up to the z-level just below the lowest aquifer level. Also dig the staircase down one z-level. 2) From the end of that tunnel, dig a staircase straight up to the z-level just below the lowest aquifer level. Also dig the staircase down one z-level below the tunnel level.
9
10 3) From the bottom of the staircase (the z-level below where the water will flow to your cisterns), dig a straight, one-tile wide tunnel to the edge of the map. Smooth the map edge tile and carve a fortification. The water can flow through the fortification and off the map, allowing the dwarves to dig out the aquifer tap without drowning. 3) From the bottom of the staircase (the z-level below where the water will flow to your cisterns), dig a straight, one-tile wide tunnel to the edge of the map. This is your drainage tunnel. Smooth the map edge tile and carve a fortification. The water can flow through the fortification and off the map, allowing the dwarves to dig out the aquifer tap without drowning.
11
12 4) Place a lever-controlled floodgate in the drainage tunnel and open the floodgate. 4) Place a lever-controlled floodgate in the drainage tunnel and open the floodgate. Place the lever somewhere else in your fort so that it will remain dry and accessible.
13
14 5) If you care about how nice things look, haul away any boulders and smooth the tiles. You won't be able to access any of this area once it fills up with water! 5) If you care about how nice things look, haul away any boulders in the tunnels and smooth the tiles. You won't be able to access any of this area once it fills up with water!
15
16 6) Apply this blueprint (quickfort run library/aquifer_tap.csv -n /dig) to the z-level above the top of the staircase, inside the lowest aquifer level. Do not unpause until after the next step. 6) Apply this blueprint (gui/quickfort library/aquifer_tap.csv -n /dig) to the z-level above the top of the staircase, inside the lowest aquifer level. Do not unpause until after the next step.
17
18 7) Damp tiles cancel dig designations if the tile is currently hidden, so to avoid having to re-apply this blueprint after every tile your dwarves dig, position the cursor straight up (north) of the left-most tile designated for digging and straight left (west) of the topmost designated tile and run the following commands in the DFHack console:
19 tiletypes-command f any ; f designated 1 ; p any ; p hidden 0 ; r 23 23 1
20 tiletypes-here
21
22 8) Unpause and dig out the tap. If you care about appearances, haul away any boulders and feel free to remove the ramps (d-z). The water will safely flow down the staircase, through the open floodgate, and off the map until you choose to close the floodgate. 8) Unpause and dig out the tap. If you care about appearances, haul away any boulders and feel free to remove the ramps (d-z). The water will safely flow down the staircase, through the open floodgate, down the drainage tunnel, and off the map until you choose to close the floodgate.
23 9) Once everything is dug out and all dwarves are out of the waterways, close the floodgate. Your cisterns will fill with water. Since the waterway to your cisterns is depressurized, the cisterns will stay forever full, but will not flood.
24
25 A diagram might be useful. Here is a vertical view through the z-levels. This blueprint goes at the top:

File diff suppressed because it is too large Load Diff

@ -1,23 +1,23 @@
#notes label(help)
A pump stack is useful for moving water or magma up through the z-levels.
""
To use these blueprints:
"These blueprints can be used from the quickfort commandline, but are much easier to use with the visual interface. That way you can check the vertical path interactively before you apply. Run gui/quickfort pump_stack"
""
1) Measure how many z-levels the pump stack should span.
"1) Select the ""dig"" blueprint and position the blueprint preview on the bottom level of the future pump stack. It should be on the z-level just above the liquid you want to pump."
""
"2) Position the cursor on the bottom level of the future pump stack. It should be on the z-level just above the liquid you want to pump. Run ""quickfort run library/pump_stack.csv -n /dig2SN"" to see where the suction hole will end up. Replace ""run"" with ""undo"" in the previous command to clean up."
"2) Enable repetitions with the ""R"" hotkey and lock the blueprint in place with the ""L"" hotkey. Move up the z-levels to check that the pump stack has a clear path and doesn't intersect with any open areas (e.g. caverns). Increase the number of repetitions with the ""+"" or ""*"" hotkeys if you need the pump stack to extend further up. Unlock the blueprint and shift it around if you need to, then lock it again to recheck the vertical path."
""
"3) If you need an East-West pump stack, or if you need the staircase in another spot, use the ""--transform"" commandline option to alter the blueprint to your needs. For example: ""quickfort run library/pump_stack.csv -n /dig2SN --transform rotcw,fliph"". If you use a transformation, be sure to use the same option for the remaining commandlines."
"3) If you need to flip the pump stack around to make it fit through the rock layers, enable transformations with the ""t"" hotkey and rotate/flip the blueprint with Ctrl+arrow keys."
""
"4) Once you have everything lined up, run ""quickfort run library/pump_stack.csv -n /dig2SN --repeat up,20"" to designate the entire pump stack for digging. Replace that last ""20"" with the height of your pump stack divided by 2 (since each repetition of /dig2SN is two z-levels high). If the height ends up being one too many at the top, manually undesignate the top level."
"4) Once you have everything lined up, hit Enter to apply. If the height ends up being one too many at the top, manually undesignate the top level."
""
"5) Since you do not need to transmit power down below the lowest level, replace the channel designation on the middle tile of the bottom-most pump stack level with a regular dig designation. Likewise, replace the Up/Down staircase designation on the lowest level with an Up staircase designation."
"5) Since you do not need to transmit power down below the lowest level, replace the channel designation on the middle tile of the bottom-most pump stack level with a regular dig designation. Likewise, replace the Up/Down staircase designation on the lowest level with an Up staircase designation. Otherwise you might get magma critters climbing up through your access stairway!"
""
"6) After the stack is dug out, prepare for building by setting the buildingplan plugin material filters for screw pumps (b-M-s-M). If you are planning to move magma, be sure to select magma-safe materials."
"6) After the stack is dug out, prepare for building by setting the buildingplan plugin material filters for screw pumps (b-M-s-M). If you are planning to move magma, be sure to select magma-safe materials (like green glass) for all three components of the screw pump."
""
"7) Finally, position the cursor back on the access stairs on the lowest level and run ""quickfort run library/pump_stack.csv -n /build2SN --repeat up,20"" (with 20 replaced with your desired repetition count and with your --transform command, if any)."
"7) Finally, position the cursor back on the access stairs on the lowest level and run the ""build"" blueprint with the same repetition and transformation settings that you used for the ""dig"" blueprint. As you manufacture the materials you need to construct the screw pumps, your dwarves will build the pump stack from the bottom up."
""
"Sometimes, a screw pump will spontaneously deconstruct while you are building the stack. This will reduce the efficiency of the stack a little, but it's nothing to worry about. Just re-run the /build2SN blueprint over the entire stack to ""fix up"" any broken pieces. The blueprint will harmlessly skip over any correctly-built screw pumps."
"Sometimes, a screw pump will spontaneously deconstruct while you are building the stack. This will reduce the efficiency of the stack a little, but it's nothing to worry about. Just re-run the ""build"" blueprint over the entire stack to ""fix up"" any broken pieces. The blueprint will harmlessly skip over any correctly-built screw pumps."
""
See the wiki for more info on pump stacks: https://dwarffortresswiki.org/index.php/Screw_pump#Pump_stack
#dig label(digSN) start(2;4;on access stairs) hidden() for a pump from south level
@ -34,7 +34,7 @@ See the wiki for more info on pump stacks: https://dwarffortresswiki.org/index.p
,i,,h
,,,d
#meta label(dig2SN) start(at the bottom level on the access stairs) 2 levels of pump stack - bottom level pumps from the south
#meta label(dig) start(at the bottom level on the access stairs) 2 levels of pump stack - bottom level pumps from the south
/digSN
#<
/digNS
@ -52,7 +52,7 @@ See the wiki for more info on pump stacks: https://dwarffortresswiki.org/index.p
,`,,Msu
,,,`
#meta label(build2SN) start(at the bottom level on the access stairs) 2 levels of pump stack - bottom level pumps from the south
#meta label(build) start(at the bottom level on the access stairs) 2 levels of pump stack - bottom level pumps from the south
/buildSN
#<
/buildNS

Can't render this file because it has a wrong number of fields in line 25.

@ -0,0 +1,5 @@
#build label(build)
,,CSdd
1 #build label(build)
2 ,,CSdd

@ -0,0 +1,6 @@
#place label(place)
s(5x3)
,,afunswebhlzSgpd
1 #place label(place)
2 s(5x3)
3 ,,afunswebhlzSgpd

@ -0,0 +1,6 @@
#query label(query)
,,"{givename name=""foo dumper""}"
,,"{givename name=""foo""}"
Can't render this file because it has a wrong number of fields in line 5.

@ -1,4 +1,4 @@
#dig label(dig)
#dig label(dig) start(3;3)
d,d,,,d
d,,j,,d
d,u,d,u,d
1 #dig label(dig) #dig label(dig) start(3;3)
2 d,d,,,d
3 d,,j,,d
4 d,u,d,u,d

@ -1,4 +1,4 @@
#dig label(dig)
#dig label(dig) start(14;14)
,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d
d,,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,,d
d,d,,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,,d,d
1 #dig label(dig) #dig label(dig) start(14;14)
2 ,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d
3 d,,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,,d
4 d,d,,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,,d,d

@ -0,0 +1,28 @@
#build label(construct) start(14;14)
,trackNS,trackE,,trackW,trackS,trackN,,,,,,,,,,,,,,trackN,trackS,trackE,,trackW,trackNS
trackEW,,trackSE,,trackSW,trackNE,trackNW,,,,,,,,,,,,,,trackNE,trackNW,trackSE,,trackSW,,trackEW
trackS,trackSE,,,trackNSE,trackNSW,trackEW,,,,,,,,,,,,,,trackEW,trackNSE,trackNSW,,,trackSW,trackS
trackN,trackNE,trackSEW,,,trackSEW,trackNEW,,,,,,,,,,,,,,trackNEW,trackSEW,,,trackSEW,trackNW,trackN
trackE,trackSW,trackNEW,,trackNSE,,trackNSEW,,,,,,,,,,,,,,trackNSEW,,trackNSW,,trackNEW,trackSE,trackW
trackW,trackNW,trackNS,,trackNSW,trackNSEW,,,,,,,,,,,,,,,,trackNSEW,trackNSE,,trackNS,trackNE,trackE
,,,,,,,,,,trackrampNW,trackrampNS,trackrampN,,trackrampN,trackrampNS,trackrampNE
,,,,,,,,,trackrampNW,,trackrampNSE,trackrampNSW,,trackrampNSE,trackrampNSW,,trackrampNE
,,,,,,,,,trackrampEW,trackrampSEW,,trackrampNSEW,,trackrampNSEW,,trackrampSEW,trackrampEW
,,,,,,,,,trackrampW,trackrampNEW,trackrampNSEW,,,,trackrampNSEW,trackrampNEW,trackrampE
,,,,,,,,,trackrampW,trackrampSEW,trackrampNSEW,,,,trackrampNSEW,trackrampSEW,trackrampE
,,,,,,,,,trackrampEW,trackrampNEW,,trackrampNSEW,,trackrampNSEW,,trackrampNEW,trackrampEW
,,,,,,,,,trackrampSW,,trackrampNSE,trackrampNSW,,trackrampNSE,trackrampNSW,,trackrampSE
,,,,,,,,,,trackrampSW,trackrampNS,trackrampS,,trackrampS,trackrampNS,trackrampSE
trackW,trackSW,trackNS,,trackNSW,trackNSEW,,,,,,,,,,,,,,,,trackNSEW,trackNSE,,trackNS,trackSE,trackE
trackE,trackNW,trackSEW,,trackNSE,,trackNSEW,,,,,,,,,,,,,,trackNSEW,,trackNSW,,trackSEW,trackNE,trackW
trackS,trackSE,trackNEW,,,trackNEW,trackSEW,,,,,,,,,,,,,,trackSEW,trackNEW,,,trackNEW,trackSW,trackS
trackN,trackNE,,,trackNSE,trackNSW,trackEW,,,,,,,,,,,,,,trackEW,trackNSE,trackNSW,,,trackNW,trackN
trackEW,,trackNE,,trackNW,trackSE,trackSW,,,,,,,,,,,,,,trackSE,trackSW,trackNE,,trackNW,,trackEW
,trackNS,trackE,,trackW,trackN,trackS,,,,,,,,,,,,,,trackS,trackN,trackE,,trackW,trackNS
1 #build label(construct) start(14;14)
2 ,trackNS,trackE,,trackW,trackS,trackN,,,,,,,,,,,,,,trackN,trackS,trackE,,trackW,trackNS
3 trackEW,,trackSE,,trackSW,trackNE,trackNW,,,,,,,,,,,,,,trackNE,trackNW,trackSE,,trackSW,,trackEW
4 trackS,trackSE,,,trackNSE,trackNSW,trackEW,,,,,,,,,,,,,,trackEW,trackNSE,trackNSW,,,trackSW,trackS
5 trackN,trackNE,trackSEW,,,trackSEW,trackNEW,,,,,,,,,,,,,,trackNEW,trackSEW,,,trackSEW,trackNW,trackN
6 trackE,trackSW,trackNEW,,trackNSE,,trackNSEW,,,,,,,,,,,,,,trackNSEW,,trackNSW,,trackNEW,trackSE,trackW
7 trackW,trackNW,trackNS,,trackNSW,trackNSEW,,,,,,,,,,,,,,,,trackNSEW,trackNSE,,trackNS,trackNE,trackE
8 ,,,,,,,,,,trackrampNW,trackrampNS,trackrampN,,trackrampN,trackrampNS,trackrampNE
9 ,,,,,,,,,trackrampNW,,trackrampNSE,trackrampNSW,,trackrampNSE,trackrampNSW,,trackrampNE
10 ,,,,,,,,,trackrampEW,trackrampSEW,,trackrampNSEW,,trackrampNSEW,,trackrampSEW,trackrampEW
11 ,,,,,,,,,trackrampW,trackrampNEW,trackrampNSEW,,,,trackrampNSEW,trackrampNEW,trackrampE
12 ,,,,,,,,,trackrampW,trackrampSEW,trackrampNSEW,,,,trackrampNSEW,trackrampSEW,trackrampE
13 ,,,,,,,,,trackrampEW,trackrampNEW,,trackrampNSEW,,trackrampNSEW,,trackrampNEW,trackrampEW
14 ,,,,,,,,,trackrampSW,,trackrampNSE,trackrampNSW,,trackrampNSE,trackrampNSW,,trackrampSE
15 ,,,,,,,,,,trackrampSW,trackrampNS,trackrampS,,trackrampS,trackrampNS,trackrampSE
16 trackW,trackSW,trackNS,,trackNSW,trackNSEW,,,,,,,,,,,,,,,,trackNSEW,trackNSE,,trackNS,trackSE,trackE
17 trackE,trackNW,trackSEW,,trackNSE,,trackNSEW,,,,,,,,,,,,,,trackNSEW,,trackNSW,,trackSEW,trackNE,trackW
18 trackS,trackSE,trackNEW,,,trackNEW,trackSEW,,,,,,,,,,,,,,trackSEW,trackNEW,,,trackNEW,trackSW,trackS
19 trackN,trackNE,,,trackNSE,trackNSW,trackEW,,,,,,,,,,,,,,trackEW,trackNSE,trackNSW,,,trackNW,trackN
20 trackEW,,trackNE,,trackNW,trackSE,trackSW,,,,,,,,,,,,,,trackSE,trackSW,trackNE,,trackNW,,trackEW
21 ,trackNS,trackE,,trackW,trackN,trackS,,,,,,,,,,,,,,trackS,trackN,trackE,,trackW,trackNS

@ -0,0 +1,28 @@
#build label(build) start(14;14)
,~,~,,~,~,~,,gs(1x2),ga(2x1),,gx(1x2),gw(1x2),,gw(1x2),gx(1x2),gd(2x1),,gs(1x2),,~,~,~,,~,~
~,,~,,~,~,~,,,gd(2x1),,,,,,,ga(2x1),,,,~,~,~,,~,,~
~,~,,,~,~,~,,Mrsssqq(2x1),,,Msh,,,,,Msk,Mrsqq(2x1),,,~,~,~,,,~,~
,,,,,,,,CSdddaaaa,,Msk,,Mw,,Mw,,,Msh,CSddddaaaa
~,~,~,,,~,~,,CSa,,Mrss(1x2),Mw,,,,Mw,Mrss(1x2),,CSa,,~,~,,,~,~,~
~,~,~,,~,,~,,,Msm,,,Mhs(1x2),,Mhs(1x2),,,Msm,,,~,,~,,~,~,~
~,~,~,,~,~,,,Msu,,Mws,,,,,,Mws,,Msu,,,~,~,,~,~,~
,,,,,,,,,Mws,,Mh(2x1),,,Mh(2x1),,,Mws
gs(2x1),,Mrqq(1x2),CSddaaaa,CSa,,Msh,,,,,,,,,,,,,,,Msk,CSa,CSddaaaa,Mrqq(1x2),gs(2x1)
gw(1x2),gx(1x2),,,,Msk,,Mw,,,~,~,~,,~,~,~,,,Mw,,,Msh,,,gx(1x2),gw(1x2)
,,,Msm,Mrs(2x1),,Mw,,,~,,~,~,,~,~,,~,,,Mw,Mrsss(2x1),,Msm
gd(2x1),,Msu,,Mws,,,Mhs(1x2),,~,~,,~,,~,,~,~,,Mhs(1x2),,,Mws,,Msu,ga(2x1)
ga(2x1),,,Mws,,Mh(2x1),,,,~,~,~,,,,~,~,~,,,Mh(2x1),,,Mws,,gd(2x1)
ga(2x1),,,Mws,,Mh(2x1),,Mhs(1x2),,~,~,~,,,,~,~,~,,Mhs(1x2),Mh(2x1),,,Mws,,gd(2x1)
gd(2x1),,,,Mws,,,,,~,~,,~,,~,,~,~,,,,,Mws,,,ga(2x1)
gx(1x2),gw(1x2),Msm,,Mrs(2x1),,Mw,,,~,,~,~,,~,~,,~,,,Mw,Mrsss(2x1),,,Msm,gw(1x2),gx(1x2)
,,Mrssqq(1x2),Msu,,Msk,,Mw,,,~,~,~,,~,~,~,,,Mw,,,Msh,Msu,Mrssqq(1x2)
gs(2x1),,,CSdaaaa,CSa,,Msh,,,,,,,,,,,,,,,Msk,CSa,CSdaaaa,,gs(2x1)
,,,,,,,,,Mws,,Mh(2x1),,,Mh(2x1),,,Mws
~,~,~,,~,~,,,,,Mws,,Mhs(1x2),,Mhs(1x2),,Mws,,,,,~,~,,~,~,~
~,~,~,,~,,~,,Msm,,Mr(1x2),,,,,,Mr(1x2),,Msm,,~,,~,,~,~,~
~,~,~,,,~,~,,CSa,Msu,,Mw,,,,Mw,,Msu,CSa,,~,~,,,~,~,~
,,,,,,,,CSdddaaaa,,Msk,,Mw,,Mw,,,Msh,CSddddaaaa
~,~,,,~,~,~,,Mrsssqq(2x1),,,Msh,,,,,Msk,Mrsqq(2x1),,,~,~,~,,,~,~
~,,~,,~,~,~,,gs(1x2),gd(2x1),,gw(1x2),gx(1x2),,gx(1x2),gw(1x2),ga(2x1),,gs(1x2),,~,~,~,,~,,~
,~,~,,~,~,~,,,ga(2x1),,,,,,,gd(2x1),,,,~,~,~,,~,~
1 #build label(build) start(14;14)
2 ,~,~,,~,~,~,,gs(1x2),ga(2x1),,gx(1x2),gw(1x2),,gw(1x2),gx(1x2),gd(2x1),,gs(1x2),,~,~,~,,~,~
3 ~,,~,,~,~,~,,,gd(2x1),,,,,,,ga(2x1),,,,~,~,~,,~,,~
4 ~,~,,,~,~,~,,Mrsssqq(2x1),,,Msh,,,,,Msk,Mrsqq(2x1),,,~,~,~,,,~,~
5 ,,,,,,,,CSdddaaaa,,Msk,,Mw,,Mw,,,Msh,CSddddaaaa
6 ~,~,~,,,~,~,,CSa,,Mrss(1x2),Mw,,,,Mw,Mrss(1x2),,CSa,,~,~,,,~,~,~
7 ~,~,~,,~,,~,,,Msm,,,Mhs(1x2),,Mhs(1x2),,,Msm,,,~,,~,,~,~,~
8 ~,~,~,,~,~,,,Msu,,Mws,,,,,,Mws,,Msu,,,~,~,,~,~,~
9 ,,,,,,,,,Mws,,Mh(2x1),,,Mh(2x1),,,Mws
10 gs(2x1),,Mrqq(1x2),CSddaaaa,CSa,,Msh,,,,,,,,,,,,,,,Msk,CSa,CSddaaaa,Mrqq(1x2),gs(2x1)
11 gw(1x2),gx(1x2),,,,Msk,,Mw,,,~,~,~,,~,~,~,,,Mw,,,Msh,,,gx(1x2),gw(1x2)
12 ,,,Msm,Mrs(2x1),,Mw,,,~,,~,~,,~,~,,~,,,Mw,Mrsss(2x1),,Msm
13 gd(2x1),,Msu,,Mws,,,Mhs(1x2),,~,~,,~,,~,,~,~,,Mhs(1x2),,,Mws,,Msu,ga(2x1)
14 ga(2x1),,,Mws,,Mh(2x1),,,,~,~,~,,,,~,~,~,,,Mh(2x1),,,Mws,,gd(2x1)
15 ga(2x1),,,Mws,,Mh(2x1),,Mhs(1x2),,~,~,~,,,,~,~,~,,Mhs(1x2),Mh(2x1),,,Mws,,gd(2x1)
16 gd(2x1),,,,Mws,,,,,~,~,,~,,~,,~,~,,,,,Mws,,,ga(2x1)
17 gx(1x2),gw(1x2),Msm,,Mrs(2x1),,Mw,,,~,,~,~,,~,~,,~,,,Mw,Mrsss(2x1),,,Msm,gw(1x2),gx(1x2)
18 ,,Mrssqq(1x2),Msu,,Msk,,Mw,,,~,~,~,,~,~,~,,,Mw,,,Msh,Msu,Mrssqq(1x2)
19 gs(2x1),,,CSdaaaa,CSa,,Msh,,,,,,,,,,,,,,,Msk,CSa,CSdaaaa,,gs(2x1)
20 ,,,,,,,,,Mws,,Mh(2x1),,,Mh(2x1),,,Mws
21 ~,~,~,,~,~,,,,,Mws,,Mhs(1x2),,Mhs(1x2),,Mws,,,,,~,~,,~,~,~
22 ~,~,~,,~,,~,,Msm,,Mr(1x2),,,,,,Mr(1x2),,Msm,,~,,~,,~,~,~
23 ~,~,~,,,~,~,,CSa,Msu,,Mw,,,,Mw,,Msu,CSa,,~,~,,,~,~,~
24 ,,,,,,,,CSdddaaaa,,Msk,,Mw,,Mw,,,Msh,CSddddaaaa
25 ~,~,,,~,~,~,,Mrsssqq(2x1),,,Msh,,,,,Msk,Mrsqq(2x1),,,~,~,~,,,~,~
26 ~,,~,,~,~,~,,gs(1x2),gd(2x1),,gw(1x2),gx(1x2),,gx(1x2),gw(1x2),ga(2x1),,gs(1x2),,~,~,~,,~,,~
27 ,~,~,,~,~,~,,,ga(2x1),,,,,,,gd(2x1),,,,~,~,~,,~,~

@ -1,28 +0,0 @@
#build label(build)
,trackNS,trackE,,trackW,trackS,trackN,,gs(1x2),ga(2x1),,gx(1x2),gw(1x2),,gw(1x2),gx(1x2),gd(2x1),,gs(1x2),,trackN,trackS,trackE,,trackW,trackNS
trackEW,,trackSE,,trackSW,trackNE,trackNW,,,gd(2x1),,,,,,,ga(2x1),,,,trackNE,trackNW,trackSE,,trackSW,,trackEW
trackS,trackSE,,,trackNSE,trackNSW,trackEW,,Mrsssqq(2x1),,,Msh,,,,,Msk,Mrsqq(2x1),,,trackEW,trackNSE,trackNSW,,,trackSW,trackS
,,,,,,,,CSdddaaaa,,Msk,,Mw,,Mw,,,Msh,CSddddaaaa
trackN,trackNE,trackSEW,,,trackSEW,trackNEW,,CSa,,Mrss(1x2),Mw,,,,Mw,Mrss(1x2),,CSa,,trackNEW,trackSEW,,,trackSEW,trackNW,trackN
trackE,trackSW,trackNEW,,trackNSE,,trackNSEW,,,Msm,,,Mhs(1x2),,Mhs(1x2),,,Msm,,,trackNSEW,,trackNSW,,trackNEW,trackSE,trackW
trackW,trackNW,trackNS,,trackNSW,trackNSEW,,,Msu,,Mws,,,,,,Mws,,Msu,,,trackNSEW,trackNSE,,trackNS,trackNE,trackE
,,,,,,,,,Mws,,Mh(2x1),,,Mh(2x1),,,Mws
gs(2x1),,Mrqq(1x2),CSddaaaa,CSa,,Msh,,,,,,,,,,,,,,,Msk,CSa,CSddaaaa,Mrqq(1x2),gs(2x1)
gw(1x2),gx(1x2),,,,Msk,,Mw,,,trackrampNW,trackrampNS,trackrampN,,trackrampN,trackrampNS,trackrampNE,,,Mw,,,Msh,,,gx(1x2),gw(1x2)
,,,Msm,Mrs(2x1),,Mw,,,trackrampNW,,trackrampNSE,trackrampNSW,,trackrampNSE,trackrampNSW,,trackrampNE,,,Mw,Mrsss(2x1),,Msm
gd(2x1),,Msu,,Mws,,,Mhs(1x2),,trackrampEW,trackrampSEW,,trackrampNSEW,,trackrampNSEW,,trackrampSEW,trackrampEW,,Mhs(1x2),,,Mws,,Msu,ga(2x1)
ga(2x1),,,Mws,,Mh(2x1),,,,trackrampW,trackrampNEW,trackrampNSEW,,,,trackrampNSEW,trackrampNEW,trackrampE,,,Mh(2x1),,,Mws,,gd(2x1)
ga(2x1),,,Mws,,Mh(2x1),,Mhs(1x2),,trackrampW,trackrampSEW,trackrampNSEW,,,,trackrampNSEW,trackrampSEW,trackrampE,,Mhs(1x2),Mh(2x1),,,Mws,,gd(2x1)
gd(2x1),,,,Mws,,,,,trackrampEW,trackrampNEW,,trackrampNSEW,,trackrampNSEW,,trackrampNEW,trackrampEW,,,,,Mws,,,ga(2x1)
gx(1x2),gw(1x2),Msm,,Mrs(2x1),,Mw,,,trackrampSW,,trackrampNSE,trackrampNSW,,trackrampNSE,trackrampNSW,,trackrampSE,,,Mw,Mrsss(2x1),,,Msm,gw(1x2),gx(1x2)
,,Mrssqq(1x2),Msu,,Msk,,Mw,,,trackrampSW,trackrampNS,trackrampS,,trackrampS,trackrampNS,trackrampSE,,,Mw,,,Msh,Msu,Mrssqq(1x2)
gs(2x1),,,CSdaaaa,CSa,,Msh,,,,,,,,,,,,,,,Msk,CSa,CSdaaaa,,gs(2x1)
,,,,,,,,,Mws,,Mh(2x1),,,Mh(2x1),,,Mws
trackW,trackSW,trackNS,,trackNSW,trackNSEW,,,,,Mws,,Mhs(1x2),,Mhs(1x2),,Mws,,,,,trackNSEW,trackNSE,,trackNS,trackSE,trackE
trackE,trackNW,trackSEW,,trackNSE,,trackNSEW,,Msm,,Mr(1x2),,,,,,Mr(1x2),,Msm,,trackNSEW,,trackNSW,,trackSEW,trackNE,trackW
trackS,trackSE,trackNEW,,,trackNEW,trackSEW,,CSa,Msu,,Mw,,,,Mw,,Msu,CSa,,trackSEW,trackNEW,,,trackNEW,trackSW,trackS
,,,,,,,,CSdddaaaa,,Msk,,Mw,,Mw,,,Msh,CSddddaaaa
trackN,trackNE,,,trackNSE,trackNSW,trackEW,,Mrsssqq(2x1),,,Msh,,,,,Msk,Mrsqq(2x1),,,trackEW,trackNSE,trackNSW,,,trackNW,trackN
trackEW,,trackNE,,trackNW,trackSE,trackSW,,gs(1x2),gd(2x1),,gw(1x2),gx(1x2),,gx(1x2),gw(1x2),ga(2x1),,gs(1x2),,trackSE,trackSW,trackNE,,trackNW,,trackEW
,trackNS,trackE,,trackW,trackN,trackS,,,ga(2x1),,,,,,,gd(2x1),,,,trackS,trackN,trackE,,trackW,trackNS
1 #build label(build)
2 ,trackNS,trackE,,trackW,trackS,trackN,,gs(1x2),ga(2x1),,gx(1x2),gw(1x2),,gw(1x2),gx(1x2),gd(2x1),,gs(1x2),,trackN,trackS,trackE,,trackW,trackNS
3 trackEW,,trackSE,,trackSW,trackNE,trackNW,,,gd(2x1),,,,,,,ga(2x1),,,,trackNE,trackNW,trackSE,,trackSW,,trackEW
4 trackS,trackSE,,,trackNSE,trackNSW,trackEW,,Mrsssqq(2x1),,,Msh,,,,,Msk,Mrsqq(2x1),,,trackEW,trackNSE,trackNSW,,,trackSW,trackS
5 ,,,,,,,,CSdddaaaa,,Msk,,Mw,,Mw,,,Msh,CSddddaaaa
6 trackN,trackNE,trackSEW,,,trackSEW,trackNEW,,CSa,,Mrss(1x2),Mw,,,,Mw,Mrss(1x2),,CSa,,trackNEW,trackSEW,,,trackSEW,trackNW,trackN
7 trackE,trackSW,trackNEW,,trackNSE,,trackNSEW,,,Msm,,,Mhs(1x2),,Mhs(1x2),,,Msm,,,trackNSEW,,trackNSW,,trackNEW,trackSE,trackW
8 trackW,trackNW,trackNS,,trackNSW,trackNSEW,,,Msu,,Mws,,,,,,Mws,,Msu,,,trackNSEW,trackNSE,,trackNS,trackNE,trackE
9 ,,,,,,,,,Mws,,Mh(2x1),,,Mh(2x1),,,Mws
10 gs(2x1),,Mrqq(1x2),CSddaaaa,CSa,,Msh,,,,,,,,,,,,,,,Msk,CSa,CSddaaaa,Mrqq(1x2),gs(2x1)
11 gw(1x2),gx(1x2),,,,Msk,,Mw,,,trackrampNW,trackrampNS,trackrampN,,trackrampN,trackrampNS,trackrampNE,,,Mw,,,Msh,,,gx(1x2),gw(1x2)
12 ,,,Msm,Mrs(2x1),,Mw,,,trackrampNW,,trackrampNSE,trackrampNSW,,trackrampNSE,trackrampNSW,,trackrampNE,,,Mw,Mrsss(2x1),,Msm
13 gd(2x1),,Msu,,Mws,,,Mhs(1x2),,trackrampEW,trackrampSEW,,trackrampNSEW,,trackrampNSEW,,trackrampSEW,trackrampEW,,Mhs(1x2),,,Mws,,Msu,ga(2x1)
14 ga(2x1),,,Mws,,Mh(2x1),,,,trackrampW,trackrampNEW,trackrampNSEW,,,,trackrampNSEW,trackrampNEW,trackrampE,,,Mh(2x1),,,Mws,,gd(2x1)
15 ga(2x1),,,Mws,,Mh(2x1),,Mhs(1x2),,trackrampW,trackrampSEW,trackrampNSEW,,,,trackrampNSEW,trackrampSEW,trackrampE,,Mhs(1x2),Mh(2x1),,,Mws,,gd(2x1)
16 gd(2x1),,,,Mws,,,,,trackrampEW,trackrampNEW,,trackrampNSEW,,trackrampNSEW,,trackrampNEW,trackrampEW,,,,,Mws,,,ga(2x1)
17 gx(1x2),gw(1x2),Msm,,Mrs(2x1),,Mw,,,trackrampSW,,trackrampNSE,trackrampNSW,,trackrampNSE,trackrampNSW,,trackrampSE,,,Mw,Mrsss(2x1),,,Msm,gw(1x2),gx(1x2)
18 ,,Mrssqq(1x2),Msu,,Msk,,Mw,,,trackrampSW,trackrampNS,trackrampS,,trackrampS,trackrampNS,trackrampSE,,,Mw,,,Msh,Msu,Mrssqq(1x2)
19 gs(2x1),,,CSdaaaa,CSa,,Msh,,,,,,,,,,,,,,,Msk,CSa,CSdaaaa,,gs(2x1)
20 ,,,,,,,,,Mws,,Mh(2x1),,,Mh(2x1),,,Mws
21 trackW,trackSW,trackNS,,trackNSW,trackNSEW,,,,,Mws,,Mhs(1x2),,Mhs(1x2),,Mws,,,,,trackNSEW,trackNSE,,trackNS,trackSE,trackE
22 trackE,trackNW,trackSEW,,trackNSE,,trackNSEW,,Msm,,Mr(1x2),,,,,,Mr(1x2),,Msm,,trackNSEW,,trackNSW,,trackSEW,trackNE,trackW
23 trackS,trackSE,trackNEW,,,trackNEW,trackSEW,,CSa,Msu,,Mw,,,,Mw,,Msu,CSa,,trackSEW,trackNEW,,,trackNEW,trackSW,trackS
24 ,,,,,,,,CSdddaaaa,,Msk,,Mw,,Mw,,,Msh,CSddddaaaa
25 trackN,trackNE,,,trackNSE,trackNSW,trackEW,,Mrsssqq(2x1),,,Msh,,,,,Msk,Mrsqq(2x1),,,trackEW,trackNSE,trackNSW,,,trackNW,trackN
26 trackEW,,trackNE,,trackNW,trackSE,trackSW,,gs(1x2),gd(2x1),,gw(1x2),gx(1x2),,gx(1x2),gw(1x2),ga(2x1),,gs(1x2),,trackSE,trackSW,trackNE,,trackNW,,trackEW
27 ,trackNS,trackE,,trackW,trackN,trackS,,,ga(2x1),,,,,,,gd(2x1),,,,trackS,trackN,trackE,,trackW,trackNS

@ -0,0 +1,21 @@
#build label(construct)
Cw
Cf
Cr
Cu
Cd
Cx
CF
1 #build label(construct)
2 Cw
3 Cf
4 Cr
5 Cu
6 Cd
7 Cx
8 CF

@ -0,0 +1,33 @@
#build label(build)
a,Mg,,CS
b,Mh(1x1),S,CSa,,,,,,Mw,,,wm,,,wp
c,Mhs(1x1),m,CSaa,,,,,,,,,,,,,,,,,D
n,Mv,v,CSaaa,,Msu
,Mr(1x1),j,CSaaaa,,,,,,Mws,,,wu,,,ew
d,Mrq(1x1),A,CSd,,,Msk
,Mrqq(1x1),R,CSda
l,Mrqqq(1x1),N,CSdaa,,Msm,,,,we,,,wn,,,es,,,,,k
x,Mrqqqq(1x1),~h,CSdaaa
H,Mrs(1x1),~a,CSdaaaa,,,Msh
W,Mrsq(1x1),~c,CSdd,,,,,,wq,,,wr,,,el
G,Mrsqq(1x1),F,CSdda
B,Mrsqqq(1x1),o(1x1),CSddaa,,,,,,,,,,,,,,,,,ws
~,~b,Mrsqqqq(1x1),CSddaaa,,,,,,wM,,,wt,,,eg
~,f,Mrss(1x1),CSddaaaa
~,h,Mrssq(1x1),CSddd
~,r,Mrssqq(1x1),CSddda,,,,,,wo,,,wl,,,ea,,,,gx(1x2),gx(1x2)
~,s,Mrssqqq(1x1),CSdddaa
~,~s,Mrssqqqq(1x1),CSdddaaa,,,,,,,,,,,,,,gd(2x1),,gs(2x1),,ga(2x1)
~,t,Mrsss(1x1),CSdddaaaa,,,,,,wk,,,ww,,,ek,,gd(2x1),,gs(2x1),,ga(2x1)
gs(1x1),Mrsssq(1x1),,CSdddd,,,,,,,,,,,,,,,,gw(1x2),gw(1x2)
ga(1x1),Mrsssqq(1x1),,CSdddda
gd(1x1),Mrsssqqq(1x1),,CSddddaa,,,,,,wb,,,wz,,,en
gw(1x1),Mrsssqqqq(1x1),,CSddddaaa,,,,,,,,,,,,,,Mh(2x1),,Mh(2x1),,Mhs(1x2),Mhs(1x2)
gx(1x1),,,CSddddaaaa,,,,,,,,,,,,,,Mh(2x1),,Mh(2x1)
,,,Ts,,,,,,wc,,,wh,,,ib,,Mr(1x2),Mr(1x2),Mrs(2x1),,Mhs(1x2),Mhs(1x2)
y,,,Tw,,,,,,,,,,,,,,,,Mrs(2x1)
Y,,,Tl,,,,,,,,,,,,,,Mr(1x2),Mr(1x2),Mrsq(2x1),,Mrsq(2x1)
,,,Tp,,,,,,wf,,,wy,,,ic,,,,Mrsssqqqq(2x1),,Mrsssqqqq(2x1)
,,,Tc
,,,TS
,,,,,,,,,,wv,,,wd,,,wj,,,wS
1 #build label(build)
2 a,Mg,,CS
3 b,Mh(1x1),S,CSa,,,,,,Mw,,,wm,,,wp
4 c,Mhs(1x1),m,CSaa,,,,,,,,,,,,,,,,,D
5 n,Mv,v,CSaaa,,Msu
6 ,Mr(1x1),j,CSaaaa,,,,,,Mws,,,wu,,,ew
7 d,Mrq(1x1),A,CSd,,,Msk
8 ,Mrqq(1x1),R,CSda
9 l,Mrqqq(1x1),N,CSdaa,,Msm,,,,we,,,wn,,,es,,,,,k
10 x,Mrqqqq(1x1),~h,CSdaaa
11 H,Mrs(1x1),~a,CSdaaaa,,,Msh
12 W,Mrsq(1x1),~c,CSdd,,,,,,wq,,,wr,,,el
13 G,Mrsqq(1x1),F,CSdda
14 B,Mrsqqq(1x1),o(1x1),CSddaa,,,,,,,,,,,,,,,,,ws
15 ~,~b,Mrsqqqq(1x1),CSddaaa,,,,,,wM,,,wt,,,eg
16 ~,f,Mrss(1x1),CSddaaaa
17 ~,h,Mrssq(1x1),CSddd
18 ~,r,Mrssqq(1x1),CSddda,,,,,,wo,,,wl,,,ea,,,,gx(1x2),gx(1x2)
19 ~,s,Mrssqqq(1x1),CSdddaa
20 ~,~s,Mrssqqqq(1x1),CSdddaaa,,,,,,,,,,,,,,gd(2x1),,gs(2x1),,ga(2x1)
21 ~,t,Mrsss(1x1),CSdddaaaa,,,,,,wk,,,ww,,,ek,,gd(2x1),,gs(2x1),,ga(2x1)
22 gs(1x1),Mrsssq(1x1),,CSdddd,,,,,,,,,,,,,,,,gw(1x2),gw(1x2)
23 ga(1x1),Mrsssqq(1x1),,CSdddda
24 gd(1x1),Mrsssqqq(1x1),,CSddddaa,,,,,,wb,,,wz,,,en
25 gw(1x1),Mrsssqqqq(1x1),,CSddddaaa,,,,,,,,,,,,,,Mh(2x1),,Mh(2x1),,Mhs(1x2),Mhs(1x2)
26 gx(1x1),,,CSddddaaaa,,,,,,,,,,,,,,Mh(2x1),,Mh(2x1)
27 ,,,Ts,,,,,,wc,,,wh,,,ib,,Mr(1x2),Mr(1x2),Mrs(2x1),,Mhs(1x2),Mhs(1x2)
28 y,,,Tw,,,,,,,,,,,,,,,,Mrs(2x1)
29 Y,,,Tl,,,,,,,,,,,,,,Mr(1x2),Mr(1x2),Mrsq(2x1),,Mrsq(2x1)
30 ,,,Tp,,,,,,wf,,,wy,,,ic,,,,Mrsssqqqq(2x1),,Mrsssqqqq(2x1)
31 ,,,Tc
32 ,,,TS
33 ,,,,,,,,,,wv,,,wd,,,wj,,,wS

@ -1,33 +0,0 @@
#build label(build)
a,Mg,,CS,trackN
b,Mh(1x1),S,CSa,trackS,,,,,,Mw,,,wm,,,wp
c,Mhs(1x1),m,CSaa,trackE,,,,,,,,,,,,,,,,,D
n,Mv,v,CSaaa,trackW,,Msu
,Mr(1x1),j,CSaaaa,trackNS,,,,,,Mws,,,wu,,,ew
d,Mrq(1x1),A,CSd,trackNE,,,Msk
,Mrqq(1x1),R,CSda,trackNW
l,Mrqqq(1x1),N,CSdaa,trackSE,,Msm,,,,we,,,wn,,,es,,,,,k
x,Mrqqqq(1x1),~h,CSdaaa,trackSW
H,Mrs(1x1),~a,CSdaaaa,trackEW,,,Msh
W,Mrsq(1x1),~c,CSdd,trackNSE,,,,,,wq,,,wr,,,el
G,Mrsqq(1x1),F,CSdda,trackNSW
B,Mrsqqq(1x1),o(1x1),CSddaa,trackNEW,,,,,,,,,,,,,,,,,ws
~b,Mrsqqqq(1x1),Cw,CSddaaa,trackSEW,,,,,,wM,,,wt,,,eg
f,Mrss(1x1),Cf,CSddaaaa,trackNSEW
h,Mrssq(1x1),Cr,CSddd,trackrampN
r,Mrssqq(1x1),Cu,CSddda,trackrampS,,,,,,wo,,,wl,,,ea,,,,gx(1x2),gx(1x2)
s,Mrssqqq(1x1),Cd,CSdddaa,trackrampE
~s,Mrssqqqq(1x1),Cx,CSdddaaa,trackrampW,,,,,,,,,,,,,,gd(2x1),,gs(2x1),,ga(2x1)
t,Mrsss(1x1),CF,CSdddaaaa,trackrampNS,,,,,,wk,,,ww,,,ek,,gd(2x1),,gs(2x1),,ga(2x1)
gs(1x1),Mrsssq(1x1),,CSdddd,trackrampNE,,,,,,,,,,,,,,,,gw(1x2),gw(1x2)
ga(1x1),Mrsssqq(1x1),,CSdddda,trackrampNW
gd(1x1),Mrsssqqq(1x1),,CSddddaa,trackrampSE,,,,,,wb,,,wz,,,en
gw(1x1),Mrsssqqqq(1x1),,CSddddaaa,trackrampSW,,,,,,,,,,,,,,Mh(2x1),,Mh(2x1),,Mhs(1x2),Mhs(1x2)
gx(1x1),,,CSddddaaaa,trackrampEW,,,,,,,,,,,,,,Mh(2x1),,Mh(2x1)
,,,Ts,trackrampNSE,,,,,,wc,,,wh,,,ib,,Mr(1x2),Mr(1x2),Mrs(2x1),,Mhs(1x2),Mhs(1x2)
y,,,Tw,trackrampNSW,,,,,,,,,,,,,,,,Mrs(2x1)
Y,,,Tl,trackrampNEW,,,,,,,,,,,,,,Mr(1x2),Mr(1x2),Mrsq(2x1),,Mrsq(2x1)
,,,Tp,trackrampSEW,,,,,,wf,,,wy,,,ic,,,,Mrsssqqqq(2x1),,Mrsssqqqq(2x1)
,,,Tc,trackrampNSEW
,,,TS
,,,,,,,,,,wv,,,wd,,,wj,,,wS
1 #build label(build)
2 a,Mg,,CS,trackN
3 b,Mh(1x1),S,CSa,trackS,,,,,,Mw,,,wm,,,wp
4 c,Mhs(1x1),m,CSaa,trackE,,,,,,,,,,,,,,,,,D
5 n,Mv,v,CSaaa,trackW,,Msu
6 ,Mr(1x1),j,CSaaaa,trackNS,,,,,,Mws,,,wu,,,ew
7 d,Mrq(1x1),A,CSd,trackNE,,,Msk
8 ,Mrqq(1x1),R,CSda,trackNW
9 l,Mrqqq(1x1),N,CSdaa,trackSE,,Msm,,,,we,,,wn,,,es,,,,,k
10 x,Mrqqqq(1x1),~h,CSdaaa,trackSW
11 H,Mrs(1x1),~a,CSdaaaa,trackEW,,,Msh
12 W,Mrsq(1x1),~c,CSdd,trackNSE,,,,,,wq,,,wr,,,el
13 G,Mrsqq(1x1),F,CSdda,trackNSW
14 B,Mrsqqq(1x1),o(1x1),CSddaa,trackNEW,,,,,,,,,,,,,,,,,ws
15 ~b,Mrsqqqq(1x1),Cw,CSddaaa,trackSEW,,,,,,wM,,,wt,,,eg
16 f,Mrss(1x1),Cf,CSddaaaa,trackNSEW
17 h,Mrssq(1x1),Cr,CSddd,trackrampN
18 r,Mrssqq(1x1),Cu,CSddda,trackrampS,,,,,,wo,,,wl,,,ea,,,,gx(1x2),gx(1x2)
19 s,Mrssqqq(1x1),Cd,CSdddaa,trackrampE
20 ~s,Mrssqqqq(1x1),Cx,CSdddaaa,trackrampW,,,,,,,,,,,,,,gd(2x1),,gs(2x1),,ga(2x1)
21 t,Mrsss(1x1),CF,CSdddaaaa,trackrampNS,,,,,,wk,,,ww,,,ek,,gd(2x1),,gs(2x1),,ga(2x1)
22 gs(1x1),Mrsssq(1x1),,CSdddd,trackrampNE,,,,,,,,,,,,,,,,gw(1x2),gw(1x2)
23 ga(1x1),Mrsssqq(1x1),,CSdddda,trackrampNW
24 gd(1x1),Mrsssqqq(1x1),,CSddddaa,trackrampSE,,,,,,wb,,,wz,,,en
25 gw(1x1),Mrsssqqqq(1x1),,CSddddaaa,trackrampSW,,,,,,,,,,,,,,Mh(2x1),,Mh(2x1),,Mhs(1x2),Mhs(1x2)
26 gx(1x1),,,CSddddaaaa,trackrampEW,,,,,,,,,,,,,,Mh(2x1),,Mh(2x1)
27 ,,,Ts,trackrampNSE,,,,,,wc,,,wh,,,ib,,Mr(1x2),Mr(1x2),Mrs(2x1),,Mhs(1x2),Mhs(1x2)
28 y,,,Tw,trackrampNSW,,,,,,,,,,,,,,,,Mrs(2x1)
29 Y,,,Tl,trackrampNEW,,,,,,,,,,,,,,Mr(1x2),Mr(1x2),Mrsq(2x1),,Mrsq(2x1)
30 ,,,Tp,trackrampSEW,,,,,,wf,,,wy,,,ic,,,,Mrsssqqqq(2x1),,Mrsssqqqq(2x1)
31 ,,,Tc,trackrampNSEW
32 ,,,TS
33 ,,,,,,,,,,wv,,,wd,,,wj,,,wS

@ -0,0 +1,2 @@
#place label(place)
s(5x3)
1 #place label(place)
2 s(5x3)

@ -0,0 +1,5 @@
#notes
description=integration test for the gui/quantum script
width=5
height=5
extra_fn=gui_quantum
1 #notes
2 description=integration test for the gui/quantum script
3 width=5
4 height=5
5 extra_fn=gui_quantum

@ -1,12 +1,3 @@
#build label(big) hidden()
gw(1x2),gx(1x2),gd(2x1),,gs(1x2)
,,ga(2x1)
,,Msk,Mrsqq(2x1)
Mw,,,Msh,CSddddaaaa
,Mw,Mrss(1x2),,CSa
Mhs(1x2),,,Msm
,,Mws,,Msu
Mh(2x1),,,Mws
#build label(outer) hidden()
trackN,trackS,trackE,,trackW,trackNS
trackNE,trackNW,trackSE,,trackSW
@ -19,10 +10,9 @@ trackrampN,trackrampNS,trackrampNE
trackrampNSE,trackrampNSW
trackrampNSEW
#meta label(chunk) hidden()
/big shift(1 -13)
/outer shift(7 -13)
/inner shift(1 -4)
#meta label(build)
#meta label(construct)
/chunk
/chunk transform(cw)
/chunk transform(cw cw)
1 #build label(big) hidden() #build label(outer) hidden()
#build label(big) hidden()
gw(1x2),gx(1x2),gd(2x1),,gs(1x2)
,,ga(2x1)
,,Msk,Mrsqq(2x1)
Mw,,,Msh,CSddddaaaa
,Mw,Mrss(1x2),,CSa
Mhs(1x2),,,Msm
,,Mws,,Msu
Mh(2x1),,,Mws
1 #build label(outer) hidden() #build label(outer) hidden()
2 trackN,trackS,trackE,,trackW,trackNS trackN,trackS,trackE,,trackW,trackNS
3 trackNE,trackNW,trackSE,,trackSW trackNE,trackNW,trackSE,,trackSW
10 trackrampNSEW trackrampNSEW
11 #meta label(chunk) hidden() #meta label(chunk) hidden()
12 /big shift(1 -13) /outer shift(7 -13)
/outer shift(7 -13)
13 /inner shift(1 -4) /inner shift(1 -4)
14 #meta label(build) #meta label(construct)
15 /chunk /chunk
16 /chunk transform(cw) /chunk transform(cw)
17 /chunk transform(cw cw) /chunk transform(cw cw)
18 /chunk transform(ccw) /chunk transform(ccw)

@ -0,0 +1,20 @@
#build label(big) hidden()
gw(1x2),gx(1x2),gd(2x1),,gs(1x2)
,,ga(2x1)
,,Msk,Mrsqq(2x1)
Mw,,,Msh,CSddddaaaa
,Mw,Mrss(1x2),,CSa
Mhs(1x2),,,Msm
,,Mws,,Msu
Mh(2x1),,,Mws
#meta label(chunk) hidden()
/big shift(1 -13)
#meta label(build)
/chunk
/chunk transform(cw)
/chunk transform(cw cw)
/chunk transform(ccw)
/chunk transform(fliph)
/chunk transform(flipv)
/chunk transform(cw flipv)
/chunk transform(ccw flipv)
1 #build label(big) hidden()
2 gw(1x2),gx(1x2),gd(2x1),,gs(1x2)
3 ,,ga(2x1)
4 ,,Msk,Mrsqq(2x1)
5 Mw,,,Msh,CSddddaaaa
6 ,Mw,Mrss(1x2),,CSa
7 Mhs(1x2),,,Msm
8 ,,Mws,,Msu
9 Mh(2x1),,,Mws
10 #meta label(chunk) hidden()
11 /big shift(1 -13)
12 #meta label(build)
13 /chunk
14 /chunk transform(cw)
15 /chunk transform(cw cw)
16 /chunk transform(ccw)
17 /chunk transform(fliph)
18 /chunk transform(flipv)
19 /chunk transform(cw flipv)
20 /chunk transform(ccw flipv)

@ -1,31 +1,34 @@
# This dfhack config file automates common tasks for your forts.
# It was written for the Dreamfort set of quickfort blueprints, but the
# configuration here is useful for any fort! Feed free to edit or override
# configuration here is useful for any fort! Copy this file to your
# dfhack-config/init directory to use. Feed free to edit or override
# to your liking.
# Disallow cooking of otherwise useful item types
on-new-fortress ban-cooking tallow; ban-cooking honey; ban-cooking oil; ban-cooking seeds; ban-cooking brew; ban-cooking fruit; ban-cooking mill; ban-cooking thread; ban-cooking milk; ban-cooking booze
# Uncomment this next line if you want buildingplan (and quickfort) to use only
# blocks for construction. If you do uncomment, be sure to bring some blocks
# with you for starting workshops!
# blocks (not bars or logs) for constructions and workshops. If you do
# uncomment, be sure to bring some blocks with you for starting workshops!
#on-new-fortress buildingplan set boulders false; buildingplan set logs false
# Disable cooking of useful item types when you start a new fortress.
on-new-fortress ban-cooking tallow; ban-cooking honey; ban-cooking oil; ban-cooking seeds; ban-cooking brew; ban-cooking fruit; ban-cooking mill; ban-cooking thread; ban-cooking milk; ban-cooking booze
# Show a warning dialog when units are starving
repeat -name warn-starving -time 10 -timeUnits days -command [ warn-starving ]
repeat -name burial -time 7 -timeUnits days -command [ burial -pets ]
# Force dwarves to drop tattered clothing instead of clinging to the scraps
repeat -name cleanowned -time 1 -timeUnits months -command [ cleanowned X ]
repeat -name clean -time 1 -timeUnits months -command [ clean all ]
repeat -name feeding-timers -time 1 -timeUnits months -command [ fix/feeding-timers ]
repeat -name stuckdoors -time 1 -timeUnits months -command [ fix/stuckdoors ]
# Automatically enqueue orders to shear and milk animals
repeat -name autoShearCreature -time 14 -timeUnits days -command [ workorder ShearCreature ]
repeat -name autoMilkCreature -time 14 -timeUnits days -command [ workorder "{\"job\":\"MilkCreature\",\"item_conditions\":[{\"condition\":\"AtLeast\",\"value\":2,\"flags\":[\"empty\"],\"item_type\":\"BUCKET\"}]}" ]
# Fulfill high-volume orders before slower once-daily orders
repeat -name orders-sort -time 1 -timeUnits days -command [ orders sort ]
tweak fast-heat 100
tweak do-job-now
fix/blood-del enable
# Don't let caravans bring barrels of blood and other useless liquids
fix/blood-del
# manages crop assignment for farm plots
# Manages crop assignment for farm plots
enable autofarm
autofarm default 30
autofarm threshold 150 GRASS_TAIL_PIG
@ -35,26 +38,18 @@ enable automelt
# creates manager orders to produce replacements for worn clothing
enable tailor
tailor enable
# auto-assigns nesting birds to nestbox zones
enable zone nestboxes
autonestbox start
# auto-assigns nesting birds to nestbox zones and protects fertile eggs from
# being cooked/eaten
enable zone autonestbox nestboxes
# manages seed stocks
enable seedwatch
seedwatch all 30
seedwatch start
# ensures important tasks get assigned to workers.
# otherwise these job types can get ignored in busy forts.
prioritize -a StoreItemInVehicle StoreItemInBag StoreItemInBarrel PullLever
prioritize -a StoreItemInLocation StoreItemInHospital
prioritize -a DestroyBuilding RemoveConstruction RecoverWounded DumpItem
prioritize -a CleanSelf SlaughterAnimal PrepareRawFish ExtractFromRawFish
prioritize -a TradeAtDepot BringItemToDepot CleanTrap ManageWorkOrders
prioritize -a --haul-labor=Food,Body StoreItemInStockpile
prioritize -a --reaction-name=TAN_A_HIDE CustomReaction
prioritize -aq defaults
# autobutcher settings are saved in the savegame, so we only need to set them once.
# this way, any custom settings you set during gameplay are not overwritten
@ -62,6 +57,7 @@ prioritize -a --reaction-name=TAN_A_HIDE CustomReaction
# feel free to change this to "target 0 0 0 0" if you don't expect to want to raise
# any animals not listed here -- you can always change it anytime during the game
# later if you change your mind.
on-new-fortress enable autobutcher
on-new-fortress autobutcher target 2 2 2 2 new
# dogs and cats. You should raise the limits for dogs if you will be training them
# for hunting or war.
@ -77,7 +73,7 @@ on-new-fortress autobutcher target 50 50 14 2 BIRD_GOOSE
on-new-fortress autobutcher target 2 2 4 2 ALPACA SHEEP LLAMA
# pigs give milk and meat and are zero-maintenance.
on-new-fortress autobutcher target 5 5 6 2 PIG
# generally unprofitable animals
# immediately butcher all unprofitable animals
on-new-fortress autobutcher target 0 0 0 0 HORSE YAK DONKEY WATER_BUFFALO GOAT CAVY BIRD_DUCK BIRD_GUINEAFOWL
# start it up!
on-new-fortress autobutcher start; autobutcher watch all; autobutcher autowatch
# watch for new animals
on-new-fortress autobutcher autowatch

@ -0,0 +1,8 @@
# Default DFHack commands to run on program init
# Please do not edit this file directly. It will be overwritten with new
# defaults when you update DFHack. Instead, add your configuration to
# dfhack-config/init/dfhack.init
script hack/init/dfhack.keybindings.init
script hack/init/dfhack.tools.init

@ -1,11 +1,28 @@
##############################
# Generic dwarfmode bindings #
##############################
# Default DFHack keybindings
# Please do not edit this file directly. It will be overwritten with new
# defaults when you update DFHack. Instead, add your configuration to
# dfhack-config/init/dfhack.init
###################
# Global bindings #
###################
# the GUI command launcher (two bindings since some keyboards don't have `)
keybinding add ` gui/launcher
keybinding add Ctrl-Shift-D gui/launcher
# show all current key bindings
keybinding add Ctrl-F1 hotkeys
keybinding add Alt-F1 hotkeys
# on-screen keyboard
keybinding add Ctrl-Shift-K gui/cp437-table
##############################
# Generic dwarfmode bindings #
##############################
# toggle the display of water level as 1-7 tiles
keybinding add Ctrl-W twaterlvl
@ -34,6 +51,10 @@ keybinding add Ctrl-K autodump-destroy-item
# quicksave, only in main dwarfmode screen and menu page
keybinding add Ctrl-Alt-S@dwarfmode/Default quicksave
# apply blueprints to the map (Alt-F for compatibility with LNP Quickfort)
keybinding add Ctrl-Shift-Q@dwarfmode gui/quickfort
keybinding add Alt-F@dwarfmode gui/quickfort
# gui/rename script - rename units and buildings
keybinding add Ctrl-Shift-N gui/rename
keybinding add Ctrl-Shift-T "gui/rename unit-profession"
@ -58,12 +79,21 @@ keybinding add Alt-Q@jobmanagement/Main gui/manager-quantity
# re-check manager orders
keybinding add Alt-R@jobmanagement/Main workorder-recheck
# workorder detail configuration
keybinding add D@workquota_details gui/workorder-details
# view combat reports for the selected unit/corpse/spatter
keybinding add Ctrl-Shift-R view-unit-reports
# view extra unit information
keybinding add Alt-I@dwarfmode/ViewUnits|unitlist gui/unit-info-viewer
# set workorder item details (on workorder details screen press D again)
keybinding add D@workquota_details gui/workorder-details
# boost priority of jobs related to the selected entity
keybinding add Alt-N do-job-now
##############################
# Generic adv mode bindings #
##############################
@ -155,139 +185,5 @@ keybinding add Alt-W@dfhack/lua/status_overlay "gui/workflow status"
# autobutcher front-end
keybinding add Shift-B@pet/List/Unit "gui/autobutcher"
# assign weapon racks to squads so that they can be used
keybinding add P@dwarfmode/QueryBuilding/Some/Weaponrack gui/assign-rack
# view pathable tiles from active cursor
keybinding add Alt-Shift-P@dwarfmode/LookAround gui/pathable
############################
# UI and game logic tweaks #
############################
# stabilize the cursor of dwarfmode when switching menus
tweak stable-cursor
# stop stacked liquid/bar/thread/cloth items from lasting forever
# if used in reactions that use only a fraction of the dimension.
# might be fixed by DF
# tweak fix-dimensions
# make reactions requiring containers usable in advmode - the issue is
# that the screen asks for those reagents to be selected directly
tweak advmode-contained
# support Shift-Enter in Trade and Move Goods to Depot screens for faster
# selection; it selects the current item or stack and scrolls down one line
tweak fast-trade
# stop the right list in military->positions from resetting to top all the time
tweak military-stable-assign
# in same list, color units already assigned to squads in brown & green
tweak military-color-assigned
# remove inverse dependency of squad training speed on unit list size and use more sparring
# tweak military-training
# make crafted cloth items wear out with time like in old versions (bug 6003)
tweak craft-age-wear
# stop adamantine clothing from wearing out (bug 6481)
#tweak adamantine-cloth-wear
# Add "Select all" and "Deselect all" options to farm plot menus
tweak farm-plot-select
# Add Shift-Left/Right controls to import agreement screen
tweak import-priority-category
# Fixes a crash in the work order contition material list (bug 9905).
tweak condition-material
# Adds an option to clear currently-bound hotkeys
tweak hotkey-clear
# Allows lowercase letters in embark profile names, and allows exiting the name prompt without saving
tweak embark-profile-name
# Misc. UI tweaks
tweak block-labors # Prevents labors that can't be used from being toggled
tweak burrow-name-cancel
tweak cage-butcher
tweak civ-view-agreement
tweak eggs-fertile
tweak fps-min
tweak hide-priority
tweak kitchen-prefs-all
tweak kitchen-prefs-empty
tweak max-wheelbarrow
tweak shift-8-scroll
tweak stone-status-all
tweak title-start-rename
tweak tradereq-pet-gender
###########################
# Globally acting plugins #
###########################
# Display DFHack version on title screen
enable title-version
# Dwarf Manipulator (simple in-game Dwarf Therapist replacement)
enable manipulator
# Search tool in various screens (by falconne)
enable search
# Improved build material selection interface (by falconne)
enable automaterial
# Other interface improvement tools
enable \
confirm \
dwarfmonitor \
mousequery \
autogems \
autodump \
automelt \
autotrade \
buildingplan \
resume \
trackstop \
zone \
stocks \
autochop \
stockpiles
#end a line with a backslash to make it continue to the next line. The \ is deleted for the final command.
# Multiline commands are ONLY supported for scripts like dfhack.init. You cannot do multiline command manually on the DFHack console.
# You cannot extend a commented line.
# You can comment out the extension of a line.
# enable mouse controls and sand indicator in embark screen
embark-tools enable sticky sand mouse
# enable option to enter embark assistant
enable embark-assistant
###########
# Scripts #
###########
# write extra information to the gamelog
modtools/extra-gamelog enable
# extended status screen (bedrooms page)
enable gui/extended-status
# add information to item viewscreens
view-item-info enable
# a replacement for the "load game" screen
gui/load-screen enable
##############################
# Extra DFHack command files #
##############################
# Run commands in this file when a world loads
sc-script add SC_WORLD_LOADED onLoad.init-example

@ -0,0 +1,131 @@
# Default DFHack tool configuration
# Please do not edit this file directly. It will be overwritten with new
# defaults when you update DFHack. Instead, add your configuration to
# dfhack-config/init/dfhack.init
############################
# UI and game logic tweaks #
############################
# stabilize the cursor of dwarfmode when switching menus
tweak stable-cursor
# stop stacked liquid/bar/thread/cloth items from lasting forever
# if used in reactions that use only a fraction of the dimension.
# might be fixed by DF
# tweak fix-dimensions
# make reactions requiring containers usable in advmode - the issue is
# that the screen asks for those reagents to be selected directly
tweak advmode-contained
# support Shift-Enter in Trade and Move Goods to Depot screens for faster
# selection; it selects the current item or stack and scrolls down one line
tweak fast-trade
# stop the right list in military->positions from resetting to top all the time
tweak military-stable-assign
# in same list, color units already assigned to squads in brown & green
tweak military-color-assigned
# make crafted cloth items wear out with time like in old versions (bug 6003)
tweak craft-age-wear
# stop adamantine clothing from wearing out (bug 6481)
#tweak adamantine-cloth-wear
# Add "Select all" and "Deselect all" options to farm plot menus
tweak farm-plot-select
# Add Shift-Left/Right controls to import agreement screen
tweak import-priority-category
# Fixes a crash in the work order contition material list (bug 9905).
tweak condition-material
# Adds an option to clear currently-bound hotkeys
tweak hotkey-clear
# Allows lowercase letters in embark profile names, and allows exiting the name prompt without saving
tweak embark-profile-name
# Reduce performance impact of temperature changes
tweak fast-heat 100
# Misc. UI tweaks
tweak block-labors # Prevents labors that can't be used from being toggled
tweak burrow-name-cancel
tweak cage-butcher
tweak civ-view-agreement
tweak do-job-now
tweak eggs-fertile
tweak fps-min
tweak hide-priority
tweak kitchen-prefs-all
tweak kitchen-prefs-empty
tweak max-wheelbarrow
tweak partial-items
tweak shift-8-scroll
tweak stone-status-all
tweak title-start-rename
tweak tradereq-pet-gender
###########################
# Globally acting plugins #
###########################
# Display DFHack version on title screen
enable title-version
# Dwarf Manipulator (simple in-game Dwarf Therapist replacement)
enable manipulator
# Search tool in various screens (by falconne)
enable search
# Improved build material selection interface (by falconne)
enable automaterial
# Other interface improvement tools
enable \
confirm \
dwarfmonitor \
mousequery \
autogems \
autodump \
automelt \
autotrade \
buildingplan \
resume \
trackstop \
zone \
stocks \
autochop \
stockpiles
#end a line with a backslash to make it continue to the next line. The \ is deleted for the final command.
# Multiline commands are ONLY supported for scripts like dfhack.init. You cannot do multiline command manually on the DFHack console.
# You cannot extend a commented line.
# You can comment out the extension of a line.
# enable mouse controls and sand indicator in embark screen
embark-tools enable sticky sand mouse
# enable option to enter embark assistant
enable embark-assistant
###########
# Scripts #
###########
# write extra information to the gamelog
modtools/extra-gamelog enable
# extended status screen (bedrooms page)
enable gui/extended-status
# add information to item viewscreens
view-item-info enable
# a replacement for the "load game" screen
gui/load-screen enable

@ -0,0 +1,5 @@
# Default DFHack commands to run when a world is loaded
# Please do not edit this file directly. It will be overwritten with new
# defaults when you update DFHack. Instead, add your configuration to
# dfhack-config/init/onLoad.init

@ -0,0 +1,6 @@
# Default DFHack commands to run when a map is loaded, either in
# adventure or fort mode.
# Please do not edit this file directly. It will be overwritten with new
# defaults when you update DFHack. Instead, add your configuration to
# dfhack-config/init/onMapLoad.init

@ -0,0 +1,5 @@
# Default DFHack commands to run when a map is unloaded
# Please do not edit this file directly. It will be overwritten with new
# defaults when you update DFHack. Instead, add your configuration to
# dfhack-config/init/onMapUnload.init

@ -0,0 +1,5 @@
# Default DFHack commands to run when a world is unloaded
# Please do not edit this file directly. It will be overwritten with new
# defaults when you update DFHack. Instead, add your configuration to
# dfhack-config/init/onUnload.init

@ -1,12 +1,34 @@
[
{
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"amount_left" : 150,
"amount_total" : 150,
"frequency" : "Monthly",
"id" : 0,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
[
{
"condition" : "LessThan",
"flags" :
[
"unrotten"
],
"item_type" : "FOOD",
"value" : 400
}
],
"job" : "PrepareMeal",
"meal_ingredients" : 2
},
{
"amount_left" : 10,
"amount_total" : 10,
"frequency" : "Daily",
"id" : 1,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
[
{
"condition" : "AtLeast",
@ -25,7 +47,7 @@
"unrotten",
"cookable"
],
"value" : 15
"value" : 500
},
{
"condition" : "AtMost",
@ -35,6 +57,15 @@
],
"item_type" : "FOOD",
"value" : 3500
},
{
"condition" : "AtLeast",
"flags" :
[
"unrotten"
],
"item_type" : "FOOD",
"value" : 400
}
],
"job" : "PrepareMeal",
@ -44,7 +75,7 @@
"amount_left" : 2,
"amount_total" : 2,
"frequency" : "Daily",
"id" : 1,
"id" : 2,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -81,7 +112,7 @@
"amount_left" : 2,
"amount_total" : 2,
"frequency" : "Daily",
"id" : 2,
"id" : 3,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -118,7 +149,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 3,
"id" : 4,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -139,7 +170,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 4,
"id" : 5,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -174,7 +205,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 5,
"id" : 6,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -206,7 +237,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 6,
"id" : 7,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -238,7 +269,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 7,
"id" : 8,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -260,7 +291,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 8,
"id" : 9,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -293,7 +324,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 9,
"id" : 10,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -324,7 +355,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 10,
"id" : 11,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -357,7 +388,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 11,
"id" : 12,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -397,7 +428,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 12,
"id" : 13,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -423,7 +454,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 13,
"id" : 14,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -458,7 +489,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 14,
"id" : 15,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -493,7 +524,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 15,
"id" : 16,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -524,37 +555,6 @@
"yarn"
]
},
{
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 16,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
[
{
"condition" : "AtLeast",
"flags" :
[
"collected",
"dyeable"
],
"item_type" : "THREAD",
"value" : 5
},
{
"condition" : "AtLeast",
"flags" :
[
"unrotten",
"dye"
],
"value" : 15
}
],
"job" : "DyeThread"
},
{
"amount_left" : 1,
"amount_total" : 1,
@ -580,7 +580,7 @@
"unrotten",
"dye"
],
"value" : 15
"value" : 3
}
],
"job" : "DyeCloth"
@ -613,7 +613,6 @@
],
"item_subtype" : "ITEM_TOOL_LARGE_POT",
"item_type" : "TOOL",
"material" : "INORGANIC",
"value" : 25
}
],
@ -632,13 +631,7 @@
[
{
"condition" : "AtLeast",
"flags" :
[
"non_economic",
"hard"
],
"item_type" : "BOULDER",
"material" : "INORGANIC",
"item_type" : "WOOD",
"value" : 20
},
{
@ -649,13 +642,15 @@
],
"item_subtype" : "ITEM_TOOL_JUG",
"item_type" : "TOOL",
"material" : "INORGANIC",
"value" : 10
}
],
"item_subtype" : "ITEM_TOOL_JUG",
"job" : "MakeTool",
"material" : "INORGANIC"
"material_category" :
[
"wood"
]
},
{
"amount_left" : 1,
@ -995,7 +990,7 @@
"frequency" : "Daily",
"id" : 31,
"is_active" : false,
"is_validated" : true,
"is_validated" : false,
"item_conditions" :
[
{
@ -1366,7 +1361,7 @@
"frequency" : "Daily",
"id" : 44,
"is_active" : false,
"is_validated" : true,
"is_validated" : false,
"item_conditions" :
[
{

@ -1,4 +1,4 @@
NAME Chef
NAME library/Chef
BUTCHER
TANNER
COOK

@ -1,4 +1,4 @@
NAME Craftsdwarf
NAME library/Craftsdwarf
WOOD_CRAFT
STONE_CRAFT
BONE_CARVE

@ -1,4 +1,4 @@
NAME Doctor
NAME library/Doctor
ANIMALCARE
DIAGNOSE
SURGERY

@ -1,4 +1,4 @@
NAME Farmer
NAME library/Farmer
PLANT
MILLER
BREWER

@ -1,4 +1,4 @@
NAME Fisherdwarf
NAME library/Fisherdwarf
FISH
CLEAN_FISH
DISSECT_FISH

@ -1,4 +1,4 @@
NAME Hauler
NAME library/Hauler
FEED_WATER_CIVILIANS
SIEGEOPERATE
MECHANIC

@ -1,4 +1,4 @@
NAME Laborer
NAME library/Laborer
SOAP_MAKER
BURN_WOOD
POTASH_MAKING

@ -1,4 +1,4 @@
NAME Marksdwarf
NAME library/Marksdwarf
MECHANIC
HAUL_STONE
HAUL_WOOD

@ -1,4 +1,4 @@
NAME Mason
NAME library/Mason
MASON
CUT_GEM
ENCRUST_GEM

@ -1,4 +1,4 @@
NAME Meleedwarf
NAME library/Meleedwarf
RECOVER_WOUNDED
MECHANIC
HAUL_STONE

@ -1,4 +1,4 @@
NAME Migrant
NAME library/Migrant
FEED_WATER_CIVILIANS
SIEGEOPERATE
MECHANIC

@ -1,4 +1,4 @@
NAME Miner
NAME library/Miner
MINE
DETAIL
RECOVER_WOUNDED

@ -1,4 +1,4 @@
NAME Outdoorsdwarf
NAME library/Outdoorsdwarf
CARPENTER
BOWYER
CUTWOOD

@ -1,4 +1,4 @@
NAME Smith
NAME library/Smith
FORGE_WEAPON
FORGE_ARMOR
FORGE_FURNITURE

@ -1,4 +1,4 @@
NAME StartManager
NAME library/StartManager
CUTWOOD
ANIMALCARE
DIAGNOSE

@ -1,4 +1,4 @@
NAME Tailor
NAME library/Tailor
DYER
LEATHER
WEAVER

@ -77,6 +77,11 @@ give10right: {give move={Right 10}}
togglesequence: &{Down}
togglesequence2: &{Down 2}
# these aliases use the DFHack "search" plugin to filter the right column
forbidsearch: s{search}&f{Left}{Right}
permitsearch: s{search}&p{Left}{Right}
togglesearch: s{search}&&{Left}{Right}
masterworkonly: {prefix}{Right}{Up 2}f{Right}{Up 2}&^
artifactonly: {prefix}{Right}{Up 2}f{Right}{Up}&^
@ -116,7 +121,7 @@ plants: {foodprefix}b{Right}{Down 4}p^
booze: {foodprefix}b{Right}{Down 5}p{Down}p^
seeds: {foodprefix}b{Right}{Down 9}p^
dye: {foodprefix}b{Right}{Down 11}{Right}{Down 28}{togglesequence 4}^
tallow: {foodprefix}b{Right}{Down 13}{Right}stallow&p^
tallow: {foodprefix}b{Right}{Down 13}{Right}{permitsearch search=tallow}^
miscliquid: {foodprefix}b{Right}{Down 18}p^
wax: {foodprefix}b{Right}{Down 15}{Right}{Down 6}&^
@ -126,7 +131,7 @@ forbidplants: {foodprefix}{Right}{Down 4}f^
forbidbooze: {foodprefix}{Right}{Down 5}f{Down}f^
forbidseeds: {foodprefix}{Right}{Down 9}f^
forbiddye: {foodprefix}{Right}{Down 11}{Right}{Down 28}{togglesequence 4}^
forbidtallow: {foodprefix}{Right}{Down 13}{Right}stallow&f^
forbidtallow: {foodprefix}{Right}{Down 13}{Right}{forbidsearch search=tallow}^
forbidmiscliquid: {foodprefix}{Right}{Down 18}f^
forbidwax: {foodprefix}{Right}{Down 15}{Right}{Down 6}&^
@ -136,7 +141,7 @@ permitplants: {foodprefix}{Right}{Down 4}p^
permitbooze: {foodprefix}{Right}{Down 5}p{Down}p^
permitseeds: {foodprefix}{Right}{Down 9}p^
permitdye: {forbiddye}
permittallow: {foodprefix}{Right}{Down 13}{Right}stallow&p^
permittallow: {foodprefix}{Right}{Down 13}{Right}{permitsearch search=tallow}^
permitmiscliquid: {foodprefix}{Right}{Down 18}p^
permitwax: {forbidwax}
@ -200,7 +205,8 @@ shells: {refuseprefix}b{Right}{Down 5}p^
teeth: {refuseprefix}b{Right}{Down 6}p^
horns: {refuseprefix}b{Right}{Down 7}p^
hair: {refuseprefix}b{Right}{Down 8}p^
craftrefuse: {skulls}{permitbones}{permitshells}{permitteeth}{permithorns}{permithair}
usablehair: {refuseprefix}b{Right}{Down 8}{Right}{togglesearch search=sheep}{togglesearch search=llama}{togglesearch search=alpaca}{togglesearch search=troll}^
craftrefuse: {skulls}{permitbones}{permitshells}{permitteeth}{permithorns}{permitusablehair}
forbidcorpses: {refuseprefix}{Right}{Down}f^
forbidrawhides: {refuseprefix}{Right 2}{Down}&^
@ -211,7 +217,8 @@ forbidshells: {refuseprefix}{Right}{Down 5}f^
forbidteeth: {refuseprefix}{Right}{Down 6}f^
forbidhorns: {refuseprefix}{Right}{Down 7}f^
forbidhair: {refuseprefix}{Right}{Down 8}f^
forbidcraftrefuse: {forbidskulls}{forbidbones}{forbidshells}{forbidteeth}{forbidhorns}{forbidhair}
forbidusablehair: {refuseprefix}{Right}{Down 8}{Right}{forbidsearch search=sheep}{forbidsearch search=llama}{forbidsearch search=alpaca}{forbidsearch search=troll}^
forbidcraftrefuse: {forbidskulls}{forbidbones}{forbidshells}{forbidteeth}{forbidhorns}{forbidusablehair}
permitcorpses: {refuseprefix}{Right}{Down}p^
permitrawhides: {forbidrawhides}
@ -222,7 +229,8 @@ permitshells: {refuseprefix}{Right}{Down 5}p^
permitteeth: {refuseprefix}{Right}{Down 6}p^
permithorns: {refuseprefix}{Right}{Down 7}p^
permithair: {refuseprefix}{Right}{Down 8}p^
permitcraftrefuse: {permitskulls}{permitbones}{permitshells}{permitteeth}{permithorns}{permithair}
permitusablehair: {refuseprefix}{Right}{Down 8}{Right}{permitsearch search=sheep}{permitsearch search=llama}{permitsearch search=alpaca}{permitsearch search=troll}^
permitcraftrefuse: {permitskulls}{permitbones}{permitshells}{permitteeth}{permithorns}{permitusablehair}
##################################
@ -352,9 +360,11 @@ finishedgoodsprefix: {enter_sp_config}{Down 10}
enablefinishedgoods: {finishedgoodsprefix}e^
disablefinishedgoods: {finishedgoodsprefix}d^
crafts: {finishedgoodsprefix}{Right}f{Right}{Down 9}{togglesequence 9}^
goblets: {finishedgoodsprefix}{Right}f{Right}{Down 2}&^
jugs: {finishedgoodsprefix}{Right}f{Right}{Up 2}&{Left}{Down 2}f{Down}f{Down}f^
crafts: {finishedgoodsprefix}{Right}f{Right}{Down 9}{togglesequence 9}^
goblets: {finishedgoodsprefix}{Right}f{Right}{Down 2}&^
jugs: {finishedgoodsprefix}{Right}f{Right}{Up 2}&{Left}{Down 2}f{Down}f{Down}f^
stonetools: {finishedgoodsprefix}{Right}f{Right}{Up 2}&{Left}{Down 2}f{Down}f{Down}f^
woodentools: {finishedgoodsprefix}{Right}f{Right}{Up 2}&{Left}{Down}f{Down}f{Down}f{Down}f{Right}&^
forbidcrafts: {finishedgoodsprefix}{Right 2}{Down 9}{togglesequence 9}^
forbidgoblets: {finishedgoodsprefix}{Right 2}{Down 2}&^
@ -385,6 +395,15 @@ adamantinethread: {clothprefix}b{Right}{Down 3}p^
cloth: {clothprefix}b{Right}{Down 4}p{Down}p{Down}p^
adamantinecloth: {clothprefix}b{Right}{Up}p^
forbidthread: {clothprefix}{Right}f{Down}f{Down}f^
forbidadamantinethread: {clothprefix}{Right}{Down 3}f^
forbidcloth: {clothprefix}{Right}{Down 4}f{Down}f{Down}f^
forbidadamantinecloth: {clothprefix}{Right}{Up}f^
permitthread: {clothprefix}{Right}p{Down}p{Down}p^
permitadamantinethread: {clothprefix}{Right}{Down 3}p^
permitcloth: {clothprefix}{Right}{Down 4}p{Down}p{Down}p^
permitadamantinecloth: {clothprefix}{Right}{Up}p^
##################################
# weapon stockpile adjustments

@ -12,10 +12,11 @@ endif()
add_subdirectory(tthread)
option(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" OFF)
option(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" OFF)
option(JSONCPP_BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." OFF)
option(JSONCPP_BUILD_OBJECT_LIBS "Build jsoncpp_lib as a object library." OFF)
option(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" OFF)
add_subdirectory(jsoncpp-sub EXCLUDE_FROM_ALL)
if(UNIX)
set_target_properties(jsoncpp_lib_static PROPERTIES COMPILE_FLAGS "-Wno-deprecated-declarations")
endif()
# build clsocket static and only as a dependency. Setting those options here overrides its own default settings.
option(CLSOCKET_SHARED "Build clsocket lib as shared." OFF)
option(CLSOCKET_DEP_ONLY "Build for use inside other CMake projects as dependency." ON)
@ -37,6 +38,7 @@ if(UNIX)
set_target_properties(expat PROPERTIES COMPILE_FLAGS "-Wno-maybe-uninitialized")
endif()
set(CMAKE_REQUIRED_QUIET ON)
set(LIBZIP_BUILD_DOC OFF CACHE BOOL "")
set(LIBZIP_BUILD_EXAMPLES OFF CACHE BOOL "")
set(LIBZIP_BUILD_REGRESS OFF CACHE BOOL "")

@ -1 +1 @@
Subproject commit ae19aebd795d6d91803e60f46de037b604593cb4
Subproject commit 6ed8aa46462ea01a1122fc49422840a2facc9757

@ -1 +1 @@
Subproject commit ddabf50f72cf369bf652a95c4d9fe31a1865a781
Subproject commit ba5eac54136064af94ab4a923ac110d7534d4f83

@ -1 +1 @@
Subproject commit 3c0f2e86ce4e7a3a3b30e765087d02a68bba7e6f
Subproject commit 6ac8628a3c7a1677b27fb007db96f665b684a183

@ -1 +1 @@
Subproject commit da0d18ae59ef2699013316b703cdc93809414c93
Subproject commit 081249cceb59adc857a72d67e60c32047680f787

@ -395,7 +395,7 @@ LUA_API size_t lua_rawlen (lua_State *L, int idx) {
case LUA_TSHRSTR: return tsvalue(o)->shrlen;
case LUA_TLNGSTR: return tsvalue(o)->u.lnglen;
case LUA_TUSERDATA: return uvalue(o)->len;
case LUA_TTABLE: return luaH_getn(hvalue(o));
case LUA_TTABLE: return size_t(luaH_getn(hvalue(o)));
default: return 0;
}
}

@ -1 +1 @@
Subproject commit 87d6ae018cb8d288d854f632e9d8d959d75d7db4
Subproject commit 99d06827848583232dd77afb34cd7ab589567086

@ -1 +1 @@
Subproject commit 4056226fe0df6bff4593ee2353cca07c2b7f327e
Subproject commit 439fdbc259c13f23a3122e68ba35ad5a13bcd97c

@ -2,7 +2,7 @@
"widgets": [
{
"type": "weather",
"x": 1,
"x": 22,
"y": -1
},
{

@ -0,0 +1,7 @@
# Load DFHack defaults.
#
# If you delete this file, it will reappear when you restart DFHack.
# Instead, please comment out the following line if you do not want DFHack to
# load its default configuration.
script hack/init/dfhack.default.init

@ -0,0 +1,7 @@
# Load DFHack defaults.
#
# If you delete this file, it will reappear when you restart DFHack.
# Instead, please comment out the following line if you do not want DFHack to
# load its default configuration.
script hack/init/onLoad.default.init

@ -0,0 +1,7 @@
# Load DFHack defaults.
#
# If you delete this file, it will reappear when you restart DFHack.
# Instead, please comment out the following line if you do not want DFHack to
# load its default configuration.
script hack/init/onMapLoad.default.init

@ -0,0 +1,7 @@
# Load DFHack defaults.
#
# If you delete this file, it will reappear when you restart DFHack.
# Instead, please comment out the following line if you do not want DFHack to
# load its default configuration.
script hack/init/onMapUnload.default.init

@ -0,0 +1,7 @@
# Load DFHack defaults.
#
# If you delete this file, it will reappear when you restart DFHack.
# Instead, please comment out the following line if you do not want DFHack to
# load its default configuration.
script hack/init/onUnload.default.init

@ -0,0 +1,5 @@
# This file runs when DFHack is initialized, when Dwarf Fortress is first
# started, before any world or save data is loaded.
#
# You can extend or override DFHack's default configuration by adding commands
# to this file.

@ -0,0 +1,6 @@
# This file runs when a world is loaded. This happens when you open a save file
# in fort, adventure, or legends mode. If a fort is being loaded, this file runs
# before any onMapLoad.init files.
#
# You can extend or override DFHack's default configuration by adding commands
# to this file.

@ -0,0 +1,5 @@
# This file runs when a map is loaded in adventure or fort mode, after any
# onLoad.init files (which run earlier, when the world is loaded).
#
# You can extend or override DFHack's default configuration by adding commands
# to this file.

Some files were not shown because too many files have changed in this diff Show More