From 42117bb16506b3d4dbe4a995028f9e072e140af8 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Thu, 5 Jan 2023 13:00:04 +1100 Subject: [PATCH 0001/4620] nix the downloaded win32-i386 libs --- CMakeLists.txt | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5877f69c6c..f8a99bb2a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -287,15 +287,9 @@ include(CMake/DownloadFile.cmake) if(WIN32) # Download zlib on Windows set(ZLIB_DOWNLOAD_DIR ${dfhack_SOURCE_DIR}/depends/zlib/lib/win${DFHACK_BUILD_ARCH}) - if(${DFHACK_BUILD_ARCH} STREQUAL "64") - download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win64-zlib.lib" - ${ZLIB_DOWNLOAD_DIR}/zlib.lib - "a3b2fc6b68efafa89b0882e354fc8418") - else() - download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win32-zlib.lib" - ${ZLIB_DOWNLOAD_DIR}/zlib.lib - "f4ebaa21d9de28566e88b1edfcdff901") - endif() + download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win64-zlib.lib" + ${ZLIB_DOWNLOAD_DIR}/zlib.lib + "a3b2fc6b68efafa89b0882e354fc8418") # Move zlib to the build folder so possible 32 and 64-bit builds # in the same source tree don't conflict @@ -307,15 +301,9 @@ if(WIN32) # Do the same for SDLreal.dll # (DFHack doesn't require this at build time, so no need to move it to the build folder) set(SDLREAL_DOWNLOAD_DIR ${dfhack_SOURCE_DIR}/package/windows/win${DFHACK_BUILD_ARCH}) - if(${DFHACK_BUILD_ARCH} STREQUAL "64") - download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win64-SDL.dll" - ${SDLREAL_DOWNLOAD_DIR}/SDLreal.dll - "1ae242c4b94cb03756a1288122a66faf") - else() - download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win32-SDL.dll" - ${SDLREAL_DOWNLOAD_DIR}/SDLreal.dll - "5a09604daca6b2b5ce049d79af935d6a") - endif() + download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win64-SDL.dll" + ${SDLREAL_DOWNLOAD_DIR}/SDLreal.dll + "1ae242c4b94cb03756a1288122a66faf") endif() if(APPLE) From 7a6946654e47c47083a273602e3594f715af9708 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Thu, 5 Jan 2023 13:00:36 +1100 Subject: [PATCH 0002/4620] remove the currently non-functional win32 build dir --- build/win32/build-debug.bat | 4 ---- build/win32/build-release.bat | 5 ----- build/win32/generate-MSVC-all.bat | 6 ----- build/win32/generate-MSVC-gui.bat | 7 ------ build/win32/generate-MSVC-minimal.bat | 6 ----- build/win32/generate-MSVC-release.bat | 6 ----- build/win32/install-debug.bat | 4 ---- build/win32/install-release.bat | 4 ---- build/win32/package-debug.bat | 6 ----- build/win32/package-release.bat | 5 ----- build/win32/set_df_path.vbs | 32 --------------------------- 11 files changed, 85 deletions(-) delete mode 100644 build/win32/build-debug.bat delete mode 100644 build/win32/build-release.bat delete mode 100644 build/win32/generate-MSVC-all.bat delete mode 100644 build/win32/generate-MSVC-gui.bat delete mode 100644 build/win32/generate-MSVC-minimal.bat delete mode 100644 build/win32/generate-MSVC-release.bat delete mode 100644 build/win32/install-debug.bat delete mode 100644 build/win32/install-release.bat delete mode 100644 build/win32/package-debug.bat delete mode 100644 build/win32/package-release.bat delete mode 100644 build/win32/set_df_path.vbs diff --git a/build/win32/build-debug.bat b/build/win32/build-debug.bat deleted file mode 100644 index dd972093d5..0000000000 --- a/build/win32/build-debug.bat +++ /dev/null @@ -1,4 +0,0 @@ -call "%VS140COMNTOOLS%vsvars32.bat" -cd VC2015_32 -msbuild /m /p:Platform=Win32 /p:Configuration=RelWithDebInfo ALL_BUILD.vcxproj -cd .. diff --git a/build/win32/build-release.bat b/build/win32/build-release.bat deleted file mode 100644 index 71f14eaf05..0000000000 --- a/build/win32/build-release.bat +++ /dev/null @@ -1,5 +0,0 @@ -call "%VS140COMNTOOLS%vsvars32.bat" -cd VC2015_32 -msbuild /m /p:Platform=Win32 /p:Configuration=Release ALL_BUILD.vcxproj -cd .. -pause diff --git a/build/win32/generate-MSVC-all.bat b/build/win32/generate-MSVC-all.bat deleted file mode 100644 index 5c113c7b66..0000000000 --- a/build/win32/generate-MSVC-all.bat +++ /dev/null @@ -1,6 +0,0 @@ -IF EXIST DF_PATH.txt SET /P _DF_PATH= 0 Then - Set spoFile = fso.CreateTextFile("DF_PATH.txt", True) - spoFile.WriteLine(objF.Self.Path) - End If -End If - -Function IsValue(obj) - ' Check whether the value has been returned. - Dim tmp - On Error Resume Next - tmp = " " & obj - If Err <> 0 Then - IsValue = False - Else - IsValue = True - End If - On Error GoTo 0 -End Function From 16309bd4670944adcab34a2df3cb7fa4cfb36113 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Thu, 5 Jan 2023 13:01:28 +1100 Subject: [PATCH 0003/4620] remove MSVC 32-bit build configurations --- CMakeSettings.json | 40 ---------------------------------------- 1 file changed, 40 deletions(-) diff --git a/CMakeSettings.json b/CMakeSettings.json index fda8ecfd3d..266626804f 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -26,46 +26,6 @@ } ], "configurations": [ - { - "name": "MSVC 32 Debug", - "generator": "Ninja", - "configurationType": "RelWithDebInfo", - "inheritEnvironments": [ "msvc_x86_x64", "msvc_2015_x86" ], - "variables": [ - { - "name": "DFHACK_BUILD_ARCH", - "value": "32" - }, - { - "name": "BUILD_STONESENSE", - "value": "1" - }, - { - "name": "REMOVE_SYMBOLS_FROM_DF_STUBS", - "value": "0" - }, - { - "name": "DFHACK_INCLUDE_CORE", - "value": "1" - } - ] - }, - { - "name": "MSVC 32 Release", - "generator": "Ninja", - "configurationType": "Release", - "inheritEnvironments": [ "msvc_x86_x64", "msvc_2015_x86" ], - "variables": [ - { - "name": "DFHACK_BUILD_ARCH", - "value": "32" - }, - { - "name": "BUILD_STONESENSE", - "value": "1" - } - ] - }, { "name": "MSVC 64 Debug", "generator": "Ninja", From ba32440e4022d5b63cb0cc0c37fd41257a1cd5ae Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Thu, 5 Jan 2023 13:02:25 +1100 Subject: [PATCH 0004/4620] MSVC environments 2015 are not required and cmake should raise the alarm if it's not VS2022 --- CMakeSettings.json | 30 ++---------------------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/CMakeSettings.json b/CMakeSettings.json index 266626804f..d1511716f7 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -1,36 +1,10 @@ { - "environments": [ - { - "environment": "msvc_2015_x86", - "PATH": "${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\BIN\\amd64_x86;${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\BIN\\amd64;${env.ProgramFiles(x86)}\\Windows Kits\\10\\bin\\x86;${env.ProgramFiles(x86)}\\Windows Kits\\8.1\\bin\\x86;${env.PATH}", - "VS140COMNTOOLS": "${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\Common7\\Tools\\", - "VCINSTALLDIR": "${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\", - "WindowsSdkDir": "${env.ProgramFiles(x86)}\\Windows Kits\\10\\", - "UCRTVersion": "10.0.10240.0", - "UniversalCRTSdkDir": "${env.ProgramFiles(x86)}\\Windows Kits\\10\\", - "LIB": "${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\LIB;${env.ProgramFiles(x86)}\\Windows Kits\\10\\lib\\10.0.10240.0\\ucrt\\x86;${env.ProgramFiles(x86)}\\Windows Kits\\10\\lib\\um\\x86;${env.ProgramFiles(x86)}\\Windows Kits\\8.1\\Lib\\winv6.3\\um\\x86", - "INCLUDE": "${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\INCLUDE;${env.ProgramFiles(x86)}\\Windows Kits\\10\\include\\10.0.10240.0\\ucrt;${env.ProgramFiles(x86)}\\Windows Kits\\10\\include\\shared;${env.ProgramFiles(x86)}\\Windows Kits\\10\\include\\um;${env.ProgramFiles(x86)}\\Windows Kits\\10\\include\\winrt;${env.ProgramFiles(x86)}\\Windows Kits\\8.1\\Include\\um;${env.ProgramFiles(x86)}\\Windows Kits\\8.1\\Include\\shared", - "LIBPATH": "${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\LIB" - }, - { - "environment": "msvc_2015_x64", - "PATH": "${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\BIN\\amd64;${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\BIN;${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\BIN\\1033;${env.ProgramFiles(x86)}\\Windows Kits\\bin\\x64;${env.ProgramFiles(x86)}\\Windows Kits\\8.1\\bin\\x64;${env.PATH}", - "VS140COMNTOOLS": "${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\Common7\\Tools\\", - "VCINSTALLDIR": "${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\", - "WindowsSdkDir": "${env.ProgramFiles(x86)}\\Windows Kits\\10\\", - "UCRTVersion": "10.0.10240.0", - "UniversalCRTSdkDir": "${env.ProgramFiles(x86)}\\Windows Kits\\10\\", - "LIB": "${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\LIB\\amd64;${env.ProgramFiles(x86)}\\Windows Kits\\10\\lib\\10.0.10240.0\\ucrt\\x64;${env.ProgramFiles(x86)}\\Windows Kits\\10\\lib\\um\\x64;${env.ProgramFiles(x86)}\\Windows Kits\\8.1\\Lib\\winv6.3\\um\\x64", - "INCLUDE": "${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\INCLUDE;${env.ProgramFiles(x86)}\\Windows Kits\\10\\include\\10.0.10240.0\\ucrt;${env.ProgramFiles(x86)}\\Windows Kits\\10\\include\\shared;${env.ProgramFiles(x86)}\\Windows Kits\\10\\include\\um;${env.ProgramFiles(x86)}\\Windows Kits\\10\\include\\winrt;${env.ProgramFiles(x86)}\\Windows Kits\\8.1\\Include\\um;${env.ProgramFiles(x86)}\\Windows Kits\\8.1\\Include\\shared", - "LIBPATH": "${env.ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\\VC\\LIB\\amd64" - } - ], "configurations": [ { "name": "MSVC 64 Debug", "generator": "Ninja", "configurationType": "RelWithDebInfo", - "inheritEnvironments": [ "msvc_x64_x64", "msvc_2015_x64" ], + "inheritEnvironments": [ "msvc_x64_x64" ], "variables": [ { "name": "DFHACK_BUILD_ARCH", @@ -54,7 +28,7 @@ "name": "MSVC 64 Release", "generator": "Ninja", "configurationType": "Release", - "inheritEnvironments": [ "msvc_x64_x64", "msvc_2015_x64" ], + "inheritEnvironments": [ "msvc_x64_x64" ], "variables": [ { "name": "DFHACK_BUILD_ARCH", From fe0b1fcefc6a65f904fb3f4aa81eecc0c020c159 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Thu, 5 Jan 2023 13:03:15 +1100 Subject: [PATCH 0005/4620] support VS2022 Community + build tools --- build/win64/build-debug.bat | 6 +++++- build/win64/build-release.bat | 6 +++++- build/win64/install-debug.bat | 6 +++++- build/win64/install-release.bat | 6 +++++- build/win64/package-debug.bat | 6 +++++- build/win64/package-release.bat | 6 +++++- 6 files changed, 30 insertions(+), 6 deletions(-) diff --git a/build/win64/build-debug.bat b/build/win64/build-debug.bat index a04cb9984e..be62460d01 100644 --- a/build/win64/build-debug.bat +++ b/build/win64/build-debug.bat @@ -1,4 +1,8 @@ -call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 +if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" ( + call "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" amd64 +) else ( + call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 +) cd VC2022 msbuild /m /p:Platform=x64 /p:Configuration=RelWithDebInfo ALL_BUILD.vcxproj cd .. diff --git a/build/win64/build-release.bat b/build/win64/build-release.bat index 8068e5074f..695c35a90d 100644 --- a/build/win64/build-release.bat +++ b/build/win64/build-release.bat @@ -1,4 +1,8 @@ -call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 +if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" ( + call "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" amd64 +) else ( + call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 +) cd VC2022 msbuild /m /p:Platform=x64 /p:Configuration=Release ALL_BUILD.vcxproj cd .. diff --git a/build/win64/install-debug.bat b/build/win64/install-debug.bat index 2724990fc0..7d94fef804 100644 --- a/build/win64/install-debug.bat +++ b/build/win64/install-debug.bat @@ -1,4 +1,8 @@ -call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 +if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" ( + call "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" amd64 +) else ( + call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 +) cd VC2022 msbuild /m /p:Platform=x64 /p:Configuration=RelWithDebInfo INSTALL.vcxproj cd .. diff --git a/build/win64/install-release.bat b/build/win64/install-release.bat index 30dc1f6ffb..0162a88270 100644 --- a/build/win64/install-release.bat +++ b/build/win64/install-release.bat @@ -1,4 +1,8 @@ -call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 +if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" ( + call "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" amd64 +) else ( + call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 +) cd VC2022 msbuild /m /p:Platform=x64 /p:Configuration=Release INSTALL.vcxproj cd .. diff --git a/build/win64/package-debug.bat b/build/win64/package-debug.bat index 450db0dfdf..d029f9bc36 100644 --- a/build/win64/package-debug.bat +++ b/build/win64/package-debug.bat @@ -1,5 +1,9 @@ @echo off -call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 +if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" ( + call "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" amd64 +) else ( + call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 +) cd VC2022 msbuild /m /p:Platform=x64 /p:Configuration=RelWithDebInfo PACKAGE.vcxproj cd .. diff --git a/build/win64/package-release.bat b/build/win64/package-release.bat index 1c81ccf923..5c347c3b4d 100644 --- a/build/win64/package-release.bat +++ b/build/win64/package-release.bat @@ -1,5 +1,9 @@ @echo off -call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 +if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" ( + call "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" amd64 +) else ( + call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 +) cd VC2022 msbuild /m /p:Platform=x64 /p:Configuration=Release PACKAGE.vcxproj cd .. From 3327ba174b378e43421f970722b0fcf7e563b536 Mon Sep 17 00:00:00 2001 From: Amber Brown Date: Thu, 5 Jan 2023 13:42:45 +1100 Subject: [PATCH 0006/4620] don't build on 32-bit windows --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f8a99bb2a5..4fae149702 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,7 +103,7 @@ endif() # Automatically detect architecture based on Visual Studio generator if(MSVC AND NOT DEFINED DFHACK_BUILD_ARCH) if ((${CMAKE_GENERATOR} MATCHES "Win32") OR (${CMAKE_GENERATOR} MATCHES "x86")) - set(DFHACK_BUILD_ARCH "32") + message(SEND_ERROR "DF v50 does not support 32-bit") else() set(DFHACK_BUILD_ARCH "64") endif() From 6225b90bc9a4c9f49eb5a499d899a11109cb1a3e Mon Sep 17 00:00:00 2001 From: lethosor Date: Sat, 4 Feb 2023 00:00:43 -0500 Subject: [PATCH 0007/4620] Copy-edit compile index & dependencies docs --- docs/dev/compile/Dependencies.rst | 178 +++++++++++++++++------------- docs/dev/compile/index.rst | 3 +- 2 files changed, 104 insertions(+), 77 deletions(-) diff --git a/docs/dev/compile/Dependencies.rst b/docs/dev/compile/Dependencies.rst index da8728b9b8..b3361d8416 100644 --- a/docs/dev/compile/Dependencies.rst +++ b/docs/dev/compile/Dependencies.rst @@ -4,55 +4,65 @@ Dependencies ############ -The most immediate consideration is of course that DFHack is meant to be installed into an **existing DF folder**. -So it is prudent that one is ready. +DFHack is meant to be installed into an **existing DF folder**, so ensure that one is ready. .. contents:: Contents :local: :depth: 2 -Build Dependencies ------------------- +Overview of Dependencies +======================== .. DFHack is quite large, so I've attempted to leave some sort of bread crumbs for each mentionable aspect. -Many of DFHack's build dependencies are included in the repository as git submodules, -however there are some system dependencies as well. They are as follows: +This section provides an overview of system dependencies that DFHack relies on. +See the platform-specific sections later in this document for specifics on how +to install these dependencies. -System packages: +DFHack also has several dependencies on libraries that are included in the +repository as Git submodules, which require no further action to install. -* SDL (libsdl 1.2, not sdl2). -* cmake -* Perl -* Python +System dependencies +------------------- - * Sphinx -* git (required for `contributions `_) + +* CMake +* build system (e.g. gcc & ninja, or Visual Studio) +* Perl (for code generation) +* Python (for documentation) +* Git (required for `contributions `_) * ccache (**optional**, but recommended to improve build times) * OpenGL headers (**optional**: to build `stonesense`) +* SDL (libsdl 1.2, not sdl2) * zlib (compression library used for `xlsxreader-api` -> `quickfort`) -* build system (e.g. gcc & ninja, or Visual Studio) .. maybe the below should be talked about next to the bullet point?? **SDL** is used as an injection point which you can see more about in DFHack's `architectural ` documentation & diagrams. -Perl packages: +Perl packages +------------- * XML::LibXML * XML::LibXSLT -These perl packages are used in code generation. DFHack has many structures that are reverse engineered, we use xml -files to define and update these structures. Then during the configuration process [running cmake] these xml files are -used to generate C++ source code to define these structures for use in plugins and scripts. +These Perl packages are used for code generation. DFHack has many structures +that are reverse engineered and defined in XML files. During the build process, +these XML files are used to generate C++ headers and metadata to make these +structures available for use in plugins and scripts. + +Python packages +--------------- +* Sphinx (required to build the `documentation `) -Installing ----------- + +Installing Dependencies +======================= .. contents:: :local: @@ -61,11 +71,11 @@ Installing .. _linux-dependency-instructions: Linux -===== +----- Here are some package install commands for various distributions: -* On Arch linux:: +* On Arch Linux:: pacman -Sy gcc cmake ccmake ninja git dwarffortress zlib perl-xml-libxml perl-xml-libxslt @@ -82,13 +92,16 @@ Here are some package install commands for various distributions: yum install gcc-c++ cmake ninja-build git zlib-devel SDL-devel perl-core perl-XML-LibXML perl-XML-LibXSLT ruby -To build DFHack, you need GCC 4.8 or newer. GCC 4.8 has the benefit of avoiding -`libstdc++ compatibility issues `, but can be hard -to obtain on modern distributions, and working around these issues is done -automatically by the ``dfhack`` launcher script. As long as your system-provided -GCC is new enough, it should work. Note that extremely new GCC versions may not -have been used to build DFHack yet, so if you run into issues with these, please -let us know (e.g. by opening a GitHub issue). +General notes on dependencies: + +To build DFHack, you need GCC 4.8 or newer, which should be available on modern +distributions. Using exactly GCC 4.8 has the benefit of avoiding `libstdc++ +compatibility issues `, but can be hard to obtain +on modern distributions, and is usually not needed because the ``dfhack`` +launcher script automatically works around libstd++ compatibility issues. As +long as your system-provided GCC is new enough, it should work. Note that +extremely new GCC versions may not have been used to build DFHack yet, so if you +run into issues with these, please let us know (e.g. by opening a GitHub issue). Before you can build anything, you'll also need ``cmake``. It is advisable to also get ``ccmake`` on distributions that split the cmake package into multiple @@ -104,23 +117,27 @@ through your package manager, if possible. Building 32-bit Binaries ~~~~~~~~~~~~~~~~~~~~~~~~ If you want to compile 32-bit DFHack on 64-bit distributions, you'll need the -multilib development tools and libraries: +multilib development tools and libraries. + +On Debian-based distributions, these are: * ``gcc-multilib`` and ``g++-multilib`` -* If you have installed a non-default version of GCC - for example, GCC 4.8 on a - distribution that defaults to 5.x - you may need to add the version number to - the multilib packages. - * For example, ``gcc-4.8-multilib`` and ``g++-4.8-multilib`` if installing for GCC 4.8 - on a system that uses a later GCC version. - * This is definitely required on Ubuntu/Debian, check if using a different distribution. + * If you have installed a non-default version of GCC - for example, GCC 4.8 on a + distribution that defaults to 5.x - you may need to add the version number to + the multilib packages. + + * For example, ``gcc-4.8-multilib`` and ``g++-4.8-multilib`` if installing for GCC 4.8 + on a system that uses a later GCC version. + * This is definitely required on Ubuntu/Debian, check if using a different distribution. + + * Note that installing a 32-bit GCC on 64-bit systems (e.g. ``gcc:i386`` on + Debian) will typically *not* work, as it depends on several other 32-bit + libraries that conflict with system libraries. * ``zlib1g-dev:i386`` (or a similar i386 zlib-dev package) -Note that installing a 32-bit GCC on 64-bit systems (e.g. ``gcc:i386`` on -Debian) will typically *not* work, as it depends on several other 32-bit -libraries that conflict with system libraries. Alternatively, you might be able -to use ``lxc`` to +Alternatively, you might be able to use ``lxc`` to :forums:`create a virtual 32-bit environment <139553.msg5435310#msg5435310>`. .. _linux-incompatible-libstdcxx: @@ -149,18 +166,22 @@ Note that distributing binaries compiled with newer GCC versions may result in the opposite compatibility issue: users with *older* GCC versions may encounter similar errors. This is why DFHack distributes both GCC 4.8 and GCC 7 builds. If you are planning on distributing binaries to other users, we recommend using an -older GCC (but still at least 4.8) version if possible. +older GCC version (but still at least 4.8) if possible. .. _windows-dependency-instructions: Windows -======= +------- DFHack must be built with the Microsoft Visual C++ 2022 toolchain (aka MSVC v143) for ABI compatibility with Dwarf Fortress v50. -With Choco -~~~~~~~~~~ +.. contents:: + :local: + :depth: 1 + +With Chocolatey +~~~~~~~~~~~~~~~ Many of the dependencies are simple enough to download and install via the `chocolatey`_ package manager on the command line. @@ -188,8 +209,10 @@ the existing install. Manually ~~~~~~~~ If you prefer to install manually rather than using Chocolatey, details and -requirements are as below. If you do install manually, please ensure you -have all **executables searchable in your PATH variable**. +requirements are as below. If you do install manually, **ensure that your PATH +variable is updated** to include the install locations for all tools. This can +be edited from ``Control Panel -> System -> Advanced System Settings -> +Environment Variables``. .. contents:: :local: @@ -197,22 +220,18 @@ have all **executables searchable in your PATH variable**. CMake ^^^^^ -You can get the win32 installer version from -`the official site `_. +You can get the Windows installer from `the official site `_. It has the usual installer wizard. Make sure you let it add its binary folder to your binary search PATH so the tool can be later run from anywhere. Perl / Strawberry Perl ^^^^^^^^^^^^^^^^^^^^^^ -For the code generation stage of the build process, you'll need Perl 5 with -**XML::LibXML** and **XML::LibXSLT**. `Strawberry Perl `_ is -recommended as it includes all of the required packages in a single easy -install. - -After install, ensure Perl is in your user's PATH. This can be edited from -``Control Panel -> System -> Advanced System Settings -> Environment Variables``. +For the code generation stage of the build process, you'll need Perl 5 with the +``XML::LibXML`` and ``XML::LibXSLT`` packages installed. +`Strawberry Perl `_ is recommended as it includes all +of the required packages in a single easy install. -The following directories must be in your PATH, in this order: +After install, ensure Perl is in your user's PATH. The following directories must be in your PATH, in this order: * ``\c\bin`` * ``\perl\site\bin`` @@ -228,7 +247,7 @@ install XML::LibXML and XML::LibXSLT for it using CPAN. Python ^^^^^^ -See the `Python`_ website. +See the `Python`_ website. Any supported version of Python 3 will work. .. _Python: https://www.python.org/downloads/ @@ -271,9 +290,9 @@ When installing, select the "Desktop Development with C++" workload and ensure t .. _mac-dependency-instructions: macOS -===== +----- -DFHack can officially be built on macOS only with GCC 4.8 or 7. Anything newer than 7 +DFHack is easiest to build on macOS with exactly GCC 4.8 or 7. Anything newer than 7 will require you to perform extra steps to get DFHack to run (see `osx-new-gcc-notes`), and your build will likely not be redistributable. @@ -309,29 +328,36 @@ and your build will likely not be redistributable. #. Install Perl dependencies - * Using system Perl + * Using system Perl + + * ``sudo cpan`` + + If this is the first time you've run cpan, you will need to go through the setup + process. Just stick with the defaults for everything and you'll be fine. + + If you are running OS X 10.6 (Snow Leopard) or earlier, good luck! + You'll need to open a separate Terminal window and run:: - * ``sudo cpan`` + sudo ln -s /usr/include/libxml2/libxml /usr/include/libxml - If this is the first time you've run cpan, you will need to go through the setup - process. Just stick with the defaults for everything and you'll be fine. + * ``install XML::LibXML`` + * ``install XML::LibXSLT`` - If you are running OS X 10.6 (Snow Leopard) or earlier, good luck! - You'll need to open a separate Terminal window and run:: + * In a separate, local Perl install - sudo ln -s /usr/include/libxml2/libxml /usr/include/libxml + Rather than using system Perl, you might also want to consider + the Perl manager, `Perlbrew `_. - * ``install XML::LibXML`` - * ``install XML::LibXSLT`` + This manages Perl 5 locally under ``~/perl5/``, providing an easy + way to install Perl and run CPAN against it without ``sudo``. + It can maintain multiple Perl installs and being local has the + benefit of easy migration and insulation from OS issues and upgrades. - * In a separate, local Perl install + See https://perlbrew.pl/ for more details. - Rather than using system Perl, you might also want to consider - the Perl manager, `Perlbrew `_. +#. Install Python dependencies - This manages Perl 5 locally under ``~/perl5/``, providing an easy - way to install Perl and run CPAN against it without ``sudo``. - It can maintain multiple Perl installs and being local has the - benefit of easy migration and insulation from OS issues and upgrades. + * You can choose to use a system Python 3 installation or any supported + version of Python 3 from `python.org `__. - See https://perlbrew.pl/ for more details. + * Install `Sphinx`_ diff --git a/docs/dev/compile/index.rst b/docs/dev/compile/index.rst index 0504bd8fbc..f9f6105ff6 100644 --- a/docs/dev/compile/index.rst +++ b/docs/dev/compile/index.rst @@ -4,7 +4,8 @@ Building DFHack =============== -Those seeking to compile the source code for DFHack, and or plugins, can refer to the following help pages. +Those seeking to compile the source code for DFHack, including core and plugins, +can refer to the following help pages. .. toctree:: :maxdepth: 2 From f3ce8059606ad1f2e65e31deea691f7c5cec5c4e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 23 May 2023 12:26:44 -0700 Subject: [PATCH 0008/4620] scroll mouse wheel to focus window under cursor --- docs/changelog.txt | 1 + docs/dev/Lua API.rst | 10 +++++----- library/lua/gui.lua | 16 +++++++++++----- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index df00cf34a7..ab8ca1439d 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -60,6 +60,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - Core: For debugging purposes, you can now pass ``--disable-dfhack`` on the Dwarf Fortress commandline or specify ``DFHACK_DISABLE=1`` in the environment to disable DFHack for the current session. - `overlay`: added links to the quickstart guide and the control panel on the DF title screen - `gui/autodump`: fort-mode keybinding: Ctrl-H +- Window behavior: if you have multiple DFHack tool windows open, scrolling the mouse wheel while over an unfocused window will focus it and raise it to the top ## Documentation diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 1c1d75358a..44304a54e6 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4240,11 +4240,11 @@ input skips all unfocused ZScreens under that ZScreen and is passed directly to the first non-ZScreen viewscreen. There are class attributes that can be set to control what kind of unhandled input is passed to the lower layers. -If multiple ZScreens are visible and the player left or right clicks on a -visible element of a non-focused ZScreen, that ZScreen will be given focus. This -allows multiple DFHack GUI tools to be usable at the same time. If the mouse is -clicked away from the ZScreen widgets, that ZScreen loses focus. If no ZScreen -has focus, all input is passed directly through to the first underlying +If multiple ZScreens are visible and the player scrolls or left/right clicks on +a visible element of a non-focused ZScreen, that ZScreen will be given focus. +This allows multiple DFHack GUI tools to be usable at the same time. If the +mouse is clicked away from the ZScreen widgets, that ZScreen loses focus. If no +ZScreen has focus, all input is passed directly through to the first underlying non-ZScreen viewscreen. For a ZScreen with keyboard focus, if :kbd:`Esc` or the right mouse button is diff --git a/library/lua/gui.lua b/library/lua/gui.lua index d511cd51f7..9d9d39a8ef 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -787,7 +787,9 @@ end function ZScreen:onInput(keys) local has_mouse = self:isMouseOver() if not self:hasFocus() then - if (keys._MOUSE_L_DOWN or keys._MOUSE_R_DOWN) and has_mouse then + if has_mouse and + (keys._MOUSE_L_DOWN or keys._MOUSE_R_DOWN or + keys.CONTEXT_SCROLL_UP or keys.CONTEXT_SCROLL_DOWN) then self:raise() else self:sendInputToParent(keys) @@ -818,10 +820,14 @@ function ZScreen:onInput(keys) end local passit = self.pass_pause and keys.D_PAUSE if not passit and self.pass_mouse_clicks then - for key in pairs(MOUSE_KEYS) do - if keys[key] then - passit = true - break + if keys.CONTEXT_SCROLL_UP or keys.CONTEXT_SCROLL_DOWN then + passit = true + else + for key in pairs(MOUSE_KEYS) do + if keys[key] then + passit = true + break + end end end end From 6f49a0eb3dc4055ca5b77fd7d040d25f6a4fbbad Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 23 May 2023 15:17:01 -0700 Subject: [PATCH 0009/4620] allow dragging by frame edge for non-resizable windows --- docs/changelog.txt | 1 + docs/dev/Lua API.rst | 4 ++-- library/lua/gui/widgets.lua | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index df00cf34a7..c21facea1a 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -59,6 +59,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `gui/blueprint`: recording of stockpile layouts and categories is now supported. note that detailed stockpile configurations will *not* be saved (yet) - Core: For debugging purposes, you can now pass ``--disable-dfhack`` on the Dwarf Fortress commandline or specify ``DFHACK_DISABLE=1`` in the environment to disable DFHack for the current session. - `overlay`: added links to the quickstart guide and the control panel on the DF title screen +- Window behavior: non-resizable windows now allow dragging by their frame edges by default - `gui/autodump`: fort-mode keybinding: Ctrl-H ## Documentation diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 1c1d75358a..538fa08d87 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4503,7 +4503,7 @@ Has attributes: Called from ``postComputeFrame``. * ``draggable = bool`` (default: ``false``) -* ``drag_anchors = {}`` (default: ``{title=true, frame=false, body=false}``) +* ``drag_anchors = {}`` (default: ``{title=true, frame=false/true, body=true}``) * ``drag_bound = 'frame' or 'body'`` (default: ``'frame'``) * ``on_drag_begin = function()`` (default: ``nil``) * ``on_drag_end = function(bool)`` (default: ``nil``) @@ -4511,7 +4511,7 @@ Has attributes: If ``draggable`` is set to ``true``, then the above attributes come into play when the panel is dragged around the screen, either with the mouse or the keyboard. ``drag_anchors`` sets which parts of the panel can be clicked on - with the left mouse button to start dragging. ``drag_bound`` configures + with the left mouse button to start dragging. The frame is a drag anchor by default only if ``resizable`` (below) is ``false``. ``drag_bound`` configures whether the frame of the panel (if any) can be dragged outside the containing parent's boundary. The body will never be draggable outside of the parent, but you can allow the frame to cross the boundary by setting ``drag_bound`` to diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index 5c8094d285..a58ac228cc 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -87,7 +87,7 @@ Panel.ATTRS { function Panel:init(args) if not self.drag_anchors then - self.drag_anchors = {title=true, frame=false, body=true} + self.drag_anchors = {title=true, frame=not self.resizable, body=true} end if not self.resize_anchors then self.resize_anchors = {t=false, l=true, r=true, b=true} From f6d9af5725ee15fcdc3a2527413f451ad8522ab6 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 23 May 2023 15:20:09 -0700 Subject: [PATCH 0010/4620] also set focus on shift-scrolling --- library/lua/gui.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/library/lua/gui.lua b/library/lua/gui.lua index 9d9d39a8ef..e22ddae20e 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -789,7 +789,8 @@ function ZScreen:onInput(keys) if not self:hasFocus() then if has_mouse and (keys._MOUSE_L_DOWN or keys._MOUSE_R_DOWN or - keys.CONTEXT_SCROLL_UP or keys.CONTEXT_SCROLL_DOWN) then + keys.CONTEXT_SCROLL_UP or keys.CONTEXT_SCROLL_DOWN or + keys.CONTEXT_SCROLL_PAGEUP or keys.CONTEXT_SCROLL_PAGEDOWN) then self:raise() else self:sendInputToParent(keys) @@ -820,7 +821,8 @@ function ZScreen:onInput(keys) end local passit = self.pass_pause and keys.D_PAUSE if not passit and self.pass_mouse_clicks then - if keys.CONTEXT_SCROLL_UP or keys.CONTEXT_SCROLL_DOWN then + if keys.CONTEXT_SCROLL_UP or keys.CONTEXT_SCROLL_DOWN or + keys.CONTEXT_SCROLL_PAGEUP or keys.CONTEXT_SCROLL_PAGEDOWN then passit = true else for key in pairs(MOUSE_KEYS) do From 44340dfb75759eac7102465158cea0b2864133f9 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Wed, 24 May 2023 07:12:57 +0000 Subject: [PATCH 0011/4620] Auto-update submodules library/xml: master scripts: master plugins/stonesense: master --- library/xml | 2 +- plugins/stonesense | 2 +- scripts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library/xml b/library/xml index c0bf8aa616..29801b0043 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit c0bf8aa6166b8e7a9672fd67edccfa4e78c945cd +Subproject commit 29801b0043b884d04a7e63a995258ebf2b67cbaf diff --git a/plugins/stonesense b/plugins/stonesense index b7073b6643..8a407a0485 160000 --- a/plugins/stonesense +++ b/plugins/stonesense @@ -1 +1 @@ -Subproject commit b7073b664310b909989ebe68de36a164e452825a +Subproject commit 8a407a0485d63ce399314afd2f0c623a7dfa4dfa diff --git a/scripts b/scripts index d9a4d888e3..04e1e09a75 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit d9a4d888e3af40ef2f1f8765c8b4d45532129dc4 +Subproject commit 04e1e09a75e4ce3d9b7a2b98ab99a0cb45eff3b9 From 87775317a525bcbdede9d9d6b48e458a9faff5ef Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 24 May 2023 12:41:02 -0700 Subject: [PATCH 0012/4620] don't throw if json is unreadable just act like the file didn't exist (unless strict is set) --- docs/changelog.txt | 1 + library/lua/json.lua | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index df00cf34a7..42ce711eba 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -51,6 +51,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `autodump`: no longer checks for a keyboard cursor before executing, so ``autodump destroy`` (which doesn't require a cursor) can still function +- Settings: recover gracefully when settings files become corrupted (e.g. by CTD) - `orders`: update orders in orders library for prepared meals, bins, archer uniforms, and weapons - Terminal console no longer appears in front of the game window on startup - `gui/control-panel`: new preference for whether filters in lists search for substrings in the middle of words (e.g. if set to true, then "ee" will match "steel") diff --git a/library/lua/json.lua b/library/lua/json.lua index 2b4b3a66a7..6ba8483dd0 100644 --- a/library/lua/json.lua +++ b/library/lua/json.lua @@ -59,7 +59,13 @@ function _file:read(strict) end else self.exists = true - self.data = decode_file(self.path) + local ok, err = pcall(function() self.data = decode_file(self.path) end) + if not ok then + if strict then + error(('cannot decode file: %s: %s'):format(self.path, err)) + end + self.data = {} + end end return self.data end From a9843912bec83bf2607928ee150d09638c7c7433 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Thu, 25 May 2023 07:13:13 +0000 Subject: [PATCH 0013/4620] Auto-update submodules scripts: master plugins/stonesense: master --- plugins/stonesense | 2 +- scripts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/stonesense b/plugins/stonesense index 8a407a0485..d7fa20079e 160000 --- a/plugins/stonesense +++ b/plugins/stonesense @@ -1 +1 @@ -Subproject commit 8a407a0485d63ce399314afd2f0c623a7dfa4dfa +Subproject commit d7fa20079e89cc6516a0f5406a5ad112436066bb diff --git a/scripts b/scripts index 04e1e09a75..4393568117 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 04e1e09a75e4ce3d9b7a2b98ab99a0cb45eff3b9 +Subproject commit 4393568117eaa5b74872c4d98e07dee1d58f3e48 From 732e042a543d618da913deaf1aa9907a6d8ecd6a Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Fri, 26 May 2023 00:57:44 +0000 Subject: [PATCH 0014/4620] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 4393568117..a26e72b6e1 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 4393568117eaa5b74872c4d98e07dee1d58f3e48 +Subproject commit a26e72b6e1da16d6fcaadc71518314fb8aaae193 From 27ee0ae3960625bd4fd1c25136344dd52b05f5eb Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Sat, 27 May 2023 07:12:17 +0000 Subject: [PATCH 0015/4620] Auto-update submodules library/xml: master --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index 29801b0043..1cc81c0faf 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 29801b0043b884d04a7e63a995258ebf2b67cbaf +Subproject commit 1cc81c0faf7aa9fd1c18fbc6ef8b2298f31ab1f9 From 0918fbb0041e74765624aea4625c33bf38d8ac97 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 27 May 2023 03:16:51 -0700 Subject: [PATCH 0016/4620] add ensure_keys utility function --- docs/changelog.txt | 1 + docs/dev/Lua API.rst | 5 +++++ library/lua/dfhack.lua | 8 ++++++++ 3 files changed, 14 insertions(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index c193442c6b..b2ee30767e 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -74,6 +74,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``overlay.reload()``: has been renamed to ``overlay.rescan()`` so as not to conflict with the global ``reload()`` function. If you are developing an overlay, please take note of the new function name for reloading your overlay during development. - ``gui``: changed frame naming scheme to ``FRAME_X`` rather than ``X_FRAME``, and added aliases for backwards compatibility. (for example ``BOLD_FRAME`` is now called ``FRAME_BOLD``) +- ``ensure_keys``: walks a series of keys, creating new tables for any missing values ## Removed - `orders`: ``library/military_include_artifact_materials`` library file removed since recent research indicates that platinum blunt weapons and silver crossbows are not more effective than standard steel. the alternate military orders file was also causing unneeded confusion. diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 9f0a40ba8e..e5167a531d 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -3019,6 +3019,11 @@ environment by the mandatory init file dfhack.lua: set to the value of ``default_value``, which defaults to ``{}`` if not set. The new or existing value of ``t[key]`` is then returned. +* ``ensure_keys(t, key...)`` + + Walks a series of keys, creating any missing keys as empty tables. The new or + existing table from the last specified key is returned from the function. + .. _lua-string: String class extensions diff --git a/library/lua/dfhack.lua b/library/lua/dfhack.lua index 78d978147b..8ea5e9dacc 100644 --- a/library/lua/dfhack.lua +++ b/library/lua/dfhack.lua @@ -404,6 +404,14 @@ function ensure_key(t, key, default_value) return t[key] end +function ensure_keys(t, key, ...) + t = ensure_key(t, key) + if select('#', ...) > 0 then + return ensure_keys(t, ...) + end + return t +end + -- String class extentions -- prefix is a literal string, not a pattern From 8b3eef699f4d2d6d5776ca4156085afd4220356c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 27 May 2023 05:37:31 -0700 Subject: [PATCH 0017/4620] adjust findCivzonesAt to v50 semantics --- library/modules/Buildings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/modules/Buildings.cpp b/library/modules/Buildings.cpp index b9e61c8637..dca8010da0 100644 --- a/library/modules/Buildings.cpp +++ b/library/modules/Buildings.cpp @@ -465,7 +465,7 @@ bool Buildings::findCivzonesAt(std::vector *pvec, df::coord pos) { pvec->clear(); - for (df::building_civzonest* zone : world->buildings.other.ACTIVITY_ZONE) + for (df::building_civzonest* zone : world->buildings.other.ANY_ZONE) { if (pos.z != zone->z) continue; From dbcba3d548a8b8e18eb8ba385f243a38413354dd Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 28 May 2023 02:26:06 -0700 Subject: [PATCH 0018/4620] refactor to allow interacting with route stop settings --- plugins/lua/stockpiles.lua | 18 +- plugins/stockpiles/StockpileSerializer.cpp | 456 +++++++++++---------- plugins/stockpiles/StockpileSerializer.h | 54 ++- plugins/stockpiles/stockpiles.cpp | 48 +++ 4 files changed, 342 insertions(+), 234 deletions(-) diff --git a/plugins/lua/stockpiles.lua b/plugins/lua/stockpiles.lua index 379f2185aa..3e127de4dc 100644 --- a/plugins/lua/stockpiles.lua +++ b/plugins/lua/stockpiles.lua @@ -101,7 +101,7 @@ function export_stockpile(name, opts) stockpiles_export(name, get_sp_id(opts), includedElements) end -function import_stockpile(name, opts) +local function normalize_name(name) local is_library = false if name:startswith('library/') then name = name:sub(9) @@ -109,11 +109,19 @@ function import_stockpile(name, opts) end assert_safe_name(name) if not is_library and dfhack.filesystem.exists(STOCKPILES_DIR .. '/' .. name .. '.dfstock') then - name = STOCKPILES_DIR .. '/' .. name - else - name = STOCKPILES_LIBRARY_DIR .. '/' .. name + return STOCKPILES_DIR .. '/' .. name end - stockpiles_import(name, get_sp_id(opts), opts.mode, table.concat(opts.filters, ',')) + return STOCKPILES_LIBRARY_DIR .. '/' .. name +end + +function import_stockpile(name, opts) + name = normalize_name(name) + stockpiles_import(name, get_sp_id(opts), opts.mode, table.concat(opts.filters or {}, ',')) +end + +function import_route(name, route_id, stop_id, mode, filters) + name = normalize_name(name) + stockpiles_route_import(name, route_id, stop_id, mode, table.concat(filters or {}, ',')) end local valid_includes = {general=true, categories=true, types=true} diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index 529e402bdf..fcb0cee3eb 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -150,12 +150,17 @@ static struct OtherMatsWeaponsArmor { } } mOtherMatsWeaponsArmor; +StockpileSettingsSerializer::StockpileSettingsSerializer(df::stockpile_settings *settings) + : mSettings(settings) { } + +StockpileSettingsSerializer::~StockpileSettingsSerializer() { } + StockpileSerializer::StockpileSerializer(df::building_stockpilest* stockpile) - : mPile(stockpile) { } + : StockpileSettingsSerializer(&stockpile->settings), mPile(stockpile) { } StockpileSerializer::~StockpileSerializer() { } -bool StockpileSerializer::serialize_to_ostream(std::ostream* output, uint32_t includedElements) { +bool StockpileSettingsSerializer::serialize_to_ostream(std::ostream* output, uint32_t includedElements) { if (output->fail()) return false; mBuffer.Clear(); @@ -168,7 +173,7 @@ bool StockpileSerializer::serialize_to_ostream(std::ostream* output, uint32_t in return output->good(); } -bool StockpileSerializer::serialize_to_file(const string& file, uint32_t includedElements) { +bool StockpileSettingsSerializer::serialize_to_file(const string& file, uint32_t includedElements) { std::fstream output(file, std::ios::out | std::ios::binary | std::ios::trunc); if (output.fail()) { WARN(log).print("ERROR: failed to open file for writing: '%s'\n", @@ -178,7 +183,7 @@ bool StockpileSerializer::serialize_to_file(const string& file, uint32_t include return serialize_to_ostream(&output, includedElements); } -bool StockpileSerializer::parse_from_istream(std::istream* input, DeserializeMode mode, const vector& filters) { +bool StockpileSettingsSerializer::parse_from_istream(std::istream* input, DeserializeMode mode, const vector& filters) { if (input->fail()) return false; mBuffer.Clear(); @@ -190,7 +195,7 @@ bool StockpileSerializer::parse_from_istream(std::istream* input, DeserializeMod return res; } -bool StockpileSerializer::unserialize_from_file(const string& file, DeserializeMode mode, const vector& filters) { +bool StockpileSettingsSerializer::unserialize_from_file(const string& file, DeserializeMode mode, const vector& filters) { std::fstream input(file, std::ios::in | std::ios::binary); if (input.fail()) { WARN(log).print("failed to open file for reading: '%s'\n", @@ -655,9 +660,7 @@ static void write_cat(const char *name, bool include_types, uint32_t cat_flags, } } -void StockpileSerializer::write(uint32_t includedElements) { - if (includedElements & INCLUDED_ELEMENTS_CONTAINERS) - write_containers(); +void StockpileSettingsSerializer::write(uint32_t includedElements) { if (includedElements & INCLUDED_ELEMENTS_GENERAL) write_general(); @@ -665,100 +668,106 @@ void StockpileSerializer::write(uint32_t includedElements) { return; DEBUG(log).print("GROUP SET %s\n", - bitfield_to_string(mPile->settings.flags).c_str()); + bitfield_to_string(mSettings->flags).c_str()); bool include_types = 0 != (includedElements & INCLUDED_ELEMENTS_TYPES); write_cat("ammo", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_ammo, + mSettings->flags.whole, + mSettings->flags.mask_ammo, std::bind(&StockpileSettings::mutable_ammo, &mBuffer), - std::bind(&StockpileSerializer::write_ammo, this, _1)); + std::bind(&StockpileSettingsSerializer::write_ammo, this, _1)); write_cat("animals", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_animals, + mSettings->flags.whole, + mSettings->flags.mask_animals, std::bind(&StockpileSettings::mutable_animals, &mBuffer), - std::bind(&StockpileSerializer::write_animals, this, _1)); + std::bind(&StockpileSettingsSerializer::write_animals, this, _1)); write_cat("armor", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_armor, + mSettings->flags.whole, + mSettings->flags.mask_armor, std::bind(&StockpileSettings::mutable_armor, &mBuffer), - std::bind(&StockpileSerializer::write_armor, this, _1)); + std::bind(&StockpileSettingsSerializer::write_armor, this, _1)); write_cat("bars_blocks", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_bars_blocks, + mSettings->flags.whole, + mSettings->flags.mask_bars_blocks, std::bind(&StockpileSettings::mutable_barsblocks, &mBuffer), - std::bind(&StockpileSerializer::write_bars_blocks, this, _1)); + std::bind(&StockpileSettingsSerializer::write_bars_blocks, this, _1)); write_cat("cloth", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_cloth, + mSettings->flags.whole, + mSettings->flags.mask_cloth, std::bind(&StockpileSettings::mutable_cloth, &mBuffer), - std::bind(&StockpileSerializer::write_cloth, this, _1)); + std::bind(&StockpileSettingsSerializer::write_cloth, this, _1)); write_cat("coin", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_coins, + mSettings->flags.whole, + mSettings->flags.mask_coins, std::bind(&StockpileSettings::mutable_coin, &mBuffer), - std::bind(&StockpileSerializer::write_coins, this, _1)); + std::bind(&StockpileSettingsSerializer::write_coins, this, _1)); write_cat("finished_goods", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_finished_goods, + mSettings->flags.whole, + mSettings->flags.mask_finished_goods, std::bind(&StockpileSettings::mutable_finished_goods, &mBuffer), - std::bind(&StockpileSerializer::write_finished_goods, this, _1)); + std::bind(&StockpileSettingsSerializer::write_finished_goods, this, _1)); write_cat("food", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_food, + mSettings->flags.whole, + mSettings->flags.mask_food, std::bind(&StockpileSettings::mutable_food, &mBuffer), - std::bind(&StockpileSerializer::write_food, this, _1)); + std::bind(&StockpileSettingsSerializer::write_food, this, _1)); write_cat("furniture", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_furniture, + mSettings->flags.whole, + mSettings->flags.mask_furniture, std::bind(&StockpileSettings::mutable_furniture, &mBuffer), - std::bind(&StockpileSerializer::write_furniture, this, _1)); + std::bind(&StockpileSettingsSerializer::write_furniture, this, _1)); write_cat("gems", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_gems, + mSettings->flags.whole, + mSettings->flags.mask_gems, std::bind(&StockpileSettings::mutable_gems, &mBuffer), - std::bind(&StockpileSerializer::write_gems, this, _1)); + std::bind(&StockpileSettingsSerializer::write_gems, this, _1)); write_cat("leather", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_leather, + mSettings->flags.whole, + mSettings->flags.mask_leather, std::bind(&StockpileSettings::mutable_leather, &mBuffer), - std::bind(&StockpileSerializer::write_leather, this, _1)); + std::bind(&StockpileSettingsSerializer::write_leather, this, _1)); write_cat("corpses", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_corpses, + mSettings->flags.whole, + mSettings->flags.mask_corpses, std::bind(&StockpileSettings::mutable_corpses_v50, &mBuffer), - std::bind(&StockpileSerializer::write_corpses, this, _1)); + std::bind(&StockpileSettingsSerializer::write_corpses, this, _1)); write_cat("refuse", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_refuse, + mSettings->flags.whole, + mSettings->flags.mask_refuse, std::bind(&StockpileSettings::mutable_refuse, &mBuffer), - std::bind(&StockpileSerializer::write_refuse, this, _1)); + std::bind(&StockpileSettingsSerializer::write_refuse, this, _1)); write_cat("sheet", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_sheet, + mSettings->flags.whole, + mSettings->flags.mask_sheet, std::bind(&StockpileSettings::mutable_sheet, &mBuffer), - std::bind(&StockpileSerializer::write_sheet, this, _1)); + std::bind(&StockpileSettingsSerializer::write_sheet, this, _1)); write_cat("stone", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_stone, + mSettings->flags.whole, + mSettings->flags.mask_stone, std::bind(&StockpileSettings::mutable_stone, &mBuffer), - std::bind(&StockpileSerializer::write_stone, this, _1)); + std::bind(&StockpileSettingsSerializer::write_stone, this, _1)); write_cat("weapons", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_weapons, + mSettings->flags.whole, + mSettings->flags.mask_weapons, std::bind(&StockpileSettings::mutable_weapons, &mBuffer), - std::bind(&StockpileSerializer::write_weapons, this, _1)); + std::bind(&StockpileSettingsSerializer::write_weapons, this, _1)); write_cat("wood", include_types, - mPile->settings.flags.whole, - mPile->settings.flags.mask_wood, + mSettings->flags.whole, + mSettings->flags.mask_wood, std::bind(&StockpileSettings::mutable_wood, &mBuffer), - std::bind(&StockpileSerializer::write_wood, this, _1)); + std::bind(&StockpileSettingsSerializer::write_wood, this, _1)); } -void StockpileSerializer::read(DeserializeMode mode, const vector& filters) { +void StockpileSerializer::write(uint32_t includedElements) { + if (includedElements & INCLUDED_ELEMENTS_CONTAINERS) + write_containers(); + + StockpileSettingsSerializer::write(includedElements); +} + +void StockpileSettingsSerializer::read(DeserializeMode mode, const vector& filters) { DEBUG(log).print("==READ==\n"); - read_containers(mode); read_general(mode); read_ammo(mode, filters); read_animals(mode, filters); @@ -786,6 +795,11 @@ void StockpileSerializer::read(DeserializeMode mode, const vector& filte read_wood(mode, filters); } +void StockpileSerializer::read(DeserializeMode mode, const vector& filters) { + read_containers(mode); + StockpileSettingsSerializer::read(mode, filters); +} + void StockpileSerializer::write_containers() { DEBUG(log).print("writing container settings\n"); mBuffer.set_max_bins(mPile->max_bins); @@ -854,53 +868,61 @@ void StockpileSerializer::read_containers(DeserializeMode mode) { mPile->max_wheelbarrows); } -void StockpileSerializer::write_general() { +void StockpileSettingsSerializer::write_general() { DEBUG(log).print("writing general settings\n"); + mBuffer.set_allow_inorganic(mSettings->allow_inorganic); + mBuffer.set_allow_organic(mSettings->allow_organic); +} + +void StockpileSerializer::write_general() { + StockpileSettingsSerializer::write_general(); mBuffer.set_use_links_only(mPile->use_links_only); - mBuffer.set_allow_inorganic(mPile->settings.allow_inorganic); - mBuffer.set_allow_organic(mPile->settings.allow_organic); } -void StockpileSerializer::read_general(DeserializeMode mode) { - read_elem("use_links_only", mode, - std::bind(&StockpileSettings::has_use_links_only, mBuffer), - std::bind(&StockpileSettings::use_links_only, mBuffer), - mPile->use_links_only); +void StockpileSettingsSerializer::read_general(DeserializeMode mode) { read_elem("allow_inorganic", mode, std::bind(&StockpileSettings::has_allow_inorganic, mBuffer), std::bind(&StockpileSettings::allow_inorganic, mBuffer), - mPile->settings.allow_inorganic); + mSettings->allow_inorganic); read_elem("allow_organic", mode, std::bind(&StockpileSettings::has_allow_organic, mBuffer), std::bind(&StockpileSettings::allow_organic, mBuffer), - mPile->settings.allow_organic); + mSettings->allow_organic); +} + +void StockpileSerializer::read_general(DeserializeMode mode) { + StockpileSettingsSerializer::read_general(mode); + read_elem("use_links_only", mode, + std::bind(&StockpileSettings::has_use_links_only, mBuffer), + std::bind(&StockpileSettings::use_links_only, mBuffer), + mPile->use_links_only); } static bool ammo_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); } -bool StockpileSerializer::write_ammo(StockpileSettings::AmmoSet* ammo) { +bool StockpileSettingsSerializer::write_ammo(StockpileSettings::AmmoSet* ammo) { bool all = serialize_list_itemdef( [&](const string& token) { ammo->add_type(token); }, - mPile->settings.ammo.type, + mSettings->ammo.type, vector(world->raws.itemdefs.ammo.begin(), world->raws.itemdefs.ammo.end()), item_type::AMMO); all = serialize_list_material( ammo_mat_is_allowed, [&](const string& token) { ammo->add_mats(token); }, - mPile->settings.ammo.mats) && all; + mSettings->ammo.mats) && all; - if (mPile->settings.ammo.other_mats.size() > 2) { + if (mSettings->ammo.other_mats.size() > 2) { WARN(log).print("ammo other materials > 2: %zd\n", - mPile->settings.ammo.other_mats.size()); + mSettings->ammo.other_mats.size()); } size_t num_other_mats = std::min(size_t(2), - mPile->settings.ammo.other_mats.size()); + mSettings->ammo.other_mats.size()); for (size_t i = 0; i < num_other_mats; ++i) { - if (!mPile->settings.ammo.other_mats.at(i)) { + if (!mSettings->ammo.other_mats.at(i)) { all = false; continue; } @@ -911,22 +933,22 @@ bool StockpileSerializer::write_ammo(StockpileSettings::AmmoSet* ammo) { all = serialize_list_quality( [&](const string& token) { ammo->add_quality_core(token); }, - mPile->settings.ammo.quality_core) && all; + mSettings->ammo.quality_core) && all; all = serialize_list_quality( [&](const string& token) { ammo->add_quality_total(token); }, - mPile->settings.ammo.quality_total) && all; + mSettings->ammo.quality_total) && all; return all; } -void StockpileSerializer::read_ammo(DeserializeMode mode, const vector& filters) { - auto & pammo = mPile->settings.ammo; +void StockpileSettingsSerializer::read_ammo(DeserializeMode mode, const vector& filters) { + auto & pammo = mSettings->ammo; read_category("ammo", mode, std::bind(&StockpileSettings::has_ammo, mBuffer), std::bind(&StockpileSettings::ammo, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_ammo, + mSettings->flags.whole, + mSettings->flags.mask_ammo, [&]() { pammo.type.clear(); pammo.mats.clear(); @@ -970,8 +992,8 @@ void StockpileSerializer::read_ammo(DeserializeMode mode, const vector& }); } -bool StockpileSerializer::write_animals(StockpileSettings::AnimalsSet* animals) { - auto & panimals = mPile->settings.animals; +bool StockpileSettingsSerializer::write_animals(StockpileSettings::AnimalsSet* animals) { + auto & panimals = mSettings->animals; bool all = panimals.empty_cages && panimals.empty_traps; animals->set_empty_cages(panimals.empty_cages); @@ -982,13 +1004,13 @@ bool StockpileSerializer::write_animals(StockpileSettings::AnimalsSet* animals) panimals.enabled) && all; } -void StockpileSerializer::read_animals(DeserializeMode mode, const vector& filters) { - auto & panimals = mPile->settings.animals; +void StockpileSettingsSerializer::read_animals(DeserializeMode mode, const vector& filters) { + auto & panimals = mSettings->animals; read_category("animals", mode, std::bind(&StockpileSettings::has_animals, mBuffer), std::bind(&StockpileSettings::animals, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_animals, + mSettings->flags.whole, + mSettings->flags.mask_animals, [&]() { panimals.empty_cages = false; panimals.empty_traps = false; @@ -1010,9 +1032,9 @@ static bool armor_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && mi.material->flags.is_set(material_flags::IS_METAL); } -bool StockpileSerializer::write_armor(StockpileSettings::ArmorSet* armor) { +bool StockpileSettingsSerializer::write_armor(StockpileSettings::ArmorSet* armor) { - auto & parmor = mPile->settings.armor; + auto & parmor = mSettings->armor; bool all = parmor.unusable && parmor.usable; armor->set_unusable(parmor.unusable); @@ -1082,13 +1104,13 @@ bool StockpileSerializer::write_armor(StockpileSettings::ArmorSet* armor) { return all; } -void StockpileSerializer::read_armor(DeserializeMode mode, const vector& filters) { - auto & parmor = mPile->settings.armor; +void StockpileSettingsSerializer::read_armor(DeserializeMode mode, const vector& filters) { + auto & parmor = mSettings->armor; read_category("armor", mode, std::bind(&StockpileSettings::has_armor, mBuffer), std::bind(&StockpileSettings::armor, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_armor, + mSettings->flags.whole, + mSettings->flags.mask_armor, [&]() { parmor.unusable = false; parmor.usable = false; @@ -1160,35 +1182,35 @@ static bool blocks_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -bool StockpileSerializer::write_bars_blocks(StockpileSettings::BarsBlocksSet* bars_blocks) { +bool StockpileSettingsSerializer::write_bars_blocks(StockpileSettings::BarsBlocksSet* bars_blocks) { bool all = serialize_list_material( bars_mat_is_allowed, [&](const string& token) { bars_blocks->add_bars_mats(token); }, - mPile->settings.bars_blocks.bars_mats); + mSettings->bars_blocks.bars_mats); all = serialize_list_material( blocks_mat_is_allowed, [&](const string& token) { bars_blocks->add_blocks_mats(token); }, - mPile->settings.bars_blocks.blocks_mats) && all; + mSettings->bars_blocks.blocks_mats) && all; all = serialize_list_other_mats( mOtherMatsBars.mats, [&](const string& token) { bars_blocks->add_bars_other_mats(token); }, - mPile->settings.bars_blocks.bars_other_mats) && all; + mSettings->bars_blocks.bars_other_mats) && all; all = serialize_list_other_mats( mOtherMatsBlocks.mats, [&](const string& token) { bars_blocks->add_blocks_other_mats(token); }, - mPile->settings.bars_blocks.blocks_other_mats) && all; + mSettings->bars_blocks.blocks_other_mats) && all; return all; } -void StockpileSerializer::read_bars_blocks(DeserializeMode mode, const vector& filters) { - auto & pbarsblocks = mPile->settings.bars_blocks; +void StockpileSettingsSerializer::read_bars_blocks(DeserializeMode mode, const vector& filters) { + auto & pbarsblocks = mSettings->bars_blocks; read_category("bars_blocks", mode, std::bind(&StockpileSettings::has_barsblocks, mBuffer), std::bind(&StockpileSettings::barsblocks, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_bars_blocks, + mSettings->flags.whole, + mSettings->flags.mask_bars_blocks, [&]() { pbarsblocks.bars_mats.clear(); pbarsblocks.bars_other_mats.clear(); @@ -1219,51 +1241,51 @@ void StockpileSerializer::read_bars_blocks(DeserializeMode mode, const vectoradd_thread_silk(token); }, - &mPile->settings.cloth.thread_silk, organic_mat_category::Silk) && all; + &mSettings->cloth.thread_silk, organic_mat_category::Silk) && all; all = serialize_list_organic_mat( [&](const string& token) { cloth->add_thread_plant(token); }, - &mPile->settings.cloth.thread_plant, organic_mat_category::PlantFiber) && all; + &mSettings->cloth.thread_plant, organic_mat_category::PlantFiber) && all; all = serialize_list_organic_mat( [&](const string& token) { cloth->add_thread_yarn(token); }, - &mPile->settings.cloth.thread_yarn, organic_mat_category::Yarn) && all; + &mSettings->cloth.thread_yarn, organic_mat_category::Yarn) && all; all = serialize_list_organic_mat( [&](const string& token) { cloth->add_thread_metal(token); }, - &mPile->settings.cloth.thread_metal, organic_mat_category::MetalThread) && all; + &mSettings->cloth.thread_metal, organic_mat_category::MetalThread) && all; all = serialize_list_organic_mat( [&](const string& token) { cloth->add_cloth_silk(token); }, - &mPile->settings.cloth.cloth_silk, organic_mat_category::Silk) && all; + &mSettings->cloth.cloth_silk, organic_mat_category::Silk) && all; all = serialize_list_organic_mat( [&](const string& token) { cloth->add_cloth_plant(token); }, - &mPile->settings.cloth.cloth_plant, organic_mat_category::PlantFiber) && all; + &mSettings->cloth.cloth_plant, organic_mat_category::PlantFiber) && all; all = serialize_list_organic_mat( [&](const string& token) { cloth->add_cloth_yarn(token); }, - &mPile->settings.cloth.cloth_yarn, organic_mat_category::Yarn) && all; + &mSettings->cloth.cloth_yarn, organic_mat_category::Yarn) && all; all = serialize_list_organic_mat( [&](const string& token) { cloth->add_cloth_metal(token); }, - &mPile->settings.cloth.cloth_metal, organic_mat_category::MetalThread) && all; + &mSettings->cloth.cloth_metal, organic_mat_category::MetalThread) && all; return all; } -void StockpileSerializer::read_cloth(DeserializeMode mode, const vector& filters) { - auto & pcloth = mPile->settings.cloth; +void StockpileSettingsSerializer::read_cloth(DeserializeMode mode, const vector& filters) { + auto & pcloth = mSettings->cloth; read_category("cloth", mode, std::bind(&StockpileSettings::has_cloth, mBuffer), std::bind(&StockpileSettings::cloth, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_cloth, + mSettings->flags.whole, + mSettings->flags.mask_cloth, [&]() { pcloth.thread_silk.clear(); pcloth.thread_yarn.clear(); @@ -1315,20 +1337,20 @@ static bool coins_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid(); } -bool StockpileSerializer::write_coins(StockpileSettings::CoinSet* coins) { +bool StockpileSettingsSerializer::write_coins(StockpileSettings::CoinSet* coins) { return serialize_list_material( coins_mat_is_allowed, [&](const string& token) { coins->add_mats(token); }, - mPile->settings.coins.mats); + mSettings->coins.mats); } -void StockpileSerializer::read_coins(DeserializeMode mode, const vector& filters) { - auto & pcoins = mPile->settings.coins; +void StockpileSettingsSerializer::read_coins(DeserializeMode mode, const vector& filters) { + auto & pcoins = mSettings->coins; read_category("coin", mode, std::bind(&StockpileSettings::has_coin, mBuffer), std::bind(&StockpileSettings::coin, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_coins, + mSettings->flags.whole, + mSettings->flags.mask_coins, [&]() { pcoins.mats.clear(); }, @@ -1378,37 +1400,37 @@ static bool finished_goods_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_GEM) || mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -bool StockpileSerializer::write_finished_goods(StockpileSettings::FinishedGoodsSet* finished_goods) { +bool StockpileSettingsSerializer::write_finished_goods(StockpileSettings::FinishedGoodsSet* finished_goods) { bool all = serialize_list_item_type( finished_goods_type_is_allowed, [&](const string& token) { finished_goods->add_type(token); }, - mPile->settings.finished_goods.type); + mSettings->finished_goods.type); all = serialize_list_material( finished_goods_mat_is_allowed, [&](const string& token) { finished_goods->add_mats(token); }, - mPile->settings.finished_goods.mats) && all; + mSettings->finished_goods.mats) && all; all = serialize_list_other_mats( mOtherMatsFinishedGoods.mats, [&](const string& token) { finished_goods->add_other_mats(token); }, - mPile->settings.finished_goods.other_mats) && all; + mSettings->finished_goods.other_mats) && all; all = serialize_list_quality([&](const string& token) { finished_goods->add_quality_core(token); }, - mPile->settings.finished_goods.quality_core) && all; + mSettings->finished_goods.quality_core) && all; all = serialize_list_quality([&](const string& token) { finished_goods->add_quality_total(token); }, - mPile->settings.finished_goods.quality_total) && all; + mSettings->finished_goods.quality_total) && all; return all; } -void StockpileSerializer::read_finished_goods(DeserializeMode mode, const vector& filters) { - auto & pfinished_goods = mPile->settings.finished_goods; +void StockpileSettingsSerializer::read_finished_goods(DeserializeMode mode, const vector& filters) { + auto & pfinished_goods = mSettings->finished_goods; read_category("finished_goods", mode, std::bind(&StockpileSettings::has_finished_goods, mBuffer), std::bind(&StockpileSettings::finished_goods, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_finished_goods, + mSettings->flags.whole, + mSettings->flags.mask_finished_goods, [&]() { pfinished_goods.type.clear(); pfinished_goods.other_mats.clear(); @@ -1441,7 +1463,7 @@ void StockpileSerializer::read_finished_goods(DeserializeMode mode, const vector }); } -food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_category cat) { +food_pair StockpileSettingsSerializer::food_map(organic_mat_category::organic_mat_category cat) { using df::enums::organic_mat_category::organic_mat_category; switch (cat) { @@ -1451,7 +1473,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_meat(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().meat(idx); }; - return food_pair("meat", setter, &mPile->settings.food.meat, getter, mBuffer.food().meat_size()); + return food_pair("meat", setter, &mSettings->food.meat, getter, mBuffer.food().meat_size()); } case organic_mat_category::Fish: { @@ -1459,7 +1481,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_fish(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().fish(idx); }; - return food_pair("fish/prepared", setter, &mPile->settings.food.fish, getter, mBuffer.food().fish_size()); + return food_pair("fish/prepared", setter, &mSettings->food.fish, getter, mBuffer.food().fish_size()); } case organic_mat_category::UnpreparedFish: { @@ -1467,7 +1489,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_unprepared_fish(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().unprepared_fish(idx); }; - return food_pair("fish/unprepared", setter, &mPile->settings.food.unprepared_fish, getter, mBuffer.food().unprepared_fish_size()); + return food_pair("fish/unprepared", setter, &mSettings->food.unprepared_fish, getter, mBuffer.food().unprepared_fish_size()); } case organic_mat_category::Eggs: { @@ -1475,7 +1497,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_egg(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().egg(idx); }; - return food_pair("egg", setter, &mPile->settings.food.egg, getter, mBuffer.food().egg_size()); + return food_pair("egg", setter, &mSettings->food.egg, getter, mBuffer.food().egg_size()); } case organic_mat_category::Plants: { @@ -1483,7 +1505,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_plants(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().plants(idx); }; - return food_pair("plants", setter, &mPile->settings.food.plants, getter, mBuffer.food().plants_size()); + return food_pair("plants", setter, &mSettings->food.plants, getter, mBuffer.food().plants_size()); } case organic_mat_category::PlantDrink: { @@ -1491,7 +1513,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_drink_plant(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().drink_plant(idx); }; - return food_pair("drink/plant", setter, &mPile->settings.food.drink_plant, getter, mBuffer.food().drink_plant_size()); + return food_pair("drink/plant", setter, &mSettings->food.drink_plant, getter, mBuffer.food().drink_plant_size()); } case organic_mat_category::CreatureDrink: { @@ -1499,7 +1521,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_drink_animal(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().drink_animal(idx); }; - return food_pair("drink/animal", setter, &mPile->settings.food.drink_animal, getter, mBuffer.food().drink_animal_size()); + return food_pair("drink/animal", setter, &mSettings->food.drink_animal, getter, mBuffer.food().drink_animal_size()); } case organic_mat_category::PlantCheese: { @@ -1507,7 +1529,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_cheese_plant(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().cheese_plant(idx); }; - return food_pair("cheese/plant", setter, &mPile->settings.food.cheese_plant, getter, mBuffer.food().cheese_plant_size()); + return food_pair("cheese/plant", setter, &mSettings->food.cheese_plant, getter, mBuffer.food().cheese_plant_size()); } case organic_mat_category::CreatureCheese: { @@ -1515,7 +1537,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_cheese_animal(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().cheese_animal(idx); }; - return food_pair("cheese/animal", setter, &mPile->settings.food.cheese_animal, getter, mBuffer.food().cheese_animal_size()); + return food_pair("cheese/animal", setter, &mSettings->food.cheese_animal, getter, mBuffer.food().cheese_animal_size()); } case organic_mat_category::Seed: { @@ -1523,7 +1545,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_seeds(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().seeds(idx); }; - return food_pair("seeds", setter, &mPile->settings.food.seeds, getter, mBuffer.food().seeds_size()); + return food_pair("seeds", setter, &mSettings->food.seeds, getter, mBuffer.food().seeds_size()); } case organic_mat_category::Leaf: { @@ -1531,7 +1553,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_leaves(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().leaves(idx); }; - return food_pair("leaves", setter, &mPile->settings.food.leaves, getter, mBuffer.food().leaves_size()); + return food_pair("leaves", setter, &mSettings->food.leaves, getter, mBuffer.food().leaves_size()); } case organic_mat_category::PlantPowder: { @@ -1539,7 +1561,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_powder_plant(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().powder_plant(idx); }; - return food_pair("powder/plant", setter, &mPile->settings.food.powder_plant, getter, mBuffer.food().powder_plant_size()); + return food_pair("powder/plant", setter, &mSettings->food.powder_plant, getter, mBuffer.food().powder_plant_size()); } case organic_mat_category::CreaturePowder: { @@ -1547,7 +1569,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_powder_creature(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().powder_creature(idx); }; - return food_pair("powder/animal", setter, &mPile->settings.food.powder_creature, getter, mBuffer.food().powder_creature_size()); + return food_pair("powder/animal", setter, &mSettings->food.powder_creature, getter, mBuffer.food().powder_creature_size()); } case organic_mat_category::Glob: { @@ -1555,7 +1577,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_glob(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().glob(idx); }; - return food_pair("glob", setter, &mPile->settings.food.glob, getter, mBuffer.food().glob_size()); + return food_pair("glob", setter, &mSettings->food.glob, getter, mBuffer.food().glob_size()); } case organic_mat_category::PlantLiquid: { @@ -1563,7 +1585,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_liquid_plant(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().liquid_plant(idx); }; - return food_pair("liquid/plant", setter, &mPile->settings.food.liquid_plant, getter, mBuffer.food().liquid_plant_size()); + return food_pair("liquid/plant", setter, &mSettings->food.liquid_plant, getter, mBuffer.food().liquid_plant_size()); } case organic_mat_category::CreatureLiquid: { @@ -1571,7 +1593,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_liquid_animal(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().liquid_animal(idx); }; - return food_pair("liquid/animal", setter, &mPile->settings.food.liquid_animal, getter, mBuffer.food().liquid_animal_size()); + return food_pair("liquid/animal", setter, &mSettings->food.liquid_animal, getter, mBuffer.food().liquid_animal_size()); } case organic_mat_category::MiscLiquid: { @@ -1579,7 +1601,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_liquid_misc(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().liquid_misc(idx); }; - return food_pair("liquid/misc", setter, &mPile->settings.food.liquid_misc, getter, mBuffer.food().liquid_misc_size()); + return food_pair("liquid/misc", setter, &mSettings->food.liquid_misc, getter, mBuffer.food().liquid_misc_size()); } case organic_mat_category::Paste: @@ -1588,7 +1610,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_glob_paste(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().glob_paste(idx); }; - return food_pair("paste", setter, &mPile->settings.food.glob_paste, getter, mBuffer.food().glob_paste_size()); + return food_pair("paste", setter, &mSettings->food.glob_paste, getter, mBuffer.food().glob_paste_size()); } case organic_mat_category::Pressed: { @@ -1596,7 +1618,7 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego mBuffer.mutable_food()->add_glob_pressed(id); }; FuncReadImport getter = [&](size_t idx) -> string { return mBuffer.food().glob_pressed(idx); }; - return food_pair("pressed", setter, &mPile->settings.food.glob_pressed, getter, mBuffer.food().glob_pressed_size()); + return food_pair("pressed", setter, &mSettings->food.glob_pressed, getter, mBuffer.food().glob_pressed_size()); } case organic_mat_category::Leather: case organic_mat_category::Silk: @@ -1623,8 +1645,8 @@ food_pair StockpileSerializer::food_map(organic_mat_category::organic_mat_catego return food_pair(); } -bool StockpileSerializer::write_food(StockpileSettings::FoodSet* food) { - auto & pfood = mPile->settings.food; +bool StockpileSettingsSerializer::write_food(StockpileSettings::FoodSet* food) { + auto & pfood = mSettings->food; bool all = pfood.prepared_meals; food->set_prepared_meals(pfood.prepared_meals); @@ -1642,16 +1664,16 @@ bool StockpileSerializer::write_food(StockpileSettings::FoodSet* food) { return all; } -void StockpileSerializer::read_food(DeserializeMode mode, const vector& filters) { +void StockpileSettingsSerializer::read_food(DeserializeMode mode, const vector& filters) { using df::enums::organic_mat_category::organic_mat_category; using traits = df::enum_traits; - auto & pfood = mPile->settings.food; + auto & pfood = mSettings->food; read_category("food", mode, std::bind(&StockpileSettings::has_food, mBuffer), std::bind(&StockpileSettings::food, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_food, + mSettings->flags.whole, + mSettings->flags.mask_food, [&]() { pfood.prepared_meals = false; for (int32_t mat_category = traits::first_item_value; mat_category < traits::last_item_value; ++mat_category) { @@ -1682,11 +1704,11 @@ static bool furniture_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -bool StockpileSerializer::write_furniture(StockpileSettings::FurnitureSet* furniture) { +bool StockpileSettingsSerializer::write_furniture(StockpileSettings::FurnitureSet* furniture) { using df::enums::furniture_type::furniture_type; using type_traits = df::enum_traits; - auto & pfurniture = mPile->settings.furniture; + auto & pfurniture = mSettings->furniture; bool all = true; for (size_t i = 0; i < pfurniture.type.size(); ++i) { @@ -1717,13 +1739,13 @@ bool StockpileSerializer::write_furniture(StockpileSettings::FurnitureSet* furni return all; } -void StockpileSerializer::read_furniture(DeserializeMode mode, const vector& filters) { - auto & pfurniture = mPile->settings.furniture; +void StockpileSettingsSerializer::read_furniture(DeserializeMode mode, const vector& filters) { + auto & pfurniture = mSettings->furniture; read_category("furniture", mode, std::bind(&StockpileSettings::has_furniture, mBuffer), std::bind(&StockpileSettings::furniture, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_furniture, + mSettings->flags.whole, + mSettings->flags.mask_furniture, [&]() { pfurniture.type.clear(); pfurniture.other_mats.clear(); @@ -1786,10 +1808,10 @@ static bool gem_other_mat_is_allowed(MaterialInfo& mi) { return mi.isValid() && (mi.getToken() == "GLASS_GREEN" || mi.getToken() == "GLASS_CLEAR" || mi.getToken() == "GLASS_CRYSTAL"); } -bool StockpileSerializer::write_gems(StockpileSettings::GemsSet* gems) { +bool StockpileSettingsSerializer::write_gems(StockpileSettings::GemsSet* gems) { MaterialInfo mi; - auto & pgems = mPile->settings.gems; + auto & pgems = mSettings->gems; bool all = serialize_list_material( gem_mat_is_allowed, @@ -1830,13 +1852,13 @@ bool StockpileSerializer::write_gems(StockpileSettings::GemsSet* gems) { return all; } -void StockpileSerializer::read_gems(DeserializeMode mode, const vector& filters) { - auto & pgems = mPile->settings.gems; +void StockpileSettingsSerializer::read_gems(DeserializeMode mode, const vector& filters) { + auto & pgems = mSettings->gems; read_category("gems", mode, std::bind(&StockpileSettings::has_gems, mBuffer), std::bind(&StockpileSettings::gems, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_gems, + mSettings->flags.whole, + mSettings->flags.mask_gems, [&]() { pgems.cut_other_mats.clear(); pgems.cut_mats.clear(); @@ -1887,19 +1909,19 @@ void StockpileSerializer::read_gems(DeserializeMode mode, const vector& }); } -bool StockpileSerializer::write_leather(StockpileSettings::LeatherSet* leather) { +bool StockpileSettingsSerializer::write_leather(StockpileSettings::LeatherSet* leather) { return serialize_list_organic_mat( [&](const string& id) { leather->add_mats(id); }, - &mPile->settings.leather.mats, organic_mat_category::Leather); + &mSettings->leather.mats, organic_mat_category::Leather); } -void StockpileSerializer::read_leather(DeserializeMode mode, const vector& filters) { - auto & pleather = mPile->settings.leather; +void StockpileSettingsSerializer::read_leather(DeserializeMode mode, const vector& filters) { + auto & pleather = mSettings->leather; read_category("leather", mode, std::bind(&StockpileSettings::has_leather, mBuffer), std::bind(&StockpileSettings::leather, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_leather, + mSettings->flags.whole, + mSettings->flags.mask_leather, [&]() { pleather.mats.clear(); }, @@ -1912,19 +1934,19 @@ void StockpileSerializer::read_leather(DeserializeMode mode, const vectoradd_corpses(token); }, - mPile->settings.corpses.corpses); + mSettings->corpses.corpses); } -void StockpileSerializer::read_corpses(DeserializeMode mode, const vector& filters) { - auto & pcorpses = mPile->settings.corpses; +void StockpileSettingsSerializer::read_corpses(DeserializeMode mode, const vector& filters) { + auto & pcorpses = mSettings->corpses; read_category("corpses", mode, std::bind(&StockpileSettings::has_corpses_v50, mBuffer), std::bind(&StockpileSettings::corpses_v50, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_corpses, + mSettings->flags.whole, + mSettings->flags.mask_corpses, [&]() { pcorpses.corpses.clear(); }, @@ -1945,8 +1967,8 @@ static bool refuse_type_is_allowed(item_type::item_type type) { return true; } -bool StockpileSerializer::write_refuse(StockpileSettings::RefuseSet* refuse) { - auto & prefuse = mPile->settings.refuse; +bool StockpileSettingsSerializer::write_refuse(StockpileSettings::RefuseSet* refuse) { + auto & prefuse = mSettings->refuse; bool all = prefuse.fresh_raw_hide && prefuse.rotten_raw_hide; refuse->set_fresh_raw_hide(prefuse.fresh_raw_hide); @@ -1984,13 +2006,13 @@ bool StockpileSerializer::write_refuse(StockpileSettings::RefuseSet* refuse) { return all; } -void StockpileSerializer::read_refuse(DeserializeMode mode, const vector& filters) { - auto & prefuse = mPile->settings.refuse; +void StockpileSettingsSerializer::read_refuse(DeserializeMode mode, const vector& filters) { + auto & prefuse = mSettings->refuse; read_category("refuse", mode, std::bind(&StockpileSettings::has_refuse, mBuffer), std::bind(&StockpileSettings::refuse, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_refuse, + mSettings->flags.whole, + mSettings->flags.mask_refuse, [&]() { prefuse.fresh_raw_hide = false; prefuse.rotten_raw_hide = false; @@ -2042,25 +2064,25 @@ void StockpileSerializer::read_refuse(DeserializeMode mode, const vector } -bool StockpileSerializer::write_sheet(StockpileSettings::SheetSet* sheet) { +bool StockpileSettingsSerializer::write_sheet(StockpileSettings::SheetSet* sheet) { bool all = serialize_list_organic_mat( [&](const string& token) { sheet->add_paper(token); }, - &mPile->settings.sheet.paper, organic_mat_category::Paper); + &mSettings->sheet.paper, organic_mat_category::Paper); all = serialize_list_organic_mat( [&](const string& token) { sheet->add_parchment(token); }, - &mPile->settings.sheet.parchment, organic_mat_category::Parchment) && all; + &mSettings->sheet.parchment, organic_mat_category::Parchment) && all; return all; } -void StockpileSerializer::read_sheet(DeserializeMode mode, const vector& filters) { - auto & psheet = mPile->settings.sheet; +void StockpileSettingsSerializer::read_sheet(DeserializeMode mode, const vector& filters) { + auto & psheet = mSettings->sheet; read_category("sheet", mode, std::bind(&StockpileSettings::has_sheet, mBuffer), std::bind(&StockpileSettings::sheet, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_sheet, + mSettings->flags.whole, + mSettings->flags.mask_sheet, [&]() { psheet.paper.clear(); psheet.parchment.clear(); @@ -2086,20 +2108,20 @@ static bool stone_is_allowed(const MaterialInfo& mi) { return is_allowed_soil || is_allowed_stone; } -bool StockpileSerializer::write_stone(StockpileSettings::StoneSet* stone) { +bool StockpileSettingsSerializer::write_stone(StockpileSettings::StoneSet* stone) { return serialize_list_material( stone_is_allowed, [&](const string& token) { stone->add_mats(token); }, - mPile->settings.stone.mats); + mSettings->stone.mats); } -void StockpileSerializer::read_stone(DeserializeMode mode, const vector& filters) { - auto & pstone = mPile->settings.stone; +void StockpileSettingsSerializer::read_stone(DeserializeMode mode, const vector& filters) { + auto & pstone = mSettings->stone; read_category("stone", mode, std::bind(&StockpileSettings::has_stone, mBuffer), std::bind(&StockpileSettings::stone, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_stone, + mSettings->flags.whole, + mSettings->flags.mask_stone, [&]() { pstone.mats.clear(); }, @@ -2116,8 +2138,8 @@ static bool weapons_mat_is_allowed(const MaterialInfo& mi) { return mi.isValid() && mi.material && (mi.material->flags.is_set(material_flags::IS_METAL) || mi.material->flags.is_set(material_flags::IS_STONE)); } -bool StockpileSerializer::write_weapons(StockpileSettings::WeaponsSet* weapons) { - auto & pweapons = mPile->settings.weapons; +bool StockpileSettingsSerializer::write_weapons(StockpileSettings::WeaponsSet* weapons) { + auto & pweapons = mSettings->weapons; bool all = pweapons.unusable && pweapons.usable; weapons->set_unusable(pweapons.unusable); @@ -2156,13 +2178,13 @@ bool StockpileSerializer::write_weapons(StockpileSettings::WeaponsSet* weapons) return all; } -void StockpileSerializer::read_weapons(DeserializeMode mode, const vector& filters) { - auto & pweapons = mPile->settings.weapons; +void StockpileSettingsSerializer::read_weapons(DeserializeMode mode, const vector& filters) { + auto & pweapons = mSettings->weapons; read_category("weapons", mode, std::bind(&StockpileSettings::has_weapons, mBuffer), std::bind(&StockpileSettings::weapons, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_weapons, + mSettings->flags.whole, + mSettings->flags.mask_weapons, [&]() { pweapons.unusable = false; pweapons.usable = false; @@ -2209,10 +2231,10 @@ static bool wood_mat_is_allowed(const df::plant_raw* plant) { return plant && plant->flags.is_set(plant_raw_flags::TREE); } -bool StockpileSerializer::write_wood(StockpileSettings::WoodSet* wood) { +bool StockpileSettingsSerializer::write_wood(StockpileSettings::WoodSet* wood) { bool all = true; - for (size_t i = 0; i < mPile->settings.wood.mats.size(); ++i) { - if (!mPile->settings.wood.mats.at(i)) { + for (size_t i = 0; i < mSettings->wood.mats.size(); ++i) { + if (!mSettings->wood.mats.at(i)) { all = false; continue; } @@ -2225,13 +2247,13 @@ bool StockpileSerializer::write_wood(StockpileSettings::WoodSet* wood) { return all; } -void StockpileSerializer::read_wood(DeserializeMode mode, const vector& filters) { - auto & pwood = mPile->settings.wood; +void StockpileSettingsSerializer::read_wood(DeserializeMode mode, const vector& filters) { + auto & pwood = mSettings->wood; read_category("wood", mode, std::bind(&StockpileSettings::has_wood, mBuffer), std::bind(&StockpileSettings::wood, mBuffer), - mPile->settings.flags.whole, - mPile->settings.flags.mask_wood, + mSettings->flags.whole, + mSettings->flags.mask_wood, [&]() { pwood.mats.clear(); }, diff --git a/plugins/stockpiles/StockpileSerializer.h b/plugins/stockpiles/StockpileSerializer.h index f0e1a62e2a..4798fba5e0 100644 --- a/plugins/stockpiles/StockpileSerializer.h +++ b/plugins/stockpiles/StockpileSerializer.h @@ -4,6 +4,7 @@ #include "df/itemdef.h" #include "df/organic_mat_category.h" +#include "df/stockpile_settings.h" #include "proto/stockpiles.pb.h" @@ -57,14 +58,14 @@ struct food_pair { /** * Class for serializing the stockpile_settings structure into a Google protobuf */ -class StockpileSerializer { +class StockpileSettingsSerializer { public: /** - * @param stockpile stockpile to read or write settings to + * @param settings settings to read or write to */ - StockpileSerializer(df::building_stockpilest* stockpile); + StockpileSettingsSerializer(df::stockpile_settings *settings); - ~StockpileSerializer(); + ~StockpileSettingsSerializer(); /** * Since we depend on protobuf-lite, not the full lib, we copy this function from @@ -88,20 +89,20 @@ class StockpileSerializer { */ bool unserialize_from_file(const std::string& file, DeserializeMode mode, const std::vector& filters); -private: - df::building_stockpilest* mPile; +protected: dfstockpiles::StockpileSettings mBuffer; // read memory structures and serialize to protobuf - void write(uint32_t includedElements); + virtual void write(uint32_t includedElements); // parse serialized data into ui indices - void read(DeserializeMode mode, const std::vector& filters); + virtual void read(DeserializeMode mode, const std::vector& filters); - void write_containers(); - void read_containers(DeserializeMode mode); - void write_general(); - void read_general(DeserializeMode mode); + virtual void write_general(); + virtual void read_general(DeserializeMode mode); + +private: + df::stockpile_settings *mSettings; bool write_ammo(dfstockpiles::StockpileSettings::AmmoSet* ammo); void read_ammo(DeserializeMode mode, const std::vector& filters); @@ -139,3 +140,32 @@ class StockpileSerializer { bool write_wood(dfstockpiles::StockpileSettings::WoodSet* wood); void read_wood(DeserializeMode mode, const std::vector& filters); }; + +/** + * Class for serializing a stockpile into a Google protobuf + */ +class StockpileSerializer : public StockpileSettingsSerializer { +public: + /** + * @param stockpile stockpile to read or write settings to + */ + StockpileSerializer(df::building_stockpilest* stockpile); + + ~StockpileSerializer(); + +protected: + // read memory structures and serialize to protobuf + virtual void write(uint32_t includedElements); + + // parse serialized data into ui indices + virtual void read(DeserializeMode mode, const std::vector& filters); + + virtual void write_general(); + virtual void read_general(DeserializeMode mode); + +private: + df::building_stockpilest* mPile; + + void write_containers(); + void read_containers(DeserializeMode mode); +}; diff --git a/plugins/stockpiles/stockpiles.cpp b/plugins/stockpiles/stockpiles.cpp index d1ce46e9c2..de57598c4e 100644 --- a/plugins/stockpiles/stockpiles.cpp +++ b/plugins/stockpiles/stockpiles.cpp @@ -8,6 +8,8 @@ #include "df/building.h" #include "df/building_stockpilest.h" +#include "df/hauling_route.h" +#include "df/hauling_stop.h" #include #include @@ -147,8 +149,54 @@ static bool stockpiles_import(color_ostream& out, string fname, int id, string m return true; } +static bool stockpiles_route_import(color_ostream& out, string fname, int route_id, int stop_id, string mode_str, string filter) { + auto route = df::hauling_route::find(route_id); + if (!route) { + out.printerr("Specified hauling route not found: %d.\n", route_id); + return false; + } + + df::hauling_stop *stop = binsearch_in_vector(route->stops, &df::hauling_stop::id, stop_id); + if (!stop) { + out.printerr("Specified hauling stop not found in route %d: %d.\n", route_id, stop_id); + return false; + } + + if (!is_dfstockfile(fname)) + fname += ".dfstock"; + + if (!Filesystem::exists(fname)) { + out.printerr("ERROR: file doesn't exist: '%s'\n", fname.c_str()); + return false; + } + + DeserializeMode mode = DESERIALIZE_MODE_SET; + if (mode_str == "enable") + mode = DESERIALIZE_MODE_ENABLE; + else if (mode_str == "disable") + mode = DESERIALIZE_MODE_DISABLE; + + vector filters; + split_string(&filters, filter, ",", true); + + try { + StockpileSettingsSerializer cereal(&stop->settings); + if (!cereal.unserialize_from_file(fname, mode, filters)) { + out.printerr("deserialization failed: '%s'\n", fname.c_str()); + return false; + } + } + catch (std::exception& e) { + out.printerr("deserialization failed: protobuf exception: %s\n", e.what()); + return false; + } + + return true; +} + DFHACK_PLUGIN_LUA_FUNCTIONS { DFHACK_LUA_FUNCTION(stockpiles_export), DFHACK_LUA_FUNCTION(stockpiles_import), + DFHACK_LUA_FUNCTION(stockpiles_route_import), DFHACK_LUA_END }; From 20ce4a1612feea8998326f07cc02b7d6d8f0fc15 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 28 May 2023 02:28:45 -0700 Subject: [PATCH 0019/4620] add "everything" stockpile settings file useful for setting hauling route settings --- data/stockpiles/everything.dfstock | Bin 0 -> 82 bytes docs/plugins/stockpiles.rst | 3 +++ 2 files changed, 3 insertions(+) create mode 100644 data/stockpiles/everything.dfstock diff --git a/data/stockpiles/everything.dfstock b/data/stockpiles/everything.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..c0fcb60519dbc8f39b9aab50b01767baa370a8a9 GIT binary patch literal 82 zcmd;LQeYHfUctyH#bm*##gxEk#3aDz#ALwe1*C(RG#I0RI0?wl0`iNPJQ%BhbQ2?x b(Z$G=!8n1DaRwvf4n~Gkj7%Jimp}vnsd5XU literal 0 HcmV?d00001 diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index 560ae24977..685bdcac3d 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -134,6 +134,9 @@ entire category, or with a filter, any matchable subset thereof:: cat_weapons cat_wood +There is also an ``everything`` file that includes all the above categories, +including refuse and corpses. + For many of the categories, there are also flags and subcategory prefixes that you can match with filters and convenient pre-made settings files that manipulate interesting category subsets. From 760cd0cbcb02d7b7b3cd2a0b894219ac66ac95b0 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 28 May 2023 05:37:29 -0700 Subject: [PATCH 0020/4620] implement tameable property filtering --- data/stockpiles/all.dfstock | Bin 0 -> 73 bytes docs/plugins/stockpiles.rst | 29 ++++++++++++++++----- plugins/stockpiles/StockpileSerializer.cpp | 11 ++++++-- 3 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 data/stockpiles/all.dfstock diff --git a/data/stockpiles/all.dfstock b/data/stockpiles/all.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..eace9c53dd7de0601ca25e16759cb90993b5f4bd GIT binary patch literal 73 zcmd;LQeYHfUctyH#bm)~#3aDz#ALwe1*C(RG#I0RI0?wl0`iNPJQ%BhbQ2?x(Z$G= U!8n1DaRwvf4n~Gcj7%Ji07w%GJ^%m! literal 0 HcmV?d00001 diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index 685bdcac3d..ae77e5cf2e 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -134,12 +134,14 @@ entire category, or with a filter, any matchable subset thereof:: cat_weapons cat_wood -There is also an ``everything`` file that includes all the above categories, -including refuse and corpses. +In addition, there are files for ``all``, which includes all categories except +refuse and corpses (mirroring the "all" configuration in-game), and +``everything``, which really includes all categories. -For many of the categories, there are also flags and subcategory prefixes that -you can match with filters and convenient pre-made settings files that -manipulate interesting category subsets. +For many of the categories, there are also flags, subcategory prefixes, and +item properties that you can match with filters. In addition, there are +normally at least a few convenient pre-made settings files that manipulate +interesting category subsets. Ammo stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -172,6 +174,10 @@ Flags:: cages traps +Properties:: + + tameable + Settings files:: cages @@ -274,6 +280,13 @@ Notes: * ``thread`` and ``cloth`` settings files set all materials that are not adamantine. +Corpse stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Properties:: + + tameable + Finished goods stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -295,7 +308,7 @@ Settings files:: Example commands for a toy stockpile:: - stockpiles import cat_furniture -f mats/,other/,core/,total/ + stockpiles import cat_finished_goods -f mats/,other/,core/,total/ stockpiles import -m enable toys Food stockpile adjustments @@ -404,6 +417,10 @@ Flags and subcategory prefixes:: teeth/ horns/ +Properties:: + + tameable + Settings files:: rawhides diff --git a/plugins/stockpiles/StockpileSerializer.cpp b/plugins/stockpiles/StockpileSerializer.cpp index fcb0cee3eb..b650ec6187 100644 --- a/plugins/stockpiles/StockpileSerializer.cpp +++ b/plugins/stockpiles/StockpileSerializer.cpp @@ -11,6 +11,7 @@ // df #include "df/building_stockpilest.h" #include "df/creature_raw.h" +#include "df/caste_raw.h" #include "df/inorganic_raw.h" #include "df/item_quality.h" #include @@ -611,6 +612,12 @@ static bool serialize_list_creature(FuncWriteExport add_value, const vectorcaste.size() || !r->caste[0]->flags.is_set(df::enums::caste_raw_flags::PET)) + return r->name[0]; + return r->name[0] + "/tameable"; +} + static void unserialize_list_creature(const char* subcat, bool all, char val, const vector& filters, FuncReadImport read_value, int32_t list_size, vector& pile_list) { size_t num_elems = world->raws.creatures.all.size(); @@ -618,7 +625,7 @@ static void unserialize_list_creature(const char* subcat, bool all, char val, co if (all) { for (size_t idx = 0; idx < num_elems; ++idx) { auto r = find_creature(idx); - set_filter_elem(subcat, filters, val, r->name[0], r->creature_id, pile_list.at(idx)); + set_filter_elem(subcat, filters, val, get_filter_string(r), r->creature_id, pile_list.at(idx)); } return; } @@ -631,7 +638,7 @@ static void unserialize_list_creature(const char* subcat, bool all, char val, co continue; } auto r = find_creature(idx); - set_filter_elem(subcat, filters, val, r->name[0], r->creature_id, pile_list.at(idx)); + set_filter_elem(subcat, filters, val, get_filter_string(r), r->creature_id, pile_list.at(idx)); } } From 2edfe151d339f8ab4304798fb6c73fcad0888dab Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 28 May 2023 20:42:36 -0700 Subject: [PATCH 0021/4620] update changelog --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index b2ee30767e..4708711c12 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -63,6 +63,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - Window behavior: non-resizable windows now allow dragging by their frame edges by default - `gui/autodump`: fort-mode keybinding: Ctrl-H - Window behavior: if you have multiple DFHack tool windows open, scrolling the mouse wheel while over an unfocused window will focus it and raise it to the top +- `stockpiles`: allow filtering creatures by tameability ## Documentation From 7dad5be7dc30343b75fe9422d1a7114bfbc85593 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Mon, 29 May 2023 07:13:57 +0000 Subject: [PATCH 0022/4620] Auto-update submodules library/xml: master --- library/xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/xml b/library/xml index 1cc81c0faf..17e77412c0 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 1cc81c0faf7aa9fd1c18fbc6ef8b2298f31ab1f9 +Subproject commit 17e77412c040dab658a39a34eb0e21cb014c3824 From d7e08dca6e58c2afa2ab07cfa2970f18336b0007 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Tue, 30 May 2023 16:35:32 +0200 Subject: [PATCH 0023/4620] extend make_frame pens & make paint_frame draw dividers --- library/lua/gui.lua | 72 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 14 deletions(-) diff --git a/library/lua/gui.lua b/library/lua/gui.lua index e22ddae20e..2c03264f13 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -899,13 +899,13 @@ GREY_FRAME = { -- The boundary used by the pre-steam DF screens. -- deprecated BOUNDARY_FRAME = { - frame_pen = to_pen{ ch = 0xDB, fg = COLOR_GREY, bg = COLOR_BLACK }, + frame_pen = to_pen{ ch = 0xDB, fg = COLOR_GREY, bg = COLOR_BLACK }, -- ch=0xDB is "full block" (█) title_pen = to_pen{ fg = COLOR_BLACK, bg = COLOR_GREY }, signature_pen = to_pen{ fg = COLOR_BLACK, bg = COLOR_GREY }, } local BASE_FRAME = { - frame_pen = to_pen{ ch=206, fg=COLOR_GREY, bg=COLOR_BLACK }, + frame_pen = to_pen{ ch=206, fg=COLOR_GREY, bg=COLOR_BLACK }, -- ch=206 is "box drawings double vertical and horizontal" (╬) title_pen = to_pen{ fg=COLOR_BLACK, bg=COLOR_GREY }, inactive_title_pen = to_pen{ fg=COLOR_GREY, bg=COLOR_BLACK }, signature_pen = to_pen{ fg=COLOR_GREY, bg=COLOR_BLACK }, @@ -920,14 +920,42 @@ local function make_frame(name, double_line) end local frame = copyall(BASE_FRAME) + -- external horizontal/vertical bars frame.t_frame_pen = to_pen{ tile=tp(1), ch=double_line and 205 or 196, fg=COLOR_GREY, bg=COLOR_BLACK } frame.l_frame_pen = to_pen{ tile=tp(7), ch=double_line and 186 or 179, fg=COLOR_GREY, bg=COLOR_BLACK } frame.b_frame_pen = to_pen{ tile=tp(15), ch=double_line and 205 or 196, fg=COLOR_GREY, bg=COLOR_BLACK } frame.r_frame_pen = to_pen{ tile=tp(9), ch=double_line and 186 or 179, fg=COLOR_GREY, bg=COLOR_BLACK } + -- external corners frame.lt_frame_pen = to_pen{ tile=tp(0), ch=double_line and 201 or 218, fg=COLOR_GREY, bg=COLOR_BLACK } frame.lb_frame_pen = to_pen{ tile=tp(14), ch=double_line and 200 or 192, fg=COLOR_GREY, bg=COLOR_BLACK } frame.rt_frame_pen = to_pen{ tile=tp(2), ch=double_line and 187 or 191, fg=COLOR_GREY, bg=COLOR_BLACK } frame.rb_frame_pen = to_pen{ tile=tp(16), ch=double_line and 188 or 217, fg=COLOR_GREY, bg=COLOR_BLACK } + -- external T-junctions + frame.tte_frame_pen = to_pen{ tile=tp(10), ch=double_line and 203 or 194, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.bte_frame_pen = to_pen{ tile=tp(11), ch=double_line and 202 or 193, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.lte_frame_pen = to_pen{ tile=tp(12), ch=double_line and 204 or 195, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.rte_frame_pen = to_pen{ tile=tp(13), ch=double_line and 185 or 180, fg=COLOR_GREY, bg=COLOR_BLACK } + -- internal horizontal/vertical bars (and cross junction) + frame.v_frame_pen = to_pen{ tile=tp(4), ch=double_line and 186 or 179, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.h_frame_pen = to_pen{ tile=tp(5), ch=double_line and 205 or 196, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.x_frame_pen = to_pen{ tile=tp(3), ch=double_line and 206 or 197, fg=COLOR_GREY, bg=COLOR_BLACK } + -- internal T-junctions + frame.tti_frame_pen = to_pen{ tile=tp(20), ch=double_line and 203 or 194, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.bti_frame_pen = to_pen{ tile=tp(19), ch=double_line and 202 or 193, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.lti_frame_pen = to_pen{ tile=tp(18), ch=double_line and 204 or 195, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.rti_frame_pen = to_pen{ tile=tp(17), ch=double_line and 185 or 180, fg=COLOR_GREY, bg=COLOR_BLACK } + --[[ naming scheme for t-junctions: + the first letter means: + "t" for "top": the T is not rotated, it looks like the character "T" + "b" for "bottom": the T is upside-down + "l" for "left": the T is rotated 90 degrees counter-clockwise + "r" for "right": the T is rotated 90 degrees clockwise + the second letter means: + "t" for "t-junction": this is a t-junction piece... + the third letter means: + "i" for "internal": this sprite is meant to be drawn inside the frame. + "e" for "external": this sprite is meant to be drawn on the frame itself. + --]] return frame end @@ -955,19 +983,35 @@ INTERIOR_MEDIUM_FRAME = FRAME_INTERIOR_MEDIUM function paint_frame(dc,rect,style,title,inactive,pause_forced,resizable) local pen = style.frame_pen local x1,y1,x2,y2 = dc.x1+rect.x1, dc.y1+rect.y1, dc.x1+rect.x2, dc.y1+rect.y2 - dscreen.paintTile(style.lt_frame_pen or pen, x1, y1) - dscreen.paintTile(style.rt_frame_pen or pen, x2, y1) - dscreen.paintTile(style.lb_frame_pen or pen, x1, y2) - local rb_frame_pen = style.rb_frame_pen - if rb_frame_pen == FRAME_WINDOW.rb_frame_pen and not resizable then - rb_frame_pen = FRAME_PANEL.rb_frame_pen + local signed = false + + if x1 == y2 then + dscreen.paintTile(style.x_frame_pen or pen, x1, y2) + elseif x1 == x2 then + dscreen.paintTile(style.tte_frame_pen or style.tti_frame_pen or pen, x1, y1) + dscreen.paintTile(style.bte_frame_pen or style.bti_frame_pen or pen, x2, y2) + dscreen.fillRect(style.v_frame_pen or pen, x1,y1+1,x2,y2-1) + elseif y1 == y2 then + dscreen.paintTile(style.lte_frame_pen or style.lti_frame_pen or pen, x1, y1) + dscreen.paintTile(style.rte_frame_pen or style.rti_frame_pen or pen, x2, y2) + dscreen.fillRect(style.h_frame_pen or pen, x1+1,y1,x2-1,y2) + else + dscreen.paintTile(style.lt_frame_pen or pen, x1, y1) + dscreen.paintTile(style.rt_frame_pen or pen, x2, y1) + dscreen.paintTile(style.lb_frame_pen or pen, x1, y2) + local rb_frame_pen = style.rb_frame_pen + if rb_frame_pen == FRAME_WINDOW.rb_frame_pen and not resizable then + rb_frame_pen = FRAME_PANEL.rb_frame_pen + end + dscreen.paintTile(rb_frame_pen or pen, x2, y2) + dscreen.fillRect(style.t_frame_pen or style.h_frame_pen or pen,x1+1,y1,x2-1,y1) + dscreen.fillRect(style.b_frame_pen or style.h_frame_pen or pen,x1+1,y2,x2-1,y2) + dscreen.fillRect(style.l_frame_pen or style.v_frame_pen or pen,x1,y1+1,x1,y2-1) + dscreen.fillRect(style.r_frame_pen or style.v_frame_pen or pen,x2,y1+1,x2,y2-1) + signed = style.signature_pen end - dscreen.paintTile(rb_frame_pen or pen, x2, y2) - dscreen.fillRect(style.t_frame_pen or style.h_frame_pen or pen,x1+1,y1,x2-1,y1) - dscreen.fillRect(style.b_frame_pen or style.h_frame_pen or pen,x1+1,y2,x2-1,y2) - dscreen.fillRect(style.l_frame_pen or style.v_frame_pen or pen,x1,y1+1,x1,y2-1) - dscreen.fillRect(style.r_frame_pen or style.v_frame_pen or pen,x2,y1+1,x2,y2-1) - if style.signature_pen ~= false then + + if signed ~= false then dscreen.paintString(style.signature_pen or style.title_pen or pen,x2-7,y2,"DFHack") end From 0f7dd227877f1a385b6c469cc72eb836665f96ac Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Tue, 30 May 2023 17:13:08 +0200 Subject: [PATCH 0024/4620] filterselection/planneroverlay: draw dividers using new system --- plugins/lua/buildingplan/filterselection.lua | 22 ++++---------------- plugins/lua/buildingplan/planneroverlay.lua | 22 +++++--------------- 2 files changed, 9 insertions(+), 35 deletions(-) diff --git a/plugins/lua/buildingplan/filterselection.lua b/plugins/lua/buildingplan/filterselection.lua index e25b58eec2..4620e43324 100644 --- a/plugins/lua/buildingplan/filterselection.lua +++ b/plugins/lua/buildingplan/filterselection.lua @@ -112,7 +112,7 @@ function QualityAndMaterialsPage:init() widgets.Panel{ view_id='materials_lists', frame={l=0, t=HEADER_HEIGHT, r=0, b=FOOTER_HEIGHT+QUALITY_HEIGHT}, - frame_style=gui.INTERIOR_FRAME, + frame_style=gui.FRAME_INTERIOR, subviews={ widgets.List{ view_id='materials_categories', @@ -133,12 +133,12 @@ function QualityAndMaterialsPage:init() widgets.Panel{ view_id='divider', frame={l=TYPE_COL_WIDTH-1, t=HEADER_HEIGHT, b=FOOTER_HEIGHT+QUALITY_HEIGHT, w=1}, - on_render=self:callback('draw_divider'), + frame_style=gui.FRAME_INTERIOR, }, widgets.Panel{ view_id='quality_panel', frame={l=0, r=0, h=QUALITY_HEIGHT, b=FOOTER_HEIGHT}, - frame_style=gui.INTERIOR_FRAME, + frame_style=gui.FRAME_INTERIOR, frame_title='Item quality', subviews={ widgets.CycleHotkeyLabel{ @@ -437,20 +437,6 @@ function QualityAndMaterialsPage:set_max_quality(idx) self.dirty = true end -function QualityAndMaterialsPage:draw_divider(dc) - local y2 = dc.height - 1 - for y=0,y2 do - dc:seek(0, y) - if y == 0 then - dc:char(nil, pens.VERT_TOP_PEN) - elseif y == y2 then - dc:char(nil, pens.VERT_BOT_PEN) - else - dc:char(nil, pens.VERT_MID_PEN) - end - end -end - function QualityAndMaterialsPage:onRenderFrame(dc, rect) QualityAndMaterialsPage.super.onRenderFrame(self, dc, rect) if self.dirty then @@ -466,7 +452,7 @@ GlobalSettingsPage = defclass(GlobalSettingsPage, widgets.ResizingPanel) GlobalSettingsPage.ATTRS{ autoarrange_subviews=true, frame={t=0, l=0}, - frame_style=gui.INTERIOR_FRAME, + frame_style=gui.FRAME_INTERIOR, } function GlobalSettingsPage:init() diff --git a/plugins/lua/buildingplan/planneroverlay.lua b/plugins/lua/buildingplan/planneroverlay.lua index 803e9ae998..7cb227636e 100644 --- a/plugins/lua/buildingplan/planneroverlay.lua +++ b/plugins/lua/buildingplan/planneroverlay.lua @@ -345,11 +345,13 @@ function PlannerOverlay:init() local main_panel = widgets.Panel{ view_id='main', frame={t=1, l=0, r=0, h=14}, - frame_style=gui.INTERIOR_MEDIUM_FRAME, + frame_style=gui.FRAME_MEDIUM, frame_background=gui.CLEAR_PEN, visible=self:callback('is_not_minimized'), } + main_panel.frame_style.signature_pen = false + local minimized_panel = widgets.Panel{ frame={t=0, r=1, w=17, h=1}, subviews={ @@ -557,14 +559,14 @@ function PlannerOverlay:init() local divider_widget = widgets.Panel{ view_id='divider', frame={t=10, l=0, r=0, h=1}, - on_render=self:callback('draw_divider_h'), + frame_style=gui.FRAME_MEDIUM, visible=self:callback('is_not_minimized'), } local error_panel = widgets.ResizingPanel{ view_id='errors', frame={t=15, l=0, r=0}, - frame_style=gui.BOLD_FRAME, + frame_style=gui.FRAME_BOLD, frame_background=gui.CLEAR_PEN, visible=self:callback('is_not_minimized'), } @@ -641,20 +643,6 @@ function PlannerOverlay:toggle_minimized() config:write() end -function PlannerOverlay:draw_divider_h(dc) - local x2 = dc.width -1 - for x=0,x2 do - dc:seek(x, 0) - if x == 0 then - dc:char(nil, pens.HORI_LEFT_PEN) - elseif x == x2 then - dc:char(nil, pens.HORI_RIGHT_PEN) - else - dc:char(nil, pens.HORI_MID_PEN) - end - end -end - function PlannerOverlay:reset() self.subviews.item1:reset() self.subviews.item2:reset() From 57430d5f8b3c5202d97309e9e51d87882ed93cbb Mon Sep 17 00:00:00 2001 From: TaxiService Date: Tue, 30 May 2023 18:04:18 +0200 Subject: [PATCH 0025/4620] fixed cross-piece rendering fixes a bug that made frames render the cross-piece on larger panels than 1x1 under some circumstances --- library/lua/gui.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/lua/gui.lua b/library/lua/gui.lua index 2c03264f13..2e6289e7a1 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -985,7 +985,7 @@ function paint_frame(dc,rect,style,title,inactive,pause_forced,resizable) local x1,y1,x2,y2 = dc.x1+rect.x1, dc.y1+rect.y1, dc.x1+rect.x2, dc.y1+rect.y2 local signed = false - if x1 == y2 then + if x1 == x2 and y1 == y2 then dscreen.paintTile(style.x_frame_pen or pen, x1, y2) elseif x1 == x2 then dscreen.paintTile(style.tte_frame_pen or style.tti_frame_pen or pen, x1, y1) From acca228ac87fa2db27c97912757ced0781dc58d4 Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Wed, 31 May 2023 07:13:26 +0000 Subject: [PATCH 0026/4620] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index a26e72b6e1..6a746d6d53 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit a26e72b6e1da16d6fcaadc71518314fb8aaae193 +Subproject commit 6a746d6d53dcff667c9105579db0f4f1c7f7c9b0 From 1f66ad69304c213d9d357a7a96b50090fd214a25 Mon Sep 17 00:00:00 2001 From: Taxi Service Date: Wed, 31 May 2023 11:58:02 +0200 Subject: [PATCH 0027/4620] added last buildingplan scripts & changelog --- docs/changelog.txt | 3 +++ plugins/lua/buildingplan/inspectoroverlay.lua | 2 +- plugins/lua/buildingplan/itemselection.lua | 2 +- plugins/lua/buildingplan/pens.lua | 25 +------------------ 4 files changed, 6 insertions(+), 26 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 4708711c12..6c792b5dd0 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -75,6 +75,9 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Lua - ``overlay.reload()``: has been renamed to ``overlay.rescan()`` so as not to conflict with the global ``reload()`` function. If you are developing an overlay, please take note of the new function name for reloading your overlay during development. - ``gui``: changed frame naming scheme to ``FRAME_X`` rather than ``X_FRAME``, and added aliases for backwards compatibility. (for example ``BOLD_FRAME`` is now called ``FRAME_BOLD``) +- ``gui.make_frame()``: now maps every tile sprite from a border spritesheet. +- ``gui.paint_frame()``: Panels with width or height equal to 1 will now draw a ``divider``. +- ``buildingplan``: has been updated to make use of the new gui elements internally. - ``ensure_keys``: walks a series of keys, creating new tables for any missing values ## Removed diff --git a/plugins/lua/buildingplan/inspectoroverlay.lua b/plugins/lua/buildingplan/inspectoroverlay.lua index 5262eccc8b..604896f3df 100644 --- a/plugins/lua/buildingplan/inspectoroverlay.lua +++ b/plugins/lua/buildingplan/inspectoroverlay.lua @@ -67,7 +67,7 @@ InspectorOverlay.ATTRS{ default_enabled=true, viewscreens='dwarfmode/ViewSheets/BUILDING', frame={w=30, h=15}, - frame_style=gui.MEDIUM_FRAME, + frame_style=gui.FRAME_MEDIUM, frame_background=gui.CLEAR_PEN, } diff --git a/plugins/lua/buildingplan/itemselection.lua b/plugins/lua/buildingplan/itemselection.lua index 84e866502e..b77a889fa7 100644 --- a/plugins/lua/buildingplan/itemselection.lua +++ b/plugins/lua/buildingplan/itemselection.lua @@ -146,7 +146,7 @@ function ItemSelection:init() }, widgets.Panel{ frame={l=0, t=3, r=0, b=0}, - frame_style=gui.INTERIOR_FRAME, + frame_style=gui.FRAME_INTERIOR, subviews={ widgets.FilteredList{ view_id='flist', diff --git a/plugins/lua/buildingplan/pens.lua b/plugins/lua/buildingplan/pens.lua index e69a4c210d..bd88c35227 100644 --- a/plugins/lua/buildingplan/pens.lua +++ b/plugins/lua/buildingplan/pens.lua @@ -1,38 +1,15 @@ local _ENV = mkmodule('plugins.buildingplan.pens') GOOD_TILE_PEN, BAD_TILE_PEN = nil, nil -VERT_TOP_PEN, VERT_MID_PEN, VERT_BOT_PEN = nil, nil, nil -HORI_LEFT_PEN, HORI_MID_PEN, HORI_RIGHT_PEN = nil, nil, nil -BUTTON_START_PEN, BUTTON_END_PEN = nil, nil SELECTED_ITEM_PEN = nil MINI_TEXT_PEN, MINI_TEXT_HPEN, MINI_BUTT_PEN, MINI_BUTT_HPEN = nil, nil, nil, nil local to_pen = dfhack.pen.parse -local tp = function(base, offset) - if base == -1 then return nil end - return base + offset -end - function reload_pens() GOOD_TILE_PEN = to_pen{ch='o', fg=COLOR_GREEN, tile=dfhack.screen.findGraphicsTile('CURSORS', 1, 2)} BAD_TILE_PEN = to_pen{ch='X', fg=COLOR_RED, tile=dfhack.screen.findGraphicsTile('CURSORS', 3, 0)} - - local tb_texpos = dfhack.textures.getThinBordersTexposStart() - VERT_TOP_PEN = to_pen{tile=tp(tb_texpos, 10), ch=194, fg=COLOR_GREY, bg=COLOR_BLACK} - VERT_MID_PEN = to_pen{tile=tp(tb_texpos, 4), ch=179, fg=COLOR_GREY, bg=COLOR_BLACK} - VERT_BOT_PEN = to_pen{tile=tp(tb_texpos, 11), ch=193, fg=COLOR_GREY, bg=COLOR_BLACK} - - local mb_texpos = dfhack.textures.getMediumBordersTexposStart() - HORI_LEFT_PEN = to_pen{tile=tp(mb_texpos, 12), ch=195, fg=COLOR_GREY, bg=COLOR_BLACK} - HORI_MID_PEN = to_pen{tile=tp(mb_texpos, 5), ch=196, fg=COLOR_GREY, bg=COLOR_BLACK} - HORI_RIGHT_PEN = to_pen{tile=tp(mb_texpos, 13), ch=180, fg=COLOR_GREY, bg=COLOR_BLACK} - - local cp_texpos = dfhack.textures.getControlPanelTexposStart() - BUTTON_START_PEN = to_pen{tile=tp(cp_texpos, 13), ch='[', fg=COLOR_YELLOW} - BUTTON_END_PEN = to_pen{tile=tp(cp_texpos, 15), ch=']', fg=COLOR_YELLOW} - SELECTED_ITEM_PEN = to_pen{tile=tp(cp_texpos, 9), ch=string.char(251), fg=COLOR_YELLOW} - + SELECTED_ITEM_PEN = to_pen{ch=string.char(251), fg=COLOR_YELLOW} MINI_TEXT_PEN = to_pen{fg=COLOR_BLACK, bg=COLOR_GREY} MINI_TEXT_HPEN = to_pen{fg=COLOR_BLACK, bg=COLOR_WHITE} MINI_BUTT_PEN = to_pen{fg=COLOR_BLACK, bg=COLOR_LIGHTRED} From 974a6155c06071293f7a51bab4d902d9dae76bc3 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 31 May 2023 18:48:08 -0700 Subject: [PATCH 0028/4620] reinstated Buildings.setOwner --- docs/dev/Lua API.rst | 4 ++-- library/include/modules/Buildings.h | 4 ++-- library/modules/Buildings.cpp | 29 ++++++++++++++--------------- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index e5167a531d..d07cb045e3 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -1944,9 +1944,9 @@ General Searches for a specific_ref with the given type. -* ``dfhack.buildings.setOwner(item,unit)`` +* ``dfhack.buildings.setOwner(civzone,unit)`` - Replaces the owner of the building. If unit is *nil*, removes ownership. + Replaces the owner of the civzone. If unit is *nil*, removes ownership. Returns *false* in case of error. * ``dfhack.buildings.getSize(building)`` diff --git a/library/include/modules/Buildings.h b/library/include/modules/Buildings.h index 66745abe63..78163108e3 100644 --- a/library/include/modules/Buildings.h +++ b/library/include/modules/Buildings.h @@ -108,9 +108,9 @@ DFHACK_EXPORT df::general_ref *getGeneralRef(df::building *building, df::general DFHACK_EXPORT df::specific_ref *getSpecificRef(df::building *building, df::specific_ref_type type); /** - * Sets the owner unit for the building. + * Sets the owner unit for the zone. */ -DFHACK_EXPORT bool setOwner(df::building *building, df::unit *owner); +DFHACK_EXPORT bool setOwner(df::building_civzonest *building, df::unit *owner); /** * Find the building located at the specified tile. diff --git a/library/modules/Buildings.cpp b/library/modules/Buildings.cpp index dca8010da0..3d0d89c497 100644 --- a/library/modules/Buildings.cpp +++ b/library/modules/Buildings.cpp @@ -350,46 +350,45 @@ df::specific_ref *Buildings::getSpecificRef(df::building *building, df::specific return findRef(building->specific_refs, type); } -bool Buildings::setOwner(df::building *bld, df::unit *unit) +bool Buildings::setOwner(df::building_civzonest *bld, df::unit *unit) { CHECK_NULL_POINTER(bld); -/* TODO: understand how this changes for v50 - if (!bld->is_room) - return false; - if (bld->owner == unit) + + if (bld->assigned_unit == unit) return true; - if (bld->owner) + df::building * pbld = dynamic_cast(bld); + + if (bld->assigned_unit) { - auto &blist = bld->owner->owned_buildings; - vector_erase_at(blist, linear_index(blist, bld)); + auto &blist = bld->assigned_unit->owned_buildings; + vector_erase_at(blist, linear_index(blist, pbld)); - if (auto spouse = df::unit::find(bld->owner->relationship_ids[df::unit_relationship_type::Spouse])) + if (auto spouse = df::unit::find(bld->assigned_unit->relationship_ids[df::unit_relationship_type::Spouse])) { auto &blist = spouse->owned_buildings; - vector_erase_at(blist, linear_index(blist, bld)); + vector_erase_at(blist, linear_index(blist, pbld)); } } - bld->owner = unit; + bld->assigned_unit = unit; if (unit) { - bld->owner_id = unit->id; + bld->assigned_unit_id = unit->id; unit->owned_buildings.push_back(bld); if (auto spouse = df::unit::find(unit->relationship_ids[df::unit_relationship_type::Spouse])) { auto &blist = spouse->owned_buildings; - if (bld->canUseSpouseRoom() && linear_index(blist, bld) < 0) + if (bld->canUseSpouseRoom() && linear_index(blist, pbld) < 0) blist.push_back(bld); } } else { - bld->owner_id = -1; + bld->assigned_unit_id = -1; } -*/ return true; } From 5c914280c3cbfaf88fc9fb00d92b97033839081b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 1 Jun 2023 10:53:08 -0700 Subject: [PATCH 0029/4620] change dynamic_cast -> virtual_cast --- library/modules/Buildings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/modules/Buildings.cpp b/library/modules/Buildings.cpp index 3d0d89c497..78c7b00ed8 100644 --- a/library/modules/Buildings.cpp +++ b/library/modules/Buildings.cpp @@ -357,7 +357,7 @@ bool Buildings::setOwner(df::building_civzonest *bld, df::unit *unit) if (bld->assigned_unit == unit) return true; - df::building * pbld = dynamic_cast(bld); + df::building * pbld = virtual_cast(bld); if (bld->assigned_unit) { From 6ba830f2cfdc72b382e319344ad6e560477b429b Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Thu, 1 Jun 2023 17:54:12 +0000 Subject: [PATCH 0030/4620] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index 6a746d6d53..6430e8ed0f 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 6a746d6d53dcff667c9105579db0f4f1c7f7c9b0 +Subproject commit 6430e8ed0facbe152e98f5ff1f274febfd6b5772 From ecf82471cfc8886d2424ecb43e1ea81c487c460d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Thu, 1 Jun 2023 11:20:08 -0700 Subject: [PATCH 0031/4620] update for 50.08-r2 --- CMakeLists.txt | 4 ++-- docs/changelog.txt | 49 +++++++++++++++++++++++++++++----------------- library/xml | 2 +- scripts | 2 +- 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c1560c6301..3ea16ce29f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,8 +192,8 @@ endif() # set up versioning. set(DF_VERSION "50.08") -set(DFHACK_RELEASE "r2rc1") -set(DFHACK_PRERELEASE TRUE) +set(DFHACK_RELEASE "r2") +set(DFHACK_PRERELEASE FALSE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") diff --git a/docs/changelog.txt b/docs/changelog.txt index 4708711c12..bd1b97e6e0 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -34,14 +34,32 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: # Future ## New Plugins -- `add-spatter`: reinstated: allow mods to add poisons and magical effects to weapons -- `changeitem`: reinstated: change item material, quality, and subtype -- `createitem`: reinstated: create arbitrary items, from the command line -- `deramp`: reinstated: removes all ramps designated for removal from the map -- `flows`: reinstated: counts map blocks with flowing liquids -- `lair`: reinstated: mark the map as a monster lair (this avoids item scatter when the fortress is abandoned) -- `luasocket`: reinstated: provides a Lua API for accessing network sockets -- `work-now`: reinstated, renamed from ``workNow``: reduce the time that dwarves are left without a task after completing a job + +## Fixes + +## Misc Improvements + +## Documentation + +## API + +## Internals + +## Lua + +## Removed + +# 50.08-r2 + +## New Plugins +- `add-spatter`: (reinstated) allow mods to add poisons and magical effects to weapons +- `changeitem`: (reinstated) change item material, quality, and subtype +- `createitem`: (reinstated) create arbitrary items from the command line +- `deramp`: (reinstated) removes all ramps designated for removal from the map +- `flows`: (reinstated) counts map blocks with flowing liquids +- `lair`: (reinstated) mark the map as a monster lair (this avoids item scatter when the fortress is abandoned) +- `luasocket`: (reinstated) provides a Lua API for accessing network sockets +- `work-now`: (reinstated, renamed from ``workNow``) prevent dwarves from wandering aimlessly with "No job" after completing a task ## Fixes - DFHack screen backgrounds now use appropriate tiles in DF Classic @@ -51,24 +69,19 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `autodump`: no longer checks for a keyboard cursor before executing, so ``autodump destroy`` (which doesn't require a cursor) can still function -- Settings: recover gracefully when settings files become corrupted (e.g. by CTD) -- `orders`: update orders in orders library for prepared meals, bins, archer uniforms, and weapons -- Terminal console no longer appears in front of the game window on startup +- Settings: recover gracefully when settings files become corrupted (e.g. by DF CTD) +- `orders`: update orders in library for prepared meals, bins, archer uniforms, and weapons - `gui/control-panel`: new preference for whether filters in lists search for substrings in the middle of words (e.g. if set to true, then "ee" will match "steel") - `gui/design`: Improved performance for drawing shapes - Dreamfort: improve traffic patterns throughout the fortress - `gui/blueprint`: recording of stockpile layouts and categories is now supported. note that detailed stockpile configurations will *not* be saved (yet) -- Core: For debugging purposes, you can now pass ``--disable-dfhack`` on the Dwarf Fortress commandline or specify ``DFHACK_DISABLE=1`` in the environment to disable DFHack for the current session. -- `overlay`: added links to the quickstart guide and the control panel on the DF title screen +- Core: new commandline flag/environment var: pass ``--disable-dfhack`` on the Dwarf Fortress commandline or specify ``DFHACK_DISABLE=1`` in the environment to disable DFHack for the current session. +- `overlay`: add links to the quickstart guide and the control panel on the DF title screen - Window behavior: non-resizable windows now allow dragging by their frame edges by default -- `gui/autodump`: fort-mode keybinding: Ctrl-H +- `gui/autodump`: fort-mode keybinding: Ctrl-H (when ``armok`` tools are enabled in `gui/control-panel`) - Window behavior: if you have multiple DFHack tool windows open, scrolling the mouse wheel while over an unfocused window will focus it and raise it to the top - `stockpiles`: allow filtering creatures by tameability -## Documentation - -## API - ## Internals - ``dfhack.internal``: added memory analysis functions: ``msizeAddress``, ``getHeapState``, ``heapTakeSnapshot``, ``isAddressInHeap``, ``isAddressActiveInHeap``, ``isAddressUsedAfterFreeInHeap``, ``getAddressSizeInHeap``, and ``getRootAddressOfHeapObject`` diff --git a/library/xml b/library/xml index 17e77412c0..51fe3ca11f 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 17e77412c040dab658a39a34eb0e21cb014c3824 +Subproject commit 51fe3ca11f9587bc50ed09b768022cd9688250d8 diff --git a/scripts b/scripts index 6430e8ed0f..315c7afc20 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 6430e8ed0facbe152e98f5ff1f274febfd6b5772 +Subproject commit 315c7afc20651ac0fe1700d720f71796190f198e From 4a2b97105c76998320f0c0f73b5d4c3d2a6839bc Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 5 Jun 2023 14:18:55 -0700 Subject: [PATCH 0032/4620] only initialize steam if launched from steam --- docs/changelog.txt | 1 + library/modules/DFSteam.cpp | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index bd1b97e6e0..c36597047b 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,6 +36,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes +- Fix crash for some players when they launch DF outside of the Steam client ## Misc Improvements diff --git a/library/modules/DFSteam.cpp b/library/modules/DFSteam.cpp index 289c22e27d..1fd064d563 100644 --- a/library/modules/DFSteam.cpp +++ b/library/modules/DFSteam.cpp @@ -52,6 +52,12 @@ static void bind_all(color_ostream& out, DFLibrary* handle) { } bool DFSteam::init(color_ostream& out) { + char *steam_client_launch = getenv("SteamClientLaunch"); + if (!steam_client_launch || strncmp(steam_client_launch, "1", 2) != 0) { + DEBUG(dfsteam, out).print("not launched from Steam client; not initializing steam\n"); + return false; + } + for (auto& lib_str : STEAM_LIBS) { if ((g_steam_handle = OpenPlugin(lib_str.c_str()))) break; @@ -168,11 +174,6 @@ void DFSteam::launchSteamDFHackIfNecessary(color_ostream& out) { return; } - if (strncmp(getenv("SteamClientLaunch"), "1", 2)) { - DEBUG(dfsteam, out).print("not launched from Steam client\n"); - return; - } - void* iSteamApps = g_SteamInternal_FindOrCreateUserInterface(g_SteamAPI_GetHSteamUser(), "STEAMAPPS_INTERFACE_VERSION008"); if (!iSteamApps) { DEBUG(dfsteam, out).print("cannot obtain iSteamApps interface\n"); From d8c1e64c5c7684f5508ca1e5b505d833c4f65709 Mon Sep 17 00:00:00 2001 From: UnFaventia <135673143+UnFaventia@users.noreply.github.com> Date: Tue, 6 Jun 2023 10:38:24 +1000 Subject: [PATCH 0033/4620] Update autonick.txt --- data/dfhack-config/autonick.txt | 864 ++++++++++++++++++++++++++++++++ 1 file changed, 864 insertions(+) diff --git a/data/dfhack-config/autonick.txt b/data/dfhack-config/autonick.txt index e7de79f546..2c11208886 100644 --- a/data/dfhack-config/autonick.txt +++ b/data/dfhack-config/autonick.txt @@ -24,6 +24,36 @@ Jay Crow Raven Sparrow +Platypus +House Mouse +Pangolin +Funnel Web +Weasel +Meerkats +Rat +Ant +Gopher +Fennec +Groundhog +Aardvark +Rabbit +Olm +Chipmunk +Bilbie +Vole +Nile Croc +Wombat +Worm +Gerbil +Armodillo +Thrinaxodon +Binky +Bandicoot +Bettongs +Potoroos +Antechinus +Jerboas +Numbat # colours Flash @@ -35,11 +65,435 @@ Indigo Jade Umber Silver +Bistre +Black +Black bean +Noir +Charcoal +Ebony +Eerie +Jet +Licorice +Midnight +Night +Onyx +Space +Raisin +Rich +Russ violet +Smoky +Taupe +Aero +Alice +Argent Lue +Azure +Azul +Baby blue +Berkeley +Bice +Bleu +Bondi +Brandeis Byzant +Cambridge +Carolina +Celestial +Celtic +Cerulean +Chefchaouen +Chrysler +Cobalt +Columbia +Cornflower +Sky +Delft +Denim +Dodger +Duke +Federal +Glaucous +Electrindigo +Eclipse +Ice +Illini +Klein +Jordy +Lapis Lazuli +Majorelle +Marian +Maya +Slate +Munsell +Navy +Neon blue +Oxford +Palatinate +Penn +Periwinkle +Phthalo +Picton +Poly +Powder +Prussia +Royal +Ruddy +Sapphire +Honolulu +Savoy +Silver Lake +Space cadet +Steel +Tang +Tufts +Ultramarine +Uranian +Vista +Yale +Zaffre +Auburn +Almond +Beaver +Beige +Bole +Bone +Bronze +Buff +Burgundy +Sienna +Umber +Camel +Caput mortuum +Caramel +Chamoisee +Chestnut +Chocolate +Citron +Cocoa +Coffee +Copper +Cordovan +Coyote +Desert +Drab +Dun +Earth +Ecru +Fallow +Fawn +Field +Fulvous +Goldenrod +Harvest +Khaki +Kobicha +Lion +Liver +Mahogany +Maroon +Ochre +Redwood +Rufous +Russet +Rust +Sand +Satin +Sheen +Seal +Sepia +Sinopia +Tan +Taupe +Tawny +Titian +Van Dyke +Walnut +Wenge +Wheat +Aqua +Aquamarine +Capri +Caribbean +Celeste +Cyprus +Fluorescent +Jungle +Keppel +Ice +Sea +Moonstone +Myrtle +Pacific +Pine +Robin +Skobeloff +Teal +Turquoise +Verdigris +Vivid +Zomp +Platinum +Timberwolf +Ash +Rose quartz +Cinereous +Cadet +Cool +Davys +Paynes +Glaucous +Gunmetal +Feldgrau +Apple +Asparagus +Avocado +Brunswick +Cal Poly +Castleton +Celadon +Chartreuse +Moss +Pastel +Dartmouth +Emerald +Erin +Fern +Forest +Harlequin +Honeydew +Hunter +Jade +Kelly green +Lawn +Lime +Malachite +Mantis +Mindaro +Neon +Olivine +Paris +Pear +Pigment +Pine +Pistachio +Reseda +Rifle +Sage +Screamin' +Shamrock +Bud +Amaranth +Baker-Miller +Cerise +Crimson +Carmine +Magenta +Eggplant +Fandango +Finn +Fuchsia +Haze +Mulberry +Orchid +Plum +Pizzazz +Quinacridone +Raspberry +Razzle dazzle +Rose +Shocking +Telemagenta +Aerospace +Alloy +Amber +Apricot +Atomic +Tangerine +Burnt +Butterscotch +Carrot +Champagne +Chrome +Coral +Flame +Gold +Hunyadi +Melon +Peel +Papaya +Peach +Persimmon +Princeton +Pumpkin +Rust +Safety orange +Saffron +Tangelo +Tigers Eye +Titian +Xanthous +Blush +Brilliant +Brink +Carnation +Cherry +Cordovan +Cyclamen +Dogwood +Folly +Heliotrope +Hollywood +Hot +Lavender +Mimi +Misty +Mountbatten +Orchid +Phlox +Pompadour +Puce +Raspberry +Razzmatazz +Bonbon +Quartz +Taupe +Vale +Rosewood +Rosy +Salmon +Seashell +Tea +Tickle +Thulian +Ultra +Burgundy +Byzantium +Caput mortuum +Eminence +Grape +Iris +Mardi Gras +Mauve +Mauveine +Mulberry +Murrey +Palatinate +Pale +Pomp +Power +Purpureus +Tekhelet +Thistle +Tropical +Tyrian +Wisteria +Barn +Bittersweet +Shimmer +Blood +Candy apple +Cantaloupe +Cardinal +Carmine +Chili +Cosmos +Cinnabar +Claret +Coquelicot +Cordovan +Cornell +Crimson +Falu +Brick +Engine +Folly +Garnet +Imperial +Jasper +Penn +Poppy +Redwood +Rojo +Rust +Rusty +Scarlet +Syracuse +Tomato +Turkey +Vermilion +Wine +Alabaster +Antique +Cornsilk +Latte +Cream +Eggshell +Flax +Floral +Ghost +Isabelline +Ivory +Lemon +chiffon +Linen +Navajo +Nyanza +Lace +Parchment +Pearl +Seasalt +Seashell +Vanilla +Smoke +Amber +Apricot +Arylide +Aureolin +Buff +Canary +Citron +Ecru +Gamboge +Icterine +Jonquil +Maize +Mikado +Mindaro +Mustard +Selective +Stil de grain +Straw +Sunglow +Sunset +Wheat # planets Mars Jupiter Saturn +Pluto +Neptune +Europa + +# charites +Damia +Auxesia +Cleta +Phaenna +Hegemone +Peitho +Paregoros +Pasithea +Charis +Kale +Antheia +Eudaimonia +Euthymia +Eutychia +Paidia +Pandaisia +Pannychis +Aglaea +Euphrosyne +Thalia # nature Blaze @@ -150,3 +604,413 @@ Wilder Wisdom Wyatt Zephyr + +# Gemstones +Actinolite +Nephrite +Adamite +Aegirine +Afghanite +Agrellite +Algodonite +Alunite +Amblygonite +Analcime +Anatase +Andalusite +Chiastolite +Andesine +Anglesite +Anhydrite +Annabergite +Anorthite +Antigorite +Bowenite +Apatite +Apophyllite +Aragonite +Asbestos +Astrophyllite +Augelite +Austinite +Ferro +Magnes +Mangan +Tinzenite +Azurmalachite +Azurite +Baryte +Bast +Bayldonite +Benitoite +Beryl +Aquamarine +Maxixe +Emerald +Goshenite +Golden beryl +Heliodor +Morganite +Red beryl +Beryllonite +Beudantite +Bismutot +Biotit +Bole +Boracite +Bornite +Brazilianite +Brookite +Brucite +Bustam +Bytown +Calcite +Caledonite +Canasite +Cancrin +Vishnev +Carleton +Carnall +Cassiterite +Cataplei +Cavans +Celestite +Ceruleite +Cerussite +Chabaz +Chalcopyr +Chambers +Charlesite +Charoite +Childrenite +Chiolite +Chrysoberyl +Alexandrite +Cymophane +Chromite +Chrysocolla +Cinnabar +Clinochlore +Clinohumite +Clintonite +Cobaltite +Coleman +Cordierite +Iolite +Cornwallite +Corundum +Ruby +Sapphire +Padparadscha +Covell +Creedite +Crocite +Cuprite +Danburite +Datolite +Descloiz +Diamond +Bort +Ballas +Diaspore +Dickinsonite +Diopside +Dioptase +Dolomite +Dumortier +Ekanite +Elbaite +Emerald +Trapiche +Enstatite +Bronzite +Hypersthene +Eosphorite +Epidote +Piemont +Erythrite +Esperite +Ettring +Eudialyte +Faya +Feldspar +Andesine +Albite +Anorth +Anorthoc +Amazon +Celsian +Microcline +Moonstone +Adularia +Rainbow +Ortho +Unakite +Plagioclase +Labradorite +Oligoclase +Sanidine +Sunstone +Oregon Sunstone +Rainbow Lattice +Fergusonite +Ferroaxin +Fluora +Fluorapophyl +Fluorite +Forster +Friedelite +Gadolin +Gahnite +Gahnospinel +Garnet +Pyralspite +Almandine +Pyrope +Spessartine +Ugrand +Demantoid +Melanite +Topazolita +Grossular +Hessonite +Hydrogrossular +Tsavorite +Pyrope +Rhodolite +Mali garnet +Malaia +Spessar +Umbal +Gaspe +Gayluss +Gibbsite +Glaucophane +Goeth +Goosecreek +Grandidier +Gypsum +Gyro +Halite +Hambergite +Hanksite +Hardystonite +Helenite +Hematite +Herder +Hexagonite +Hibonite +Hidden +Hodgkinsonite +Holtite +Howlite +Huebnerite +Humite +Hurlbut +Ilmenite +Inderite +Jade +Jadeite +Jasper +Jeremejevite +Kainite +Kämmerer +Kaolin +Kornerup +Kurnakov +Kyanite +Langbein +Lawsonite +Lazulite +Lazurite +Legrandite +Lepidolite +Leucite +Leucophan +Linarite +Lizardite +Londonite +Ludlamite +Ludwigite +Malachite +Maria-meionite +Werner +Marcasite +Meliphanite +Mellite +Mesolite +Milar +Millerite +Mime +Monazite +Mordenite +Mottram +Muscovite +Fuchsite +Nambul +Natrolite +Nepheline +Neptunite +Nickeline +Niccolite +Nosean +Nuumm +Olivine +Opal +Fire opal +Moss opal +Painite +Papagoite +Pargas +Parisite +Pectol +Larimar +Pentland +Peridot +Periclase +Perthite +Petal +Castor +Pezzottaite +Phena +Phosgen +Phospho +Piemontite +Realgar +Rhodizite +Rhodochros +Rhodon +Richter +Riebeck +Crocidolite +Rosasite +Rutile +Samarskite +Sanidine +Sapphirine +Sarcol +Scapol +Marialite +Meionite +Scheel +Schizol +Scorod +Selenite +Sella +Senarmon +Sepio +Meerschaum +Sérandite +Seraph +Serendibite +Serpentine +Bowen +Stich +Shattuck +Shiga +Shortite +Shung +Siderite +Silliman +Simpsonite +Sinhal +Smalt +Smithsonite +Sodalite +Hackman +Sogdian +Sperry +Spessar +Sphaler +Spinel +Ceylon +Spodumene +Triphane +Spurrite +Stauro +Strontian +Titanate +Sulfur +Bustamite +Sylvite +Taaffeita +Talc +Tantalite +Tektites +Tephroite +Thomsonite +Thaumasite +Topaz +Tourmaline +Achroite +Chrome +Dravite +Elbaite +Indicol +Olenite +Paraiba +Rossman +Rubellite +Tremol +Triphyl +Triplite +Tugtup +Turquoise +Ulex +Ussing +Vanadinite +Variscite +Vesuvianite +Californite +Villiaum +Vivianite +Vlasov +Wardite +Wavell +Welogan +Whewell +Wilkeite +Willemite +Wither +Wollastone +Wulfenite +Wurtzite +Xonot +Yugawara +Zektzer +Zeolites +Analcime +Chabaz +Steller +Stilbite +Zinc +Zinnwald +Zircon +Jacinth +Zoisite +Tanzan +Thulite +Zultan +Zany +Lapis lazuli +Desert glass +Llanite +Maw sit-sit +Obsidian +Tears +Pallas +Peridot +Soapstone +Tact +Unakite +Bauxite +Concretions +Bloodstone +Heliotrope +Eilat stone +Epidos +Glimmer +Goldstone +Hawks eye +Iddings +Lampro From b4a804ca0cc70c8bbb541a58b4a87d1d98bac463 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 5 Jun 2023 17:42:35 -0700 Subject: [PATCH 0034/4620] bump to 50.08-r3 --- CMakeLists.txt | 2 +- docs/changelog.txt | 6 +++++- library/xml | 2 +- scripts | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ea16ce29f..1abc91861b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,7 +192,7 @@ endif() # set up versioning. set(DF_VERSION "50.08") -set(DFHACK_RELEASE "r2") +set(DFHACK_RELEASE "r3") set(DFHACK_PRERELEASE FALSE) set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") diff --git a/docs/changelog.txt b/docs/changelog.txt index c36597047b..fbc74bad80 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,7 +36,6 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes -- Fix crash for some players when they launch DF outside of the Steam client ## Misc Improvements @@ -50,6 +49,11 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Removed +# 50.08-r3 + +## Fixes +- Fix crash for some players when they launch DF outside of the Steam client + # 50.08-r2 ## New Plugins diff --git a/library/xml b/library/xml index 51fe3ca11f..413f1c0371 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 51fe3ca11f9587bc50ed09b768022cd9688250d8 +Subproject commit 413f1c0371094a7933db0cd524ff9fad64fb0fe3 diff --git a/scripts b/scripts index 315c7afc20..c356aebcde 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 315c7afc20651ac0fe1700d720f71796190f198e +Subproject commit c356aebcde32199fa7c1d32b65ed5c96d008c1f9 From c5e68f42944df6ba0ddcec97c68fc904c28c42c8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 01:10:44 +0000 Subject: [PATCH 0035/4620] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/python-jsonschema/check-jsonschema: 0.22.0 → 0.23.1](https://github.com/python-jsonschema/check-jsonschema/compare/0.22.0...0.23.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c305de56c7..efa59812dc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: args: ['--fix=lf'] - id: trailing-whitespace - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.22.0 + rev: 0.23.1 hooks: - id: check-github-workflows - repo: https://github.com/Lucas-C/pre-commit-hooks From 9c19b229b4628ab5e65d8ac718310195d3335fba Mon Sep 17 00:00:00 2001 From: UnFaventia <135673143+UnFaventia@users.noreply.github.com> Date: Tue, 6 Jun 2023 11:17:18 +1000 Subject: [PATCH 0036/4620] Update autonick.txt Fixed white spaces & name doubles --- data/dfhack-config/autonick.txt | 459 +++++++++++++++----------------- 1 file changed, 213 insertions(+), 246 deletions(-) diff --git a/data/dfhack-config/autonick.txt b/data/dfhack-config/autonick.txt index 2c11208886..4e24fd61e6 100644 --- a/data/dfhack-config/autonick.txt +++ b/data/dfhack-config/autonick.txt @@ -66,314 +66,298 @@ Jade Umber Silver Bistre -Black +Black Black bean Noir Charcoal -Ebony +Ebony Eerie Jet Licorice Midnight -Night -Onyx -Space -Raisin +Night +Onyx +Space +Raisin Rich Russ violet Smoky -Taupe Aero -Alice -Argent Lue -Azure -Azul -Baby blue -Berkeley +Alice +Argent Lue +Azure +Azul +Baby blue +Berkeley Bice -Bleu -Bondi +Bleu +Bondi Brandeis Byzant -Cambridge -Carolina -Celestial -Celtic +Cambridge +Carolina +Celestial +Celtic Cerulean -Chefchaouen -Chrysler -Cobalt -Columbia -Cornflower -Sky -Delft -Denim -Dodger +Chefchaouen +Chrysler +Cobalt +Columbia +Cornflower +Sky +Delft +Denim +Dodger Duke Federal Glaucous Electrindigo Eclipse -Ice -Illini -Klein -Jordy +Illini +Klein +Jordy Lapis Lazuli Majorelle -Marian -Maya -Slate +Marian +Maya +Slate Munsell -Navy +Navy Neon blue Oxford -Palatinate -Penn +Palatinate +Penn Periwinkle -Phthalo -Picton +Phthalo +Picton Poly Powder Prussia -Royal -Ruddy -Sapphire -Honolulu -Savoy +Royal +Ruddy +Honolulu +Savoy Silver Lake Space cadet -Steel -Tang -Tufts +Steel +Tang +Tufts Ultramarine Uranian -Vista -Yale +Vista +Yale Zaffre Auburn Almond Beaver Beige -Bole -Bone +Bole +Bone Bronze -Buff -Burgundy -Sienna -Umber -Camel -Caput mortuum -Caramel +Burgundy +Sienna +Umber +Camel +Caput mortuum +Caramel Chamoisee -Chestnut -Chocolate -Citron -Cocoa -Coffee -Copper -Cordovan -Coyote -Desert +Chestnut +Chocolate +Citron +Cocoa +Coffee +Copper +Coyote +Desert Drab -Dun -Earth -Ecru -Fallow -Fawn -Field +Dun +Earth +Fallow +Fawn +Field Fulvous Goldenrod Harvest -Khaki -Kobicha -Lion -Liver -Mahogany -Maroon -Ochre +Khaki +Kobicha +Lion +Liver +Mahogany +Maroon +Ochre Redwood -Rufous -Russet -Rust -Sand -Satin -Sheen -Seal -Sepia +Rufous +Russet +Rust +Sand +Satin +Sheen +Seal +Sepia Sinopia -Tan -Taupe -Tawny -Titian +Tan +Taupe +Tawny +Titian Van Dyke -Walnut -Wenge -Wheat -Aqua -Aquamarine -Capri +Walnut +Wenge +Aqua +Aquamarine +Capri Caribbean -Celeste +Celeste Cyprus -Fluorescent -Jungle +Fluorescent +Jungle Keppel -Ice +Ice Sea -Moonstone -Myrtle +Myrtle Pacific -Pine -Robin +Pine +Robin Skobeloff -Teal -Turquoise -Verdigris -Vivid +Teal +Turquoise +Verdigris +Vivid Zomp Platinum Timberwolf -Ash -Rose quartz +Ash +Rose quartz Cinereous -Cadet +Cadet Cool Davys Paynes -Glaucous -Gunmetal +Glaucous +Gunmetal Feldgrau -Apple -Asparagus -Avocado -Brunswick -Cal Poly -Castleton +Apple +Asparagus +Avocado +Brunswick +Cal Poly +Castleton Celadon -Chartreuse -Moss -Pastel -Dartmouth +Chartreuse +Moss +Pastel +Dartmouth Emerald -Erin +Erin Fern Forest -Harlequin +Harlequin Honeydew Hunter -Jade -Kelly green -Lawn -Lime +Kelly green +Lawn +Lime Malachite Mantis Mindaro -Neon +Neon Olivine -Paris +Paris Pear -Pigment -Pine +Pigment Pistachio Reseda -Rifle +Rifle Sage Screamin' Shamrock Bud Amaranth -Baker-Miller +Baker-Miller Cerise -Crimson Carmine Magenta Eggplant -Fandango -Finn +Fandango +Finn Fuchsia -Haze -Mulberry -Orchid -Plum +Haze +Orchid +Plum Pizzazz Quinacridone -Raspberry -Razzle dazzle +Razzle dazzle Rose -Shocking +Shocking Telemagenta Aerospace -Alloy -Amber +Alloy +Amber Apricot -Atomic +Atomic Tangerine -Burnt +Burnt Butterscotch -Carrot +Carrot Champagne -Chrome -Coral -Flame -Gold -Hunyadi +Chrome +Coral +Flame +Gold +Hunyadi Melon Peel Papaya -Peach -Persimmon +Peach +Persimmon Princeton Pumpkin Rust Safety orange Saffron Tangelo -Tigers Eye +Tigers Eye Titian Xanthous -Blush +Blush Brilliant -Brink -Carnation -Cherry +Brink +Carnation +Cherry Cordovan Cyclamen Dogwood -Folly -Heliotrope -Hollywood -Hot +Heliotrope +Hollywood +Hot Lavender Mimi Misty -Mountbatten -Orchid -Phlox +Mountbatten +Orchid +Phlox Pompadour -Puce +Puce Raspberry Razzmatazz Bonbon Quartz -Taupe -Vale +Taupe +Vale Rosewood Rosy Salmon -Seashell -Tea +Tea Tickle Thulian Ultra Burgundy Byzantium -Caput mortuum Eminence -Grape +Grape Iris Mardi Gras -Mauve -Mauveine -Mulberry +Mauve +Mauveine +Mulberry Murrey Palatinate Pale @@ -383,16 +367,15 @@ Purpureus Tekhelet Thistle Tropical -Tyrian +Tyrian Wisteria Barn -Bittersweet +Bittersweet Shimmer Blood -Candy apple +Candy apple Cantaloupe Cardinal -Carmine Chili Cosmos Cinnabar @@ -402,65 +385,61 @@ Cordovan Cornell Crimson Falu -Brick +Brick Engine -Folly -Garnet +Folly Imperial -Jasper +Jaspar Penn Poppy -Redwood -Rojo -Rust -Rusty +Rojo +Rusty Scarlet -Syracuse +Syracuse Tomato -Turkey -Vermilion +Turkey +Vermilion Wine Alabaster -Antique +Antique Cornsilk -Latte +Latte Cream Eggshell -Flax +Flax Floral Ghost Isabelline Ivory -Lemon +Lemon chiffon -Linen -Navajo +Linen +Navajo Nyanza Lace Parchment -Pearl +Pearl Seasalt Seashell Vanilla Smoke -Amber -Apricot -Arylide +Apricot +Arylide Aureolin -Buff +Buff Canary Citron -Ecru +Ecru Gamboge Icterine Jonquil -Maize -Mikado -Mindaro +Maize +Mikado +Mindaro Mustard Selective -Stil de grain -Straw +Stil de grain +Straw Sunglow Sunset Wheat @@ -475,22 +454,22 @@ Europa # charites Damia -Auxesia -Cleta -Phaenna -Hegemone -Peitho -Paregoros -Pasithea -Charis -Kale -Antheia -Eudaimonia -Euthymia -Eutychia -Paidia -Pandaisia -Pannychis +Auxesia +Cleta +Phaenna +Hegemone +Peitho +Paregoros +Pasithea +Charis +Kale +Antheia +Eudaimonia +Euthymia +Eutychia +Paidia +Pandaisia +Pannychis Aglaea Euphrosyne Thalia @@ -619,7 +598,6 @@ Analcime Anatase Andalusite Chiastolite -Andesine Anglesite Anhydrite Annabergite @@ -677,7 +655,6 @@ Cavans Celestite Ceruleite Cerussite -Chabaz Chalcopyr Chambers Charlesite @@ -689,7 +666,6 @@ Alexandrite Cymophane Chromite Chrysocolla -Cinnabar Clinochlore Clinohumite Clintonite @@ -719,8 +695,6 @@ Dioptase Dolomite Dumortier Ekanite -Elbaite -Emerald Trapiche Enstatite Bronzite @@ -745,11 +719,10 @@ Moonstone Adularia Rainbow Ortho -Unakite +Kite Plagioclase Labradorite Oligoclase -Sanidine Sunstone Oregon Sunstone Rainbow Lattice @@ -766,7 +739,6 @@ Gahnospinel Garnet Pyralspite Almandine -Pyrope Spessartine Ugrand Demantoid @@ -780,7 +752,6 @@ Pyrope Rhodolite Mali garnet Malaia -Spessar Umbal Gaspe Gayluss @@ -832,7 +803,6 @@ Lizardite Londonite Ludlamite Ludwigite -Malachite Maria-meionite Werner Marcasite @@ -851,11 +821,10 @@ Nambul Natrolite Nepheline Neptunite -Nickeline +Nickeline Niccolite Nosean Nuumm -Olivine Opal Fire opal Moss opal @@ -866,10 +835,9 @@ Parisite Pectol Larimar Pentland -Peridot Periclase Perthite -Petal +Petal Castor Pezzottaite Phena @@ -898,7 +866,7 @@ Scorod Selenite Sella Senarmon -Sepio +Sepio Meerschaum Sérandite Seraph @@ -979,7 +947,6 @@ Xonot Yugawara Zektzer Zeolites -Analcime Chabaz Steller Stilbite From 0f224e60da2123ce45c37d4980f2e17f485a782b Mon Sep 17 00:00:00 2001 From: UnFaventia <135673143+UnFaventia@users.noreply.github.com> Date: Tue, 6 Jun 2023 11:21:44 +1000 Subject: [PATCH 0037/4620] Update changelog.txt --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index c36597047b..ebefbdd4e2 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -82,6 +82,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `gui/autodump`: fort-mode keybinding: Ctrl-H (when ``armok`` tools are enabled in `gui/control-panel`) - Window behavior: if you have multiple DFHack tool windows open, scrolling the mouse wheel while over an unfocused window will focus it and raise it to the top - `stockpiles`: allow filtering creatures by tameability +- Autonick: additional nicknames based on borrowwing animals, colours, gems and minerals added ## Internals - ``dfhack.internal``: added memory analysis functions: ``msizeAddress``, ``getHeapState``, ``heapTakeSnapshot``, ``isAddressInHeap``, ``isAddressActiveInHeap``, ``isAddressUsedAfterFreeInHeap``, ``getAddressSizeInHeap``, and ``getRootAddressOfHeapObject`` From d9dab857c6756197e67523a5e746f2fc7b4092ee Mon Sep 17 00:00:00 2001 From: UnFaventia <135673143+UnFaventia@users.noreply.github.com> Date: Tue, 6 Jun 2023 12:09:53 +1000 Subject: [PATCH 0038/4620] Update autonick.txt --- data/dfhack-config/autonick.txt | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/data/dfhack-config/autonick.txt b/data/dfhack-config/autonick.txt index 4e24fd61e6..12fbe65e6b 100644 --- a/data/dfhack-config/autonick.txt +++ b/data/dfhack-config/autonick.txt @@ -63,7 +63,6 @@ Blue Shadow Indigo Jade -Umber Silver Bistre Black @@ -103,13 +102,11 @@ Chrysler Cobalt Columbia Cornflower -Sky Delft Denim Dodger Duke Federal -Glaucous Electrindigo Eclipse Illini @@ -153,7 +150,6 @@ Beige Bole Bone Bronze -Burgundy Sienna Umber Camel @@ -195,9 +191,7 @@ Seal Sepia Sinopia Tan -Taupe Tawny -Titian Van Dyke Walnut Wenge @@ -214,17 +208,14 @@ Ice Sea Myrtle Pacific -Pine Robin Skobeloff Teal -Turquoise Verdigris Vivid Zomp Platinum Timberwolf -Ash Rose quartz Cinereous Cadet @@ -234,7 +225,6 @@ Paynes Glaucous Gunmetal Feldgrau -Apple Asparagus Avocado Brunswick @@ -246,7 +236,6 @@ Moss Pastel Dartmouth Emerald -Erin Fern Forest Harlequin @@ -254,10 +243,8 @@ Honeydew Hunter Kelly green Lawn -Lime Malachite Mantis -Mindaro Neon Olivine Paris @@ -280,7 +267,6 @@ Fandango Finn Fuchsia Haze -Orchid Plum Pizzazz Quinacridone @@ -291,14 +277,12 @@ Telemagenta Aerospace Alloy Amber -Apricot Atomic Tangerine Burnt Butterscotch Carrot Champagne -Chrome Coral Flame Gold @@ -310,7 +294,6 @@ Peach Persimmon Princeton Pumpkin -Rust Safety orange Saffron Tangelo @@ -322,10 +305,8 @@ Brilliant Brink Carnation Cherry -Cordovan Cyclamen Dogwood -Heliotrope Hollywood Hot Lavender @@ -359,7 +340,6 @@ Mauve Mauveine Mulberry Murrey -Palatinate Pale Pomp Power @@ -390,7 +370,6 @@ Engine Folly Imperial Jaspar -Penn Poppy Rojo Rusty @@ -428,7 +407,6 @@ Arylide Aureolin Buff Canary -Citron Ecru Gamboge Icterine @@ -622,9 +600,7 @@ Bast Bayldonite Benitoite Beryl -Aquamarine Maxixe -Emerald Goshenite Golden beryl Heliodor @@ -634,7 +610,6 @@ Beryllonite Beudantite Bismutot Biotit -Bole Boracite Bornite Brazilianite @@ -780,7 +755,6 @@ Humite Hurlbut Ilmenite Inderite -Jade Jadeite Jasper Jeremejevite From 2de77d3f57615d50c205ee99b72bf602626f8088 Mon Sep 17 00:00:00 2001 From: UnFaventia <135673143+UnFaventia@users.noreply.github.com> Date: Tue, 6 Jun 2023 12:11:10 +1000 Subject: [PATCH 0039/4620] Update changelog.txt --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index ebefbdd4e2..c724c92351 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -39,6 +39,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - Fix crash for some players when they launch DF outside of the Steam client ## Misc Improvements +- `Autonick`: additional nicknames based on burrowing animals, colours, gems and minerals added ## Documentation @@ -82,7 +83,6 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `gui/autodump`: fort-mode keybinding: Ctrl-H (when ``armok`` tools are enabled in `gui/control-panel`) - Window behavior: if you have multiple DFHack tool windows open, scrolling the mouse wheel while over an unfocused window will focus it and raise it to the top - `stockpiles`: allow filtering creatures by tameability -- Autonick: additional nicknames based on borrowwing animals, colours, gems and minerals added ## Internals - ``dfhack.internal``: added memory analysis functions: ``msizeAddress``, ``getHeapState``, ``heapTakeSnapshot``, ``isAddressInHeap``, ``isAddressActiveInHeap``, ``isAddressUsedAfterFreeInHeap``, ``getAddressSizeInHeap``, and ``getRootAddressOfHeapObject`` From e50fe7eb995832ff44097e615c2432dd304b04af Mon Sep 17 00:00:00 2001 From: UnFaventia <135673143+UnFaventia@users.noreply.github.com> Date: Tue, 6 Jun 2023 12:17:53 +1000 Subject: [PATCH 0040/4620] Update changelog.txt --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 580bdc2bd0..8ee4abf2c3 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -38,7 +38,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Fixes ## Misc Improvements -- `Autonick`: additional nicknames based on burrowing animals, colours, gems and minerals added +- `autonick`: additional nicknames based on burrowing animals, colours, gems and minerals added ## Documentation From efc4f277d93b323334a3015b758b16a058612be6 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 6 Jun 2023 08:06:56 -0700 Subject: [PATCH 0041/4620] clear item occupancy flags for channeled tiles --- docs/changelog.txt | 1 + plugins/dig-now.cpp | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 8ee4abf2c3..b010f55b55 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,6 +36,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes +- `dig-now`: clear item occupancy flags for channeled tiles that had items on them ## Misc Improvements - `autonick`: additional nicknames based on burrowing animals, colours, gems and minerals added diff --git a/plugins/dig-now.cpp b/plugins/dig-now.cpp index b2af2dbcaa..94d8c761f7 100644 --- a/plugins/dig-now.cpp +++ b/plugins/dig-now.cpp @@ -968,10 +968,20 @@ static void post_process_dug_tiles(color_ostream &out, } if (to.bits.item) { - for (auto item : world->items.other.IN_PLAY) { - if (item->pos == pos && item->flags.bits.on_ground) - item->moveToGround( - resting_pos.x, resting_pos.y, resting_pos.z); + std::vector items; + if (auto b = Maps::ensureTileBlock(pos)) { + for (auto item_id : b->items) { + auto item = df::item::find(item_id); + if (item && item->pos == pos) + items.emplace_back(item); + } + } + if (!items.empty()) { + // fresh MapCache since tile properties are being actively changed + MapExtras::MapCache mc; + for (auto item : items) + Items::moveToGround(mc, item, resting_pos); + mc.WriteAll(); } } } From abc1a6a56965794acff928c223d3ad7ef84fafab Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 23 May 2023 17:03:36 -0700 Subject: [PATCH 0042/4620] clean up some cmake --- CMakeLists.txt | 127 +++++++++++++++++++------------------------------ 1 file changed, 48 insertions(+), 79 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1abc91861b..56cfa0b95f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,21 +1,19 @@ # main project file. use it from a build sub-folder, see COMPILE for details ## some generic CMake magic -cmake_minimum_required(VERSION 3.6 FATAL_ERROR) +cmake_minimum_required(VERSION 3.18 FATAL_ERROR) cmake_policy(SET CMP0048 NEW) +cmake_policy(SET CMP0074 NEW) project(dfhack) -if("${CMAKE_GENERATOR}" STREQUAL Ninja) - if("${CMAKE_VERSION}" VERSION_LESS 3.9) - message(WARNING "You are using an old version of CMake (${CMAKE_VERSION}) with Ninja. This may result in ninja errors - see docs/Compile.rst for more details. Upgrading your CMake version is recommended.") - endif() -endif() +# set up versioning. +set(DF_VERSION "50.08") +set(DFHACK_RELEASE "r2rc1") +set(DFHACK_PRERELEASE TRUE) -if(NOT("${CMAKE_VERSION}" VERSION_LESS 3.12)) - # make ZLIB_ROOT work in CMake >= 3.12 - # https://cmake.org/cmake/help/git-stage/policy/CMP0074.html - cmake_policy(SET CMP0074 NEW) -endif() +set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") +set(DFHACK_ABI_VERSION 1) +set(DFHACK_BUILD_ID "" CACHE STRING "Build ID (should be specified on command line)") # Set up build types if(CMAKE_CONFIGURATION_TYPES) @@ -123,7 +121,7 @@ elseif("${DFHACK_BUILD_ARCH}" STREQUAL "64") set(DFHACK_SETARCH "x86_64") add_definitions(-DDFHACK64) else() - message(SEND_ERROR "Invalid build architecture (should be 32/64): ${DFHACK_BUILD_ARCH}") + message(SEND_ERROR "Invalid build architecture (should be 32 or 64): ${DFHACK_BUILD_ARCH}") endif() if(CMAKE_CROSSCOMPILING) @@ -182,30 +180,24 @@ endif() if(NOT EXISTS ${dfhack_SOURCE_DIR}/library/xml/codegen.pl OR NOT EXISTS ${dfhack_SOURCE_DIR}/scripts/CMakeLists.txt OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/clsocket/CMakeLists.txt + OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/jsoncpp-sub/CMakeLists.txt OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/libexpat/expat/CMakeLists.txt OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/libzip/CMakeLists.txt OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/xlsxio/CMakeLists.txt + OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/googletest/CMakeLists.txt OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/luacov/src ) - message(SEND_ERROR "One or more required submodules could not be found! Run 'git submodule update --init' from the root DFHack directory. (See the section 'Getting the Code' in docs/Compile.rst)") + message(SEND_ERROR "One or more required submodules could not be found! Run 'git submodule update --init' from the root DFHack directory. (See the section 'Getting the Code' in docs/dev/compile/Compile.rst)") endif() -# set up versioning. -set(DF_VERSION "50.08") -set(DFHACK_RELEASE "r3") -set(DFHACK_PRERELEASE FALSE) - -set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}") - -set(DFHACK_ABI_VERSION 1) - -set(DFHACK_BUILD_ID "" CACHE STRING "Build ID (should be specified on command line)") +# dfhack data goes here: +set(DFHACK_DATA_DESTINATION hack) ## where to install things (after the build is done, classic 'make install' or package structure) # the dfhack libraries will be installed here: if(UNIX) # put the lib into DF/hack - set(DFHACK_LIBRARY_DESTINATION hack) + set(DFHACK_LIBRARY_DESTINATION ${DFHACK_DATA_DESTINATION}) else() # windows is crap, therefore we can't do nice things with it. leave the libs on a nasty pile... set(DFHACK_LIBRARY_DESTINATION .) @@ -213,31 +205,26 @@ endif() # external tools will be installed here: set(DFHACK_BINARY_DESTINATION .) -# dfhack data goes here: -set(DFHACK_DATA_DESTINATION hack) # plugin libs go here: -set(DFHACK_PLUGIN_DESTINATION hack/plugins) -# dfhack header files go here: -set(DFHACK_INCLUDES_DESTINATION hack/include) +set(DFHACK_PLUGIN_DESTINATION ${DFHACK_DATA_DESTINATION}/plugins) # dfhack lua files go here: -set(DFHACK_LUA_DESTINATION hack/lua) +set(DFHACK_LUA_DESTINATION ${DFHACK_DATA_DESTINATION}/lua) # the windows .lib file goes here: -set(DFHACK_DEVLIB_DESTINATION hack) +set(DFHACK_DEVLIB_DESTINATION ${DFHACK_DATA_DESTINATION}) # user documentation goes here: -set(DFHACK_USERDOC_DESTINATION hack) +set(DFHACK_USERDOC_DESTINATION ${DFHACK_DATA_DESTINATION}) # developer documentation goes here: -set(DFHACK_DEVDOC_DESTINATION hack) +set(DFHACK_DEVDOC_DESTINATION ${DFHACK_DATA_DESTINATION}) # some options for the user/developer to play with -option(BUILD_LIBRARY "Build the library that goes into DF." ON) -option(BUILD_PLUGINS "Build the plugins." ON) +option(BUILD_LIBRARY "Build the DFHack library." ON) +option(BUILD_PLUGINS "Build the DFHack plugins." ON) set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) if(UNIX) ## flags for GCC # default to hidden symbols - # build 32bit # ensure compatibility with older CPUs # enable C++11 features add_definitions(-DLINUX_BUILD) @@ -254,7 +241,7 @@ if(UNIX) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -march=i686") endif() string(REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") - set(CMAKE_INSTALL_RPATH "hack") + set(CMAKE_INSTALL_RPATH ${DFHACK_LIBRARY_DESTINATION}) elseif(MSVC) # for msvc, tell it to always use 8-byte pointers to member functions to avoid confusion set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /vmg /vmm /MP") @@ -276,30 +263,37 @@ elseif(WIN32) add_definitions(-DWIN32) endif() -#### download depends #### +#### dependencies #### + +# fix for pyenv: default to `python3` before `python3.x` +set(Python_FIND_UNVERSIONED_NAMES FIRST) include(CMake/DownloadFile.cmake) if(WIN32) - # Download zlib on Windows - set(ZLIB_DOWNLOAD_DIR ${dfhack_SOURCE_DIR}/depends/zlib/lib/win${DFHACK_BUILD_ARCH}) - if(${DFHACK_BUILD_ARCH} STREQUAL "64") - download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win64-zlib.lib" - ${ZLIB_DOWNLOAD_DIR}/zlib.lib - "a3b2fc6b68efafa89b0882e354fc8418") - else() - download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win32-zlib.lib" - ${ZLIB_DOWNLOAD_DIR}/zlib.lib - "f4ebaa21d9de28566e88b1edfcdff901") + set(ZLIB_FILE win64-zlib.lib) + set(ZLIB_PATH ${CMAKE_BINARY_DIR}/depends/zlib/) + set(ZLIB_MD5 a3b2fc6b68efafa89b0882e354fc8418) + file(COPY ${dfhack_SOURCE_DIR}/depends/zlib/ DESTINATION ${ZLIB_PATH}) + download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/${ZLIB_FILE}" + ${ZLIB_PATH}${ZLIB_FILE} + ${ZLIB_MD5}) + set(ZLIB_ROOT ${ZLIB_PATH}) +else() + # Rescan for pthread and zlib if the build arch changed + if(NOT "${DFHACK_BUILD_ARCH}" STREQUAL "${DFHACK_BUILD_ARCH_PREV}") + unset(ZLIB_LIBRARY CACHE) + unset(CMAKE_HAVE_PTHREAD_H CACHE) endif() - # Move zlib to the build folder so possible 32 and 64-bit builds - # in the same source tree don't conflict - file(COPY ${dfhack_SOURCE_DIR}/depends/zlib - DESTINATION ${CMAKE_BINARY_DIR}/depends/) - file(COPY ${ZLIB_DOWNLOAD_DIR}/zlib.lib - DESTINATION ${CMAKE_BINARY_DIR}/depends/zlib/lib/) + if(NOT APPLE AND DFHACK_BUILD_32) + set(ZLIB_ROOT /usr/lib/i386-linux-gnu) + endif() +endif() +find_package(ZLIB REQUIRED) +include_directories(${ZLIB_INCLUDE_DIRS}) +if(WIN32) # Do the same for SDL.dll # (DFHack doesn't require this at build time, so no need to move it to the build folder) # TODO: remove SDL.dll from our distribution once DF moves to SDL2. we only @@ -315,7 +309,6 @@ if(WIN32) ${SDL_DOWNLOAD_DIR}/SDL.dll "5a09604daca6b2b5ce049d79af935d6a") endif() - endif() if(APPLE) @@ -376,29 +369,6 @@ endif() #### expose depends #### -# fix for pyenv: default to `python3` before `python3.x` -set(Python_FIND_UNVERSIONED_NAMES FIRST) - -if(UNIX) - # Rescan for pthread and zlib if the build arch changed - if(NOT "${DFHACK_BUILD_ARCH}" STREQUAL "${DFHACK_BUILD_ARCH_PREV}") - unset(ZLIB_LIBRARY CACHE) - unset(CMAKE_HAVE_PTHREAD_H CACHE) - endif() -endif() - -# find and make available libz -if(NOT UNIX) # Windows - # zlib is in here so 32-bit and 64-bit builds in the same source tree are possible - set(ZLIB_ROOT ${CMAKE_BINARY_DIR}/depends/zlib/) -else() - if(NOT APPLE AND DFHACK_BUILD_32) - # 32-bit Linux - set(ZLIB_ROOT /usr/lib/i386-linux-gnu) - endif() -endif() - -find_package(ZLIB REQUIRED) include_directories(depends/protobuf) include_directories(depends/lua/include) include_directories(depends/md5) @@ -420,7 +390,6 @@ endif() include_directories(depends/lodepng) include_directories(depends/tthread) -include_directories(${ZLIB_INCLUDE_DIRS}) include_directories(depends/clsocket/src) include_directories(depends/xlsxio/include) add_subdirectory(depends) From aa3ca94de45328fb52fd00d2cc4d698e540c37cc Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 23 May 2023 17:15:47 -0700 Subject: [PATCH 0043/4620] fix paths --- CMakeLists.txt | 6 +++--- depends/zlib/lib/win32/.gitignore | 1 - depends/zlib/lib/win64/.gitignore | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) delete mode 100644 depends/zlib/lib/win32/.gitignore delete mode 100644 depends/zlib/lib/win64/.gitignore diff --git a/CMakeLists.txt b/CMakeLists.txt index 56cfa0b95f..50ac8f1837 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -271,12 +271,12 @@ set(Python_FIND_UNVERSIONED_NAMES FIRST) include(CMake/DownloadFile.cmake) if(WIN32) - set(ZLIB_FILE win64-zlib.lib) + set(ZLIB_FILE zlib.lib) set(ZLIB_PATH ${CMAKE_BINARY_DIR}/depends/zlib/) set(ZLIB_MD5 a3b2fc6b68efafa89b0882e354fc8418) file(COPY ${dfhack_SOURCE_DIR}/depends/zlib/ DESTINATION ${ZLIB_PATH}) - download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/${ZLIB_FILE}" - ${ZLIB_PATH}${ZLIB_FILE} + download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win64-${ZLIB_FILE}" + ${ZLIB_PATH}lib/${ZLIB_FILE} ${ZLIB_MD5}) set(ZLIB_ROOT ${ZLIB_PATH}) else() diff --git a/depends/zlib/lib/win32/.gitignore b/depends/zlib/lib/win32/.gitignore deleted file mode 100644 index 683bf139fb..0000000000 --- a/depends/zlib/lib/win32/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.lib diff --git a/depends/zlib/lib/win64/.gitignore b/depends/zlib/lib/win64/.gitignore deleted file mode 100644 index 683bf139fb..0000000000 --- a/depends/zlib/lib/win64/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.lib From 9aecedb9e2ac5c90faab8a3623f3b25f224dce21 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 24 May 2023 03:04:33 -0700 Subject: [PATCH 0044/4620] move zlib download back to src dir --- CMakeLists.txt | 5 ++--- depends/zlib/lib/win64/.gitignore | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 depends/zlib/lib/win64/.gitignore diff --git a/CMakeLists.txt b/CMakeLists.txt index 50ac8f1837..dfc8efb4ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -272,11 +272,10 @@ include(CMake/DownloadFile.cmake) if(WIN32) set(ZLIB_FILE zlib.lib) - set(ZLIB_PATH ${CMAKE_BINARY_DIR}/depends/zlib/) + set(ZLIB_PATH ${dfhack_SOURCE_DIR}/depends/zlib/) set(ZLIB_MD5 a3b2fc6b68efafa89b0882e354fc8418) - file(COPY ${dfhack_SOURCE_DIR}/depends/zlib/ DESTINATION ${ZLIB_PATH}) download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win64-${ZLIB_FILE}" - ${ZLIB_PATH}lib/${ZLIB_FILE} + ${ZLIB_PATH}lib/win64/${ZLIB_FILE} ${ZLIB_MD5}) set(ZLIB_ROOT ${ZLIB_PATH}) else() diff --git a/depends/zlib/lib/win64/.gitignore b/depends/zlib/lib/win64/.gitignore new file mode 100644 index 0000000000..683bf139fb --- /dev/null +++ b/depends/zlib/lib/win64/.gitignore @@ -0,0 +1 @@ +*.lib From 394db656e6877d8c389b1f77acc8512b8236a2ed Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 24 May 2023 03:04:43 -0700 Subject: [PATCH 0045/4620] remove obsolete BUILD_DEVEL option and logic --- library/CMakeLists.txt | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 371d3cd148..8681c9c90d 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -5,7 +5,6 @@ cmake_minimum_required(VERSION 3.21) cmake_policy(SET CMP0022 NEW) # build options -option(BUILD_DEVEL "Install/package files required for development(For SDK)." OFF) if(UNIX) option(CONSOLE_NO_CATCH "Make the console not catch 'CTRL+C' events for easier debugging." OFF) endif() @@ -459,17 +458,4 @@ install(DIRECTORY ${dfhack_SOURCE_DIR}/patches DESTINATION ${DFHACK_DATA_DESTINATION} FILES_MATCHING PATTERN "*.dif") -# Unused for so long that it's not even relevant now... -if(BUILD_DEVEL) - if(WIN32) - install(TARGETS dfhack - ARCHIVE DESTINATION ${DFHACK_DEVLIB_DESTINATION}) - endif() - # note the ending '/'. This means *contents* of the directory are installed - # without the '/', the directory itself is installed - install(DIRECTORY include/ - DESTINATION ${DFHACK_INCLUDES_DESTINATION} - FILES_MATCHING PATTERN "*.h" PATTERN "*.inc" ) -endif() - add_subdirectory(xml) From 73f8186ab7561e20f837c999fad67b5ea0423cd6 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 24 May 2023 12:15:52 -0700 Subject: [PATCH 0046/4620] use standard ROOT path structure --- CMakeLists.txt | 2 +- depends/zlib/lib/{win64 => }/.gitignore | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename depends/zlib/lib/{win64 => }/.gitignore (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index dfc8efb4ea..0b4c6027f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -275,7 +275,7 @@ if(WIN32) set(ZLIB_PATH ${dfhack_SOURCE_DIR}/depends/zlib/) set(ZLIB_MD5 a3b2fc6b68efafa89b0882e354fc8418) download_file("https://github.com/DFHack/dfhack-bin/releases/download/0.44.09/win64-${ZLIB_FILE}" - ${ZLIB_PATH}lib/win64/${ZLIB_FILE} + ${ZLIB_PATH}lib/${ZLIB_FILE} ${ZLIB_MD5}) set(ZLIB_ROOT ${ZLIB_PATH}) else() diff --git a/depends/zlib/lib/win64/.gitignore b/depends/zlib/lib/.gitignore similarity index 100% rename from depends/zlib/lib/win64/.gitignore rename to depends/zlib/lib/.gitignore From 130b42d041270ed4917c81ca3832f342bef54e6d Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Wed, 7 Jun 2023 07:13:20 +0000 Subject: [PATCH 0047/4620] Auto-update submodules scripts: master --- scripts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts b/scripts index c356aebcde..0119ab1b6d 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit c356aebcde32199fa7c1d32b65ed5c96d008c1f9 +Subproject commit 0119ab1b6d540e192c77f114c5ea7f7aeab9b39a From 05db72c7b39d0fa45265e705bebaf8f6fc4d968d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 2 Jun 2023 13:15:21 -0700 Subject: [PATCH 0048/4620] add organic stockpile preset --- data/stockpiles/organic.dfstock | Bin 0 -> 9 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/stockpiles/organic.dfstock diff --git a/data/stockpiles/organic.dfstock b/data/stockpiles/organic.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..70f0496ca3b21fb297da244a8ac729b839d0fe58 GIT binary patch literal 9 QcmbQh$T)+MVFx1v01D>; Date: Mon, 5 Jun 2023 04:17:13 -0700 Subject: [PATCH 0049/4620] add barrels stockpile preset --- data/stockpiles/barrels.dfstock | 2 ++ docs/plugins/stockpiles.rst | 1 + 2 files changed, 3 insertions(+) create mode 100644 data/stockpiles/barrels.dfstock diff --git a/data/stockpiles/barrels.dfstock b/data/stockpiles/barrels.dfstock new file mode 100644 index 0000000000..70a7239035 --- /dev/null +++ b/data/stockpiles/barrels.dfstock @@ -0,0 +1,2 @@ + +BARREL \ No newline at end of file diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index ae77e5cf2e..922c3a4184 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -369,6 +369,7 @@ Subcategory prefixes:: Settings files:: pots + barrels bags buckets sand From 8c1e761f867f6259152cd1dbdfd3417e3544358d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 7 Jun 2023 01:28:15 -0700 Subject: [PATCH 0050/4620] update changelog --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index b010f55b55..cdfe296507 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -40,6 +40,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `autonick`: additional nicknames based on burrowing animals, colours, gems and minerals added +- `stockpiles`: added ``barrels`` and ``organic`` stockpile presets ## Documentation From 321941385e94171142c24e1550bc797bafc8041e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 7 Jun 2023 11:57:16 -0700 Subject: [PATCH 0051/4620] add artifacts and masterworks presets --- data/stockpiles/artifacts.dfstock | Bin 0 -> 107 bytes data/stockpiles/masterworks.dfstock | Bin 0 -> 112 bytes docs/changelog.txt | 2 +- docs/plugins/stockpiles.rst | 15 +++++++++++++++ 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 data/stockpiles/artifacts.dfstock create mode 100644 data/stockpiles/masterworks.dfstock diff --git a/data/stockpiles/artifacts.dfstock b/data/stockpiles/artifacts.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..1c7315dfe83ce1f673768a743418c10baa1124fa GIT binary patch literal 107 zcmd;L;b0J85MrLe$RNd~#Nk*}l9`s6T%yGiz!1S;#NdP^=EV@i5XF#$B$CBY#8Ac1 e#K@-w*J#1uz|h6W=LHvtU`Sv%#mI1pkpTehwHf6A literal 0 HcmV?d00001 diff --git a/data/stockpiles/masterworks.dfstock b/data/stockpiles/masterworks.dfstock new file mode 100644 index 0000000000000000000000000000000000000000..fa94c86a936d8852d061758b28f67c069c8d48c5 GIT binary patch literal 112 zcmd;L;b0J85MrLe$RNe7#Oa$@T#{OpR+^*562K6_V8q~rEa=4$#1O@hge;WBP{dHh f(8S2Eh0trk;K0zu$nS*^iC{=zIK{|tiID*Sw*(xB literal 0 HcmV?d00001 diff --git a/docs/changelog.txt b/docs/changelog.txt index cdfe296507..b15f5565e0 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -40,7 +40,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Misc Improvements - `autonick`: additional nicknames based on burrowing animals, colours, gems and minerals added -- `stockpiles`: added ``barrels`` and ``organic`` stockpile presets +- `stockpiles`: added ``barrels``, ``organic``, ``artifacts``, and ``masterworks`` stockpile presets ## Documentation diff --git a/docs/plugins/stockpiles.rst b/docs/plugins/stockpiles.rst index 922c3a4184..cc1f3c016c 100644 --- a/docs/plugins/stockpiles.rst +++ b/docs/plugins/stockpiles.rst @@ -143,6 +143,21 @@ item properties that you can match with filters. In addition, there are normally at least a few convenient pre-made settings files that manipulate interesting category subsets. +Cross-category stockpile adjustments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Settings files:: + + artifacts + masterworks + +Example command for a meltable weapons stockpile:: + + stockpiles import cat_weapons + stockpiles import -m disable cat_weapons -f other/ + stockpiles import -m disable artifacts + stockpiles import -m disable masterworks + Ammo stockpile adjustments ~~~~~~~~~~~~~~~~~~~~~~~~~~ From 873000df806d806dfa8d7e992818e97e2bffe96c Mon Sep 17 00:00:00 2001 From: DFHack-Urist via GitHub Actions <63161697+DFHack-Urist@users.noreply.github.com> Date: Thu, 8 Jun 2023 07:13:15 +0000 Subject: [PATCH 0052/4620] Auto-update submodules library/xml: master scripts: master --- library/xml | 2 +- scripts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/xml b/library/xml index 413f1c0371..1f22dd8b8a 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 413f1c0371094a7933db0cd524ff9fad64fb0fe3 +Subproject commit 1f22dd8b8aa767609ea13bf1d2da8907001e0ce2 diff --git a/scripts b/scripts index 0119ab1b6d..13a8225322 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 0119ab1b6d540e192c77f114c5ea7f7aeab9b39a +Subproject commit 13a82253226854a5da8d01e6deeb5cc6192c770f From c98525d6683869fc72a5cbf27ea659a9fb4934b1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 7 Jun 2023 03:40:34 -0700 Subject: [PATCH 0053/4620] update dreamfort to new quickfort syntax and capabilities --- data/blueprints/dreamfort.csv | 2675 ++++++++++++++------------------- 1 file changed, 1170 insertions(+), 1505 deletions(-) diff --git a/data/blueprints/dreamfort.csv b/data/blueprints/dreamfort.csv index 66ce693b84..e93d082e3e 100644 --- a/data/blueprints/dreamfort.csv +++ b/data/blueprints/dreamfort.csv @@ -1,16 +1,17 @@ #notes label(help) run me for the dreamfort walkthrough "Welcome to Dreamfort! These blueprints will help you build a functional, secure, fully self-sustaining fortress that you can use as-is or extend to build the fortress of your dreams!" "" -"It can be difficult to apply a set of blueprints that you did not write yourself. This walkthrough will guide you through the high-level steps of building Dreamfort. Run ""quickfort run library/dreamfort.csv -n /checklist"" (or, if you're looking at the online version, switch to the ""checklist"" sheet) for a compact list of the commands you'll be running. Each level also has its own mini-walkthrough with more details." +"It can be difficult to apply a set of blueprints that you did not write yourself. This walkthrough will guide you through the high-level steps of building Dreamfort. Run ""quickfort run library/dreamfort.csv -n /checklist"" (or, if you're looking at the online version, switch to the ""checklist"" sheet) for a compact list of the blueprints you'll be applying. Each level also has its own mini-walkthrough with more details." "" "The final fort will have a walled-in area on the surface for livestock, trading, aboveground farming, and military training. One z-level down is the farming level, with related workshops and vents up to the surface for miasma prevention. The farming level also has a miniature dining hall and dormitory for use until you get the services and housing levels set up." "" "Beyond those two, the other layers can be built in any order, at any z-level, according to your preference and the layout peculiarities of your embark site:" "- The industry level has a compact, but complete set of workshops and stockpiles (minus what is already provided on the farming level)." -"- The services level has dining, hospital, marksman barracks, and justice services, plus a well system. It is 4 z-levels deep." -"- The guildhall level has large, empty rooms for building libraries, temples, and guildhalls." -- The suites level has fancy rooms for your nobles. +"- The services level has dining, hospital, marksman barracks, and justice services. It has a well system and is 4 z-levels deep." +"- The guildhall level has large rooms for building libraries, temples, and guildhalls, with optional furniture layouts." +- The suites level has fancy rooms for your nobles with the furniture that they require. - The apartments levels have small but well-furnished bedrooms for your other dwarves. +- The crypt level houses your dead. "" "Run each level's ""help"" blueprint (e.g. ""quickfort run library/dreamfort.csv -n /surface_help"") for more details." "" @@ -20,25 +21,20 @@ "" "There are some tasks common to all forts that Dreamfort doesn't specifically handle for you. For example, Dreamfort sets up a barracks, but managing squads is up to you. Here are some other common tasks that may need to be done manually (or with some other tool):" - Exploratory mining for specific resources like iron -- Filling the well system with water -- Bringing magma up to the industry level to power magma forges/furnaces +"- Filling the well system with water (if you have a light aquifer, see library/aquifer_tap.csv for help with this)" +- Bringing magma up to the industry level to power magma forges/furnaces (see library/pump_stack.csv for help with this) - Manufacturing trade goods -- Assigning skilled labors to migrants (although the example professions included with DFHack will help with this) "- Custom stockpile setups to assist with, for example, encrusting only high-quality items" "" -"Dreamfort works best at an embark site that is flat and has at least one soil layer. New players should avoid embarks with aquifers if they are not prepared to deal with them. Bring picks for mining, an axe for woodcutting, and an anvil for a forge. Bring a few blocks to speed up initial workshop construction as well. That's all you really need, but see the example embark profile in the online spreadsheets for a more complete setup." +"Dreamfort works best at an embark site that is relatively flat and has at least one soil layer. New players should avoid embarks with aquifers if they are not prepared to deal with them. Bring picks for mining, an axe for woodcutting, and an anvil for a forge. Bring a few blocks to speed up initial workshop construction as well. That's all you really need, but see the example embark profile in the online spreadsheets for a more complete setup." "" -"Other DFHack commands also work very well with Dreamfort, such as autofarm, autonestbox, prioritize, seedwatch, tailor, and, of course, buildingplan. An init file that gets everything configured for you is distributed with DFHack as hack/examples/init/onMapLoad_dreamfort.init." -Put that file in your dfhack-config/init/ directory -- the same directory that has dfhack.init. +"Other DFHack tools also work very well with Dreamfort, such as autofarm and all of the other DFHack auto tools. Turn them on in the DFHack gui/control-panel." "" -"Also check out https://docs.dfhack.org/en/stable/docs/Plugins.html#professions for more information on the default labor professions that are distributed with DFHack, including suggestions on how many dwarves of each profession you are likely to need at each stage of fort maturity." +"Once you have your starting surface workshops up and running, you might want to configure buildingplan to only use blocks for constructions so it won't use your precious wood, boulders, and bars to build floors and walls. If you bring at least 7 blocks with you on embark, you can set this to be your default in the Autostart tab of gui/control-panel." "" -"Once you have your starting surface workshops up and running, you might want to configure buildingplan (in its global settings, accessible from any building placement screen, e.g.: b-a-G) to only use blocks for constructions so it won't use your precious wood, boulders, and bars to build floors and walls. If you bring at least 7 blocks with you on embark, you can even set this in your dfhack-config/init/onMapLoad.init file like this:" -on-new-fortress buildingplan set boulders false; buildingplan set logs false +"Directly after embark, run ""quickfort run library/dreamfort.csv -n /setup_help"" to get some advice on initial settings, and get started building your fort with ""quickfort run library/dreamfort.csv -n /surface1"" on the surface (see /surface_help for how to select a good spot). Read the walkthroughs for each level to understand what's going on and follow the checklist to keep track of where you are in the building process. Good luck, and have fun building an awesome Dreamfort-based fort!" "" -"Directly after embark, run ""quickfort run library/dreamfort.csv -n /setup"" with your cursor on your wagon to set settings, and get started building your fort with ""quickfort run library/dreamfort.csv -n /surface1"" on the surface (see /surface_help for how to select a good spot). Read the walkthroughs for each level to understand what's going on and follow the checklist to keep track of where you are in the building process. Good luck, and have fun building an awesome Dreamfort-based fort!" -"" -"The dreamfort.csv file distributed with DFHack is generated from online spreadsheet files. If you want to look at how these blueprints are put together, it is easier to look at the online spreadsheets than the giant .csv. You can view them at: https://drive.google.com/drive/folders/1iS90EEVqUkxTeZiiukVj1pLloZqabKuP" +"The dreamfort.csv file distributed with DFHack is generated from online spreadsheet files. If you want to look at how these blueprints are put together, it is easier to look at the online spreadsheets than the giant .csv. You can view them at: https://drive.google.com/drive/folders/1dsmvnzbOKsyFS3DCj0F8ibSnMhVHEjdV" You are welcome to copy the Dreamfort spreadsheets and make your own modifications! "" "If you like, you can download a fully built Dreamfort-based fort from https://dffd.bay12games.com/file.php?id=15434 and explore it @@ -46,105 +42,98 @@ interactively." "# The dreamfort.csv distributed with DFHack is generated with the following command: for fname in dreamfort*.xlsx; do xlsx2csv -a -p '' ""$fname""; done | sed 's/,*$//'" #notes label(checklist) command checklist -"Here is the recommended order for Dreamfort commands. You can copy/paste the command lines directly into the DFHack terminal, or, if you prefer, you can run the blueprints in the UI with gui/quickfort. See the walkthroughs (the ""help"" blueprints) for context and details. Also remember to read the messages the blueprints print out after you run them so you don't miss any important manual steps." +"Here is the recommended order for Dreamfort commands. You can either copy/paste the command lines directly into the DFHack terminal or run the blueprints in the UI with gui/quickfort. See the walkthroughs (the ""help"" blueprints) for context and details. Also remember to read the messages the blueprints print out after you run them so you don't miss any important manual steps!" "" -- Preparation (before you embark!) -- -Copy hack/examples/init/onMapLoad_dreamfort.init to your dfhack-config/init directory inside your DF installation -Optionally copy the premade Dreamfort embark profile from the online spreadsheets to the data/init/embark_profiles.txt file +Optionally copy the premade Dreamfort embark profile from the online spreadsheets to the prefs/embark_profiles.txt file. +Run gui/control-panel and enable settings on the Autostart tab. See the /setup_help notes for details. "" -- Set settings and preload initial orders -- -quickfort run library/dreamfort.csv -n /setup,# Run before making any manual adjustments to settings! Run the /setup_help blueprint for details on what this blueprint does. -"quickfort orders library/dreamfort.csv -n ""/surface2, /farming2, /surface3, /farming3, /industry2, /surface4""","# Queue up orders required to get the fort minimally functional and secure. You can remove the order for the anvil (you brought one with you, right?)." +quickfort run library/dreamfort.csv -n /setup_help,# For advice on how to do initial setup for success. +"quickfort orders library/dreamfort.csv -n ""/surface2, /farming2, /surface3, /industry2, /surface4""","# Queue up orders required to get the fort minimally functional and secure. You can remove the order for the anvil (you brought one with you, right?)." "" -- Find a good starting spot on the surface -- gui/quickfort library/dreamfort.csv -n /perimeter,# Run at embark. Don't actually apply the blueprint. Just use the preview shadow to find a good spot on the surface. "" -- Dig -- -quickfort run library/dreamfort.csv -n /surface1,# Run when you find your center tile. -quickfort run library/dreamfort.csv -n /dig_all,"# Run when you find a suitable rock layer for the industry level. It designates digging for industry, services, guildhall, suites, and apartments all in one go. This list does not include the farming level, which we'll dig in the uppermost soil layer a bit later. Note that it is more efficient for your miners if you designate your digging before they dig the central stairs past that level since the stairs are dug at a low priority. This keeps your miners focused on one level at a time. If you need to designate your levels individually due to caverns interrupting the sequence or just because it is your preference, run the level-specific dig blueprints (i.e. /industry1, /services1, /guildhall1, /suites1, and 5 levels of /apartments1) instead of running /dig_all." +quickfort run library/dreamfort.csv -n /surface1,# Run when you find your center tile. Deconstruct your wagon if it is in the way. +quickfort run library/dreamfort.csv -n /dig_all,"# Run when you find a suitable rock layer for the industry level. It designates digging for industry, services, guildhall, suites, apartments, and the crypt all in one go. This list does not include the farming level, which we'll dig in the uppermost soil layer a bit later. Note that it is more efficient for your miners if you designate your digging before they dig the central stairs past that level since the stairs are dug at a low priority. This keeps your miners focused on one level at a time. If you need to designate your levels individually due to caverns interrupting the sequence or just because it is your preference, run the level-specific dig blueprints (i.e. /industry1, /services1, /guildhall1, /suites1, 3 levels of /apartments1, and /crypt1) instead of running /dig_all." "" -- Core fort (should finish at about the third migration wave) -- quickfort run library/dreamfort.csv -n /surface2,"# Run after initial trees are cleared. If you are deconstructing the wagon now, wait until after the wagon is deconstructed so the jobs that depend on wagon contents (e.g. blocks) don't get canceled later." -quickfort run library/dreamfort.csv -n /farming1,# Run when channels are dug and the additional designated trees are cleared. +quickfort run library/dreamfort.csv -n /farming1,# Run when channels are dug and the additional designated trees on the surface are cleared. quickfort run library/dreamfort.csv -n /farming2,# Run when the farming level has been dug out. quickfort run library/dreamfort.csv -n /surface3,# Run right after /farming2. -quickfort run library/dreamfort.csv -n /farming3,# Run when furniture has been placed. quickfort run library/dreamfort.csv -n /industry2,# Run when the industry level has been dug out. -prioritize ConstructBuilding,# To get those workshops up and running ASAP. You may have to run this several times as the materials for the building construction jobs become ready. +prioritize ConstructBuilding,"# To get those workshops up and running ASAP. You may have to run this several times as the materials for the building construction jobs become ready. As industry workshops are built, you can remove the temporary workshops and stockpiles on the surface. **Be sure that there are no items attached to jobs left in the workshops before deconstructing them, otherwise you'll get canceled jobs!**" quickfort run library/dreamfort.csv -n /surface4,"# Run after the walls and floors are built on the surface. Even if /surface3 is finished before you run /industry2, though, wait until after /industry2 to run this blueprint so that surface walls, floors, and roofing don't prevent your workshops from being built (due to lack of blocks)." -"quickfort orders,run library/dreamfort.csv -n /services2",# Run when the services levels have been dug out. Feel free to remove the orders for the ropes if you already brought them with you. -orders import library/basic,"# Run after the first migration wave, so you have dorfs to do all the basic tasks. Note that this is the ""orders"" plugin, not the ""quickfort orders"" command." +"quickfort orders,run library/dreamfort.csv -n /services2","# Run when the services levels have been dug out. Feel free to remove the orders for the ropes if you already brought them with you. If you are filling your wells from an aquifer or stream, now is also a good time to start digging the plumbing." +orders import library/basic,"# Run after the first migration wave, so you have dwarves to do all the basic tasks. Note that this is the ""orders"" plugin, not the ""quickfort orders"" command." "quickfort orders,run library/dreamfort.csv -n /surface5","# Run when all marked trees on the surface are chopped down and walls and floors have been constructed, including the roof section over the future barracks." prioritize ConstructBuilding,# Run when you see the bridges ready to be built so the busy masons come and build them. -"quickfort orders,run library/dreamfort.csv -n /surface6",# Run when at least the beehives and weapon rack are constructed and you have linked all levers to their respective bridges. +"quickfort orders,run library/dreamfort.csv -n /surface6",# Run once you have linked all levers to their respective bridges. "quickfort orders,run library/dreamfort.csv -n /surface7",# Run after the surface walls are completed and any marked trees are chopped down. "" -- Plumbing -- -"This is a good time to fill your well cisterns, either with a bucket brigade or by routing water from a freshwater stream or an aquifer (see the library/aquifer_tap.csv blueprint for help with this)." -"Also consider bringing magma up to your services level so you can replace the forge and furnaces on your industry level with more powerful magma versions. This is especially important if your embark has insufficient trees to convert into charcoal. Keep in mind that moving magma is a tricky process and can take a long time. Don't forget to continue making progress through the checklist! If you choose to use magma, I suggest getting it in place before importing the military and smelting automation orders since they make heavy use of furnaces and forges." +"If you haven't done it already, this is a good time to fill your well cisterns, either with a bucket brigade or by routing water from a freshwater stream or an aquifer (see the library/aquifer_tap.csv blueprint for help with this)." +"Also consider bringing magma up to your services level so you can replace the forge and furnaces on your industry level with more powerful magma versions. This is especially important if your embark has insufficient trees to convert into charcoal. Keep in mind that moving magma is a tricky process and can take a long time. Don't forget to continue making progress through this checklist! If you choose to use magma, try to get it in place before importing the military and smelting automation orders since they make heavy use of furnaces and forges." "" -- Mature fort (third migration wave onward) -- +The order of steps in this section is less important. Feel free to reorder as per the needs of your fort. orders import library/furnace,# Automated production of basic furnace-related items. Don't forget to create a sand collection zone (or remove the sand- and glass-related orders if you have no sand). +"quickfort orders,run library/dreamfort.csv -n /guildhall2_default",# Run when the guildhall level has been dug out. "quickfort orders,run library/dreamfort.csv -n /suites2",# Run when the suites level has been dug out. -"quickfort orders,run library/dreamfort.csv -n /surface8","# Run if/when you need longer trap corridors on the surface for larger sieges, anytime after you run /surface7." +"quickfort orders,run library/dreamfort.csv -n /services3",# Run when your population grows to about 20. "quickfort orders,run library/dreamfort.csv -n /apartments2",# Run when the first apartment level has been dug out. -"quickfort orders,run library/dreamfort.csv -n /services3","# Run after the dining table and chair, weapon rack, and archery targets have been constructed. Also wait until after you complete /surface7, though, because surface defenses are more important than a grand dining hall." -"quickfort orders,run library/dreamfort.csv -n /guildhall2",# Run when the guildhall level has been dug out. -"quickfort orders,run library/dreamfort.csv -n ""/guildhall3, /guildhall4""",# Optionally run after /guildhall2 to build default furnishings and declare a library and temple. -"quickfort orders,run library/dreamfort.csv -n /apartments3",# Run when all beds have been constructed on the first apartments level. -"quickfort orders,run library/dreamfort.csv -n /farming4",# Run once you have a cache of potash. +"quickfort orders,run library/dreamfort.csv -n /crypt2",# Run when the crypt level has been dug out. +"quickfort orders,run library/dreamfort.csv -n /surface8","# Run if/when you need longer trap corridors on the surface for larger sieges, anytime after you run /surface7." +"quickfort orders,run library/dreamfort.csv -n /farming3",# Add in all the doors we couldn't afford to build earlier. orders import library/military,# Automated production of military equipment. Turn on automelt in the meltables piles on the industry level to automatically upgrade all metal military equipment to masterwork quality. These orders are optional if you are not using a military. orders import library/smelting,# Automated production of all types of metal bars. -"quickfort orders,run library/dreamfort.csv -n /services4","# Run when you need a jail, anytime after the restraints are placed from /services3." -orders import library/rockstock,# Maintains a small stock of all types of rock furniture. +"quickfort orders,run library/dreamfort.csv -n /services4",# Run when you need a full dining room and/or jail. +orders import library/rockstock,# Maintains a small stock of all types of rock furniture. Useful for filling out future guildhalls. orders import library/glassstock,# Maintains a small stock of all types of glass furniture and parts (only import if you have sand). +"quickfort orders,run library/dreamfort.csv -n /apartments2",# Repeat as needed as your fort grows. +"quickfort orders,run library/dreamfort.csv -n /crypt3",# Run when the crypt is starting to run out of space. "" --- Repeat for each remaining apartments level as needed -- -"quickfort orders,run library/dreamfort.csv -n /apartments2",# Run when the apartment level has been dug out. -"quickfort orders,run library/dreamfort.csv -n /apartments3",# Run when all beds have been constructed. -burial -pets,# Run once the coffins are placed to set them to allow for burial. - See this checklist online at https://docs.google.com/spreadsheets/d/13PVZ2h3Mm3x_G1OXQvwKd7oIR2lK4A1Ahf6Om1kFigw/edit#gid=1459509569 #notes label(setup_help) -Makes common initial adjustments to in-game settings. -"" -"The /setup blueprint is intended to be run once at the start of the game, before anything else is changed. Players are welcome to make any further customizations after this blueprint is run. Please be sure to run the /setup blueprint before making any other changes, though, so your settings are not overwritten!" -"" -The following settings are changed: -"- The manager, chief medical dwarf, broker, and bookkeeper noble roles are assigned to the first suggested dwarf. This is likely to be the expedition leader, but the game could suggest others if they have relevant skills. Bookkeeping is set to the highest precision." -"" -- Standing orders are set to: - - only farmers harvest - - gather refuse from outside (incl. vermin) - - no autoloom (so the hospital always has thread -- we'll be managing cloth production with automated orders) -"" -"- A burrow named ""Inside"" is created, but it's up to the player to define the area as the fort expands. It is intended for use in getting your civilians to safety during sieges. A military alert named ""Siege"" is also created and associated with the ""Inside"" burrow." -"" -- Military uniforms get the following modifications: - - all default uniforms set to replace clothing -" - in the ""Metal armor"" uniform, the ""metal armor"" item is removed and replaced by ""metal breastplate"" and ""metal mail shirt""" -" - in the ""Metal armor"" uniform, the ""metal legwear"" item is removed and replaced by ""metal greaves""" -"" -"All default uniforms should also have a leather cloak added, but the position of the cloak in the equipment list changes for every embark. We suggest manually adding a leather cloak to your uniforms after running the /setup blueprint." -"" -- Hotkeys are created for the 8 most interesting levels. Only the names are set -- it's up to the player to adjust them to actual locations in the (H) menu since the blueprint can't know where the levels will eventually be built. Feel free to replace any hotkeys with locations that *you* think are interesting : ) -"" -These are all set for your convenience. Nothing in Dreamfort depends on these settings staying as they are. Feel free to change any setting to your personal preference. -"" -#aliases -startnobles: n{Down 4}{togglesequence 8}{Up}s{Up}&^^ -startorders: ohrov^Wl^^ -startburrows: wa&nInside&^^ -metalarmorsetup: A{Right 2}{Down 2}&{Down}&{Left}&M{Right}{Down}&{Left}{Down}{Right}{Down}&{Left}{Down 2}L{Right}{Down 2}&{Left}{Down 3}&M{Right}{Down}&{Left 2} -startmilitary: mnr{Down}r{metalarmorsetup}{Down}racNSiege&{Right}&^ -sethotkey: {fkey}n{name}& -starthotkeys: H{sethotkey fkey={F2} name=Farming}{sethotkey fkey={F3} name=Industry}{sethotkey fkey={F4} name=Services}{sethotkey fkey={F5} name=Guildhall}{sethotkey fkey={F6} name=Quarry}{sethotkey fkey={F7} name=Cavern}{sethotkey fkey={F8} name=Magma}^ -"" -"#config label(setup) message(Please set the zoom targets of the hotkeys (the 'H' menu) according to where you actually end up digging the levels. -As you build your fort, expand the ""Inside"" burrow to include new civilian-safe areas. -Optionally, add a leather cloak to your military uniforms to enhance their protection rating. -Nothing in Dreamfort depends on these settings staying as they are. Feel free to change any setting to your personal preference.) assign nobles, set standing orders, create burrows, make adjustments to military uniforms, and set hotkey names" -{startnobles}{startorders}{startburrows}{startmilitary}{starthotkeys} +These are Dreamfort's suggestions for adjustments to settings and initial setup. +"" +"- Assign dwarves to manager, chief medical dwarf, sheriff, broker, and bookkeeper noble roles (they can all be the same dwarf)" +"" +- On the Work details screen (Labor -> Work details) + - Specialize your miners (click the hammer-lock button so it turns red) and make your miners also engravers (they'll need something to do once the mining is done) +"" +- In standing orders (Labor -> Standing orders): +" - Change ""Automatically weave all thread"" to ""No automatic weaving"" so the hospital always has thread -- we'll be managing cloth production with automated orders" +"" +"- Create a burrow named ""Inside"" and register it as a civilian alert burrow in gui/civ-alert so you can use it to get your civilians to safety during sieges. You will have to periodically expand the burrow area as the fort expands." +"" +"Beyond the bugfix tools that are enabled by default, we recommend enabling the following DFHack tools in gui/control-panel (but they are not required if you prefer to do these things manually):" +"On the ""Autostart"" tab, additionally enable:" +- autobutcher +- autobutcher target 50 50 14 2 BIRD_GOOSE +- autochop +- autofarm +- autofish +- autonestbox +- autoslab +- ban-cooking all +- buildingplan set boulders false +- buildingplan set logs false +- nestboxes +- prioritize +- seedwatch +- suspendmanager +- tailor +"Note that if you've already started your fort and have missed the ""new fort"" trigger, you can enable these tools on the ""Fort"" tab instead. You can run the one-time commands (like ban-cooking all) manually from gui/launcher." +"" +"On the ""Maintenance"" tab, enable:" +- everything +"" +"On the ""System"" tab, additionally enable:" +- work-now "#meta label(dig_all) start(central stairs on industry level) dig industry, services, guildhall, suites, and apartments levels. does not include farming." # Note that this blueprint will only work for the unified dreamfort.csv. It won't work for the individual .xlsx files (since #meta blueprints can't cross file boundaries). "" @@ -156,35 +145,35 @@ Nothing in Dreamfort depends on these settings staying as they are. Feel free to #> /suites1 #> -/apartments1 repeat(down 5) +/apartments1 repeat(down 3) +#>3 +/crypt1 #ignore -"Here are the minimal labors needed for essential tasks in getting Dreamfort up and running, along with suggestions for which dwarves to assign them to. You can enable additional labors as you wish. Skills with an asterisk (*) are especially worth putting points into on the embark preparation screen." +"Here are the most important skills for getting Dreamfort up and running, along with suggestions for how to distribute them." "" -Manager / Bookkeeper / Broker,Miner,Miner,Mason,Mason,Outdoorsdwarf,Farmer -Mechanic (*),Miner (*),Miner (*),Mason (*),Mason (*),Carpenter (*),Grower (*) -Stonecrafter,,,,,Wood Cutter (*) -Wood Cutter,,,,,Bee Keeper -Architect -Misc. labors needed for constructing workshops +Manager / Bookkeeper / Broker,Miner,Miner,Mason,Smith,Outdoorsdwarf,Farmer +Mechanic,Miner,Miner,Stonecutter,Weaponsmith,Carpenter,Stonecutter +Stonecrafting,Engraver,Engraver,Mason,Armorsmith,Wood Cutter,Planter "" -"The most time-consuming tasks in early Dreamfort are: mining, chopping down trees, and making blocks. Starting with at least two miners, two woodcutters (assuming your embark has trees), and two masons helps in keeping the fort from stalling." +"The most time-consuming tasks in early Dreamfort are: mining, chopping down trees, and making blocks. Starting with at least two miners, two woodcutters (assuming your embark has trees), and two stonecutters helps keep the fort from stalling. If you have to smooth walls to prevent a light aquifer from flooding your fort, starting with a few engravers saves a ton of time." "" We suggest bringing at least: 2 picks,for the two miners -2 battleaxes,for the two woodcutters +2 battleaxes,for two active woodcutters 1 anvil,for the forge food and seeds,as per usual 4 ropes,"for the hospital well and traction benches. you could build the ropes out of raw materials, but dwarves are usually too busy to do textile work at the start of the game." 7 blocks,for starting workshops and the temporary trade depot. necessary if you have buildingplan configured for blocks only. -many boulders,for quickly turning into more blocks. blocks are the limiting factor in the early stages. +many boulders,for quickly turning into more blocks while your miners are digging in dirt or dealing with aquifers. blocks are the limiting factor in the early stages. dogs and cats,for protection and vermin control -geese,"for bones and leather. bring at least 1 male and 2 females for the 2 early nestboxes. autobutcher settings in the included onMapLoad_dreamfort.init file are optimized for raising geese. if you prefer another bird, be sure to adjust the autobutcher settings." +geese,for bones and leather. bring at least 1 male and 2 females for the 2 early nestboxes. "" Also bring logs for beds if embarking in an area without many trees. "" See ldog's Dreamfort embark profile for a more advanced (and more thoroughly explained!) approach: https://drive.google.com/file/d/1Et42JTzeYK23iI5wrPMsFJ7lUXwVBQob/view?usp=sharing "#ignore Add these lines to the bottom of your ""data/init/embark_profiles.txt"" file to make the ""Dreamfort"" profile available in-game. Also see ldog's dreamfort embark profile for a more advanced, dwarfy approach." +[PROFILE] [TITLE:Dreamfort] [SKILL:1:STONECRAFT:1] [SKILL:1:MECHANICS:5] @@ -193,36 +182,40 @@ https://drive.google.com/file/d/1Et42JTzeYK23iI5wrPMsFJ7lUXwVBQob/view?usp=shari [SKILL:1:ORGANIZATION:1] [SKILL:1:RECORD_KEEPING:1] [SKILL:2:MINING:5] -[SKILL:2:DETAILSTONE:2] +[SKILL:2:ENGRAVE_STONE:4] [SKILL:2:SWIMMING:1] [SKILL:3:MINING:5] -[SKILL:3:DETAILSTONE:2] +[SKILL:3:ENGRAVE_STONE:4] [SKILL:3:SWIMMING:1] -[SKILL:4:MASONRY:5] -[SKILL:5:MASONRY:5] +[SKILL:4:MASONRY:2] +[SKILL:4:MILITARY_TACTICS:5] +[SKILL:4:CUT_STONE:3] +[SKILL:5:FORGE_WEAPON:5] +[SKILL:5:FORGE_ARMOR:5] [SKILL:6:WOODCUTTING:5] [SKILL:6:CARPENTRY:5] -[SKILL:7:PLANT:3] -[ITEM:2:WEAPON:ITEM_WEAPON_PICK:INORGANIC:COPPER] -[ITEM:2:WEAPON:ITEM_WEAPON_AXE_BATTLE:INORGANIC:COPPER] +[SKILL:7:PLANT:5] +[SKILL:7:CUT_STONE:5] +[ITEM:10:CLOTH:NONE:CREATURE_MAT:SPIDER_CAVE:SILK] +[ITEM:100:WOOD:NONE:PLANT_MAT:WILLOW:WOOD] +[ITEM:30:BLOCKS:NONE:INORGANIC:QUARTZITE] +[ITEM:21:SEEDS:NONE:PLANT_MAT:MUSHROOM_HELMET_PLUMP:SEED] +[ITEM:21:SEEDS:NONE:PLANT_MAT:GRASS_TAIL_PIG:SEED] +[ITEM:21:SEEDS:NONE:PLANT_MAT:GRASS_WHEAT_CAVE:SEED] +[ITEM:21:SEEDS:NONE:PLANT_MAT:POD_SWEET:SEED] +[ITEM:20:SEEDS:NONE:PLANT_MAT:BUSH_QUARRY:SEED] +[ITEM:20:SEEDS:NONE:PLANT_MAT:MUSHROOM_CUP_DIMPLE:SEED] [ITEM:1:ANVIL:NONE:INORGANIC:IRON] -[ITEM:7:DRINK:NONE:PLANT_MAT:MUSHROOM_HELMET_PLUMP:DRINK] -[ITEM:26:DRINK:NONE:PLANT_MAT:GRASS_TAIL_PIG:DRINK] -[ITEM:26:DRINK:NONE:PLANT_MAT:GRASS_WHEAT_CAVE:DRINK] -[ITEM:26:DRINK:NONE:PLANT_MAT:POD_SWEET:DRINK] -[ITEM:10:SEEDS:NONE:PLANT_MAT:MUSHROOM_HELMET_PLUMP:SEED] -[ITEM:10:SEEDS:NONE:PLANT_MAT:GRASS_TAIL_PIG:SEED] -[ITEM:10:SEEDS:NONE:PLANT_MAT:GRASS_WHEAT_CAVE:SEED] -[ITEM:10:SEEDS:NONE:PLANT_MAT:POD_SWEET:SEED] -[ITEM:10:SEEDS:NONE:PLANT_MAT:BUSH_QUARRY:SEED] -[ITEM:10:SEEDS:NONE:PLANT_MAT:MUSHROOM_CUP_DIMPLE:SEED] -[ITEM:25:PLANT:NONE:PLANT_MAT:MUSHROOM_HELMET_PLUMP:STRUCTURAL] +[ITEM:2:WEAPON:ITEM_WEAPON_AXE_BATTLE:INORGANIC:COPPER] +[ITEM:2:WEAPON:ITEM_WEAPON_PICK:INORGANIC:COPPER] +[ITEM:20:DRINK:NONE:PLANT_MAT:GRASS_TAIL_PIG:DRINK] +[ITEM:20:DRINK:NONE:PLANT_MAT:MUSHROOM_HELMET_PLUMP:DRINK] +[ITEM:20:DRINK:NONE:PLANT_MAT:POD_SWEET:DRINK] +[ITEM:20:DRINK:NONE:PLANT_MAT:GRASS_WHEAT_CAVE:DRINK] +[ITEM:30:PLANT:NONE:PLANT_MAT:MUSHROOM_HELMET_PLUMP:STRUCTURAL] +[ITEM:45:BOULDER:NONE:INORGANIC:QUARTZITE] +[ITEM:20:THREAD:NONE:CREATURE_MAT:SPIDER_CAVE:SILK] [ITEM:4:CHAIN:NONE:CREATURE_MAT:SPIDER_CAVE:SILK] -[ITEM:5:CLOTH:NONE:CREATURE_MAT:SPIDER_CAVE:SILK] -[ITEM:5:THREAD:NONE:CREATURE_MAT:SPIDER_CAVE:SILK] -[ITEM:50:WOOD:NONE:PLANT_MAT:WILLOW:WOOD] -[ITEM:40:BOULDER:NONE:INORGANIC:QUARTZITE] -[ITEM:10:BLOCKS:NONE:INORGANIC:QUARTZITE] [PET:2:DOG:FEMALE:STANDARD] [PET:1:DOG:MALE:STANDARD] [PET:2:CAT:FEMALE:STANDARD] @@ -268,7 +261,7 @@ Features: - Barracks (with prisoner processing quantum dump) - Trap-filled hallways for invaders - Optional extended trap hallways (to handle larger sieges) -- Protected trade depot +"- Protected trade depot, with separate trade goods stockpiles for organics and inorganics (for easy elven trading)" - A grid of 1x1 farm plots (intended to be managed by DFHack autofarm) "" Manual steps you have to take: @@ -279,11 +272,11 @@ Manual steps you have to take: Be sure to choose an embark site that has a flat area on the surface large enough to use these blueprints! "" Surface Walkthrough: -"1) Choose a tile for your central fortress stairs. The terrain around that tile should be perfectly flat. Trees are ok, but no slopes, rivers, or lakes. To be sure that the tile you've chosen is in a good spot, set the cursor over that tile and run ""quickfort run library/dreamfort.csv -n /perimeter"". This will show you the eventual boundaries of the fort. Some wall segments might be missing due to existing trees, but that's ok. Make sure the area within the exterior wall is flat. Run ""quickfort undo library/dreamfort.csv -n /perimeter"" to clean up." +"1) Choose a tile for your central fortress stairs. The terrain around that tile should be perfectly flat. Trees are ok, but no slopes, rivers, or lakes. To be sure that the tile you've chosen is in a good spot, run ""gui/quickfort library/dreamfort.csv -n /perimeter"". This will show you the eventual boundaries of the fort. Some wall segments might be missing due to existing trees, but that's ok. Make sure the area within the exterior wall is flat. Cancel out of the preview. You don't actually need to apply this blueprint." "" "2) With the cursor on the chosen tile, run /surface1 to clear surrounding trees and set up your pastures. Deconstruct your wagon to get it out of the way of our upcoming walls and floors. Remember to assign your dogs to the pasture around the staircase and your grazing animals to the large pasture. Your egg-layers will automatically get assigned to nestbox zones once the nestboxes are built, so you don't need to worry about them. You can let your cats roam free to chase vermin." "" -"3) Once the marked trees have been cleared, run /surface2 to setup starting workshops/stockpiles, channel out the miasma vents for the farming level, and start clearing trees from a larger area. If you haven't done it already, now is a good time to configure buildingplan to only build buildings with blocks, not logs or raw boulders. Do this by entering buildingplan's global configuration (""baG"") and ensuring the only generic building material allowed is ""blocks"". Run ""quickfort orders"" for /surface2." +"3) Once the marked trees have been cleared, run /surface2 to setup starting workshops/stockpiles, channel out the miasma vents for the farming level, and start clearing trees from a larger area. If you haven't done it already, now is a good time to configure buildingplan to only build buildings with blocks, not logs or raw boulders. Run ""quickfort orders"" for /surface2." "" "4) Once the channels are dug out and the trees are cleared, start digging the farming level one z-level down. Once you have run /farming2, come back to the surface and run /surface3 to cover the vents and build an enclosure around your central stairs. Although the vents will be covered with flooring, they will still work to prevent miasma on the farming level. Run ""quickfort orders"" for /surface3." "" @@ -291,39 +284,39 @@ Surface Walkthrough: "" "6) Once walls and floors have been constructed (including the small roof segment one z-level up over the barracks), run /surface5 to build furniture, gates, and the permanent trade depot. Remember to deconstruct the temporary trade depot once nobody is using it. Run ""quickfort orders"" for /surface5." "" -"7) Once at least the beehives and weapon rack are built, run /surface6 to configure the rooms and build the remaining walls and floors. Run ""quickfort orders"" for /surface6." +"7) Once all marked trees are cleared, run /surface6 to build the remaining walls and floors. Run ""quickfort orders"" for /surface6." "" "8) Once you have enough dwarves to do a lot of building without starving other important tasks, run /surface7 to build the roof. Run ""quickfort orders"" for /surface7." "" "9) For extra security, you can run /surface8 any time after /surface7 to extend the trap corridors. Run ""quickfort orders"" for /surface8." "" -"10) Once your industry and farming levels are set up and running, you can disassemble the surface workshops and remove the surface stockpiles. Disassembling a workshop scatters the items stored within it and cancels any pending jobs that happen to use those items. In order to avoid job cancellations, first set the surface workshops to not accept general work orders. Do this by entering query mode (""q""), selecting a workshop, entering the workshop profile (""P""), moving to work orders (right arrow), and hitting Enter. Then enter view mode (""t"") and check to see if any items in a workshop are marked with ""TSK"". Once no items in the workshop have that marker, you are free to disassemble that workshop." +"10) Once your industry and farming levels are set up and running, you can disassemble the surface workshops and remove the surface stockpiles. Disassembling a workshop scatters the items stored within it and cancels any pending jobs that happen to use those items. In order to avoid job cancellations, first set the surface workshops to not accept general work orders. Then check to see if any items in a workshop are marked as being part of an active job. Once no items in the workshop have that marker, you are free to disassemble that workshop." "" Sieges and Prisoner Processing: Here are some tips and procedures for handling seiges -- including how to clean up afterwards! "" "- Ensure your ""Inside"" burrow includes only below-ground areas and safe surface areas of your fort. In particular, don't include the ""atrium"" area (where the ""siege bait"" zone is) or the trapped hallways." "" -"- When a siege begins, set the civilian alert to ""Siege"" to ensure all your civilians stay out of danger. Immediately pull the lever to close the outer main gate. It is also wise to close the trade depot and inner main gate as well. That way, if enemies get past the traps, they'll have to go through the soldiers in your barracks." +"- When a siege begins, set your civilian alert (attach the alert to your ""Inside"" burrow if it isn't already) to ensure all your civilians stay out of danger. Immediately pull the lever to close the outer main gate. It is also wise to close the trade depot and inner main gate as well. That way, if enemies get past the traps, they'll have to go through the soldiers in your barracks." "" "- During a siege, use the levers to control how attackers path through the trapped corridors. If there are more enemies than cage traps, time your lever pulling so that the inner gates snap closed before your last cage trap is sprung. Then the remaining attackers will have to backtrack and go through the other trap-filled hallway." "" -"- If your cage traps fill up, ensure your hallways are free of uncaged attackers, then close the trap hallway outer gates and open the inner gates. Unset the civilian alert and allow your dwarves to reset all the traps -- make some extra cages in preparation for this! Then re-set the civilian alert to ""Siege"" and open the trap hallway outer gates." +"- If your cage traps fill up, ensure your hallways are free of uncaged attackers, then close the trap hallway outer gates and open the inner gates. Clear the civilian alert and allow your dwarves to reset all the traps -- make some extra cages in preparation for this! Then re-enable the civilian alert and open the trap hallway outer gates." "" "- Once the last attacker is caged, open all the gates and unset the civilian alert. Life is normal again!" "" "After a siege, you can use the caged prisoners to safely train your military. Here's how:" "" -"- Once the prisoners are hauled to the ""prisoner quantum"" stockpile, run ""unforbid all"" and ""stripcaged all"" in the DFHack console (or GUI launcher)." +"- Once the prisoners are hauled to the ""prisoner quantum"" stockpile, run ""stripcaged all"" in the DFHack gui/launcher." "" "- After all the prisoners' items have been confiscated, bring your military dwarves to the barracks (if they aren't already there)." "" -- Use the zone (i) menu to assign a group prisoners to the pasture that overlaps the prisoner quantum stockpile +- Assign a group prisoners to the pasture that overlaps the prisoner quantum stockpile "" "- Hauler dwarves will come and release prisoners one by one. Your military dwarves will immediately pounce on the released prisoner and chop them to bits, saving the hauler dwarves from being attacked. Repeat until all prisoners have been ""processed""." "" -"Only common hostile creatures are accepted by the prisoner hauling route by default. You can add additional creature types by configuring the hauling route stop in the 'h' menu. Note that generated creature types, like necromancer experiments, can't be explicitly added. You have to (at least temporarily) accept all animals to include them." -#meta label(perimeter) start(central stairs) message(Run quickfort undo on this blueprint to clean up.) show the eventual perimeter of the surface fort; useful for location scouting +"Only common hostile creatures are accepted by the prisoner hauling route by default. You can add additional creature types by configuring the hauling route stop. Note that generated creature types, like necromancer experiments, can't be explicitly added. You have to (at least temporarily) accept all animals to include them." +"#meta label(perimeter) start(central stairs) message(If you accidentally applied this blueprint to the map, run quickfort undo on this blueprint to clean up.) show the eventual perimeter of the surface fort; useful for location scouting" walls/surface_walls corridor/surface_corridor "" @@ -333,15 +326,13 @@ If your wagon is within the fort perimeter, deconstruct it to get it out of the Once the marked trees are all chopped down (if any), continue with /surface2.) clear trees and set up pastures" clear_small/surface_clear_small zones/surface_zones -name_zones/surface_name_zones #> central_stairs/central_stairs repeat(down 10) "" "#meta label(surface2) start(central stairs) message(Remember to enqueue manager orders for this blueprint. Once the channels are dug out and the marked trees are cleared, continue with /surface3.) set up starting workshops/stockpiles, channel miasma vents, and clear more trees" -build_start/surface_build_start place_start/surface_place_start -query_start/surface_query_start +build_start/surface_build_start channel/surface_channel clear/surface_clear "" @@ -357,16 +348,14 @@ pre_building/surface_pre_building "" "#meta label(surface5) start(central stairs) message(Remember to enqueue manager orders for this blueprint. Disassemble the temporary trade depot in the pasture once the new one is constructed (and no merchants are using the old one). -Once the marked trees are cleared and at least the beehives and weapon rack have been constructed, continue with /surface6.) build gates, furniture, and trade stockpile/depot" +Once the marked trees are cleared, continue with /surface6.) build gates, furniture, and trade stockpile/depot" +traffic/surface_traffic place/surface_place build/surface_build -query/surface_query -traffic/surface_traffic clear_large/surface_clear_large "" "#meta label(surface6) start(central stairs) message(Remember to enqueue manager orders for this blueprint. -Continue with /surface7 sometime after the walls are completed and any marked trees are chopped down, whenever you have enough dwarves to build the roof without starving other important construction tasks.) configure hives and barracks, build traps and remaining walls/floors" -query2/surface_query2 +Continue with /surface7 sometime after the walls are completed and any marked trees are chopped down, whenever you have enough dwarves to build the roof without starving other important construction tasks.) build traps and remaining walls/floors" walls/surface_walls floors/surface_floors traps/surface_traps @@ -384,17 +373,26 @@ roof4/surface_roof4 corridor_gates/surface_corridor_gates corridor/surface_corridor corridor_traps/surface_corridor_traps -query_corridor/surface_query_corridor -#dig label(central_stairs_odd) start(2;2) hidden() spiral stairs odd levels +#dig label(central_stairs_odd) start(2;2) hidden() carved spiral stairs odd levels `,j6,` u,`,u `,j6,` -#meta label(central_stairs_even) hidden() spiral stairs even levels +#meta label(central_stairs_even) hidden() carved spiral stairs even levels /central_stairs_odd transform(cw) -#meta label(central_stairs) two levels of spiral stairs (use --repeat down) +#meta label(central_stairs) two levels of carved spiral stairs (repeat down as needed) /central_stairs_odd #> /central_stairs_even +#build label(central_stairs_odd_constructed) start(2;2) hidden() constructed spiral stairs odd levels +`,Cd,` +Cu,`,Cu +`,Cd,` +#meta label(central_stairs_even_constructed) hidden() constructed spiral stairs even levels +/central_stairs_odd_constructed transform(cw) +#meta label(central_stairs_constructed) two levels of constructed spiral stairs (repeat down as needed) +/central_stairs_odd_constructed +#> +/central_stairs_even_constructed #dig label(surface_clear_small) start(19; 19) hidden() clear trees for starting workshops and stockpiles @@ -417,7 +415,7 @@ u,`,u ,,,`,,`,,,,,,,,,,`,t1,j,t1,j,t1,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,t1,t1,t1,t1,t1,,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,`,t1,t1,t1,t1,t1,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` +,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` ,,,`,,`,,,,,,,,,`,t1,,,,,,t1,`,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,t1,t1,,,,,,t1,t1,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,t1,t1,,t1,t1,t1,,t1,t1,,,,,,,,,`,,` @@ -435,98 +433,30 @@ Feel free to assign an unimportant animal to the pasture in the main entranceway ,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,nmt(25x11),,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,,`,n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),`,,,,,,`,nt(9x5),,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,,nt,nt,nt,nt,nt,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,`,nt,`,~,`,nt,`,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,,nt,nt,nt,nt,nt,,,,,,,,,,,`,,` -,,,`,,`,,`,n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,n,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,n,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,` -,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` - - - -#query label(surface_name_zones) start(19; 19) hidden() - - - -,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,"{namezone name=""main pasture""}",,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,,`,"{namezone name=""nestbox1""}","{namezone name=""nestbox2""}","{namezone name=""nestbox3""}","{namezone name=""nestbox4""}","{namezone name=""nestbox5""}","{namezone name=""nestbox6""}","{namezone name=""nestbox7""}",`,,,,,,`,"{namezone name=""taming area""}",,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,,,`,`,`,"{namezone name=""guard dogs""}",,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,`,,`,~,`,,`,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,,`,"{namezone name=""nestbox8""}","{namezone name=""nestbox9""}","{namezone name=""nestbox10""}","{namezone name=""nestbox11""}","{namezone name=""nestbox12""}","{namezone name=""nestbox13""}","{namezone name=""nestbox14""}",`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,"{namezone name=""siege bait""}",,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,"{namezone name=""prisoner processing""}",,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,` -,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` - - - -#build label(surface_build_start) start(19; 19) hidden() message(There is room to the left of the carpenter's workshop to build one more workshop of any type if you need it.) starting workshops - - - -,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,` +,,,`,,`,"n{name=""Main pasture""}(25x11)",,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,,,,,,,,,,,,,,,,,"t{name=""Pet training area""}(9x5)",,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,wc,,,,wr,,,,wm,,,,wt,,,,,D,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,,`,N,N,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` +,,,`,,`,,`,"n{name=""Nestbox 1""}(1x1)","n{name=""Nestbox 2""}(1x1)","n{name=""Nestbox 3""}(1x1)","n{name=""Nestbox 4""}(1x1)","n{name=""Nestbox 5""}(1x1)","n{name=""Nestbox 6""}(1x1)","n{name=""Nestbox 7""}(1x1)",`,,,,,,`,,,,,,,,,,`,,` +,,,`,,`,,`,,,,,,,,,"n/guarddogs{name=""Guard dogs""}(5x1)",~,~,~,~,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,`,,`,~,`,,`,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` +,,,`,,`,,`,,,,,,,,,n/guarddogs(5x1),~,~,~,~,,,,,,,,,,,`,,` +,,,`,,`,,`,"n{name=""Nestbox 8""}(1x1)","n{name=""Nestbox 9""}(1x1)","n{name=""Nestbox 10""}(1x1)","n{name=""Nestbox 11""}(1x1)","n{name=""Nestbox 12""}(1x1)","n{name=""Nestbox 13""}(1x1)","n{name=""Nestbox 14""}(1x1)",`,,,,,,`,,,,,,,,,,`,,` +,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` +,,,`,,`,"B{name=""Surface barracks""}(8x5)",,,,,,,,`,,,,,,,,`,"m{name=""Welcome area/wagon parking lot""}(8x5)",,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,,,,,,,,,,,,,"n{name=""Siege bait pasture""}",,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` +,,,`,,`,,,,,,,"t{name=""Caged wildlife taming area""}(1x1)",,`,,,,,,,,`,,,,,,,,,`,,` +,,,`,,`,`,`,`,`,`,`,"n{name=""Prisoner processing pen""}(1x-2)",`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` ,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,` ,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` @@ -537,9 +467,9 @@ Feel free to assign an unimportant animal to the pasture in the main entranceway ,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,` +,,,`,,`,,,"gunzSpd{name=""Starting misc"" containers=0}(8x2)",,,,,,,,"hlr{name=""Starting cloth/trash"" containers=0}(8x2)",,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,f(8x4),,,,,,,,w(4x4),,,,s2(5x4),,,,,gunzSpd(4x4),,,,hlr(4x4),,,,`,,` +,,,`,,`,"f{name=""Starting food""}(8x4)",,,,,,,,"w{name=""Starting wood""}(4x4)",,,,"s2{name=""Starting stone""}:=otherstone(6x4)",,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` @@ -554,7 +484,7 @@ Feel free to assign an unimportant animal to the pasture in the main entranceway ,,,`,,`,,,,,,,,,,`,,`,~,`,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` +,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` ,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` @@ -566,29 +496,29 @@ Feel free to assign an unimportant animal to the pasture in the main entranceway -#query label(surface_query_start) start(19; 19) hidden() config stockpiles +#build label(surface_build_start) start(19; 19) hidden() message(There is room to the left of the carpenter's workshop to build one more workshop of any type if you need it.) starting workshops ,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,` +,,,`,,`,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,,` +,,,`,,`,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,,` +,,,`,,`,,,,,,,,,,,,,,,,,,,,,`,`,"D{name=""Starter trade depot""}",`,`,`,,` +,,,`,,`,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,,` +,,,`,,`,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,"{givename name=""starting food""}",,,,"{givename name=""starting wood""}",,,,,"{givename name=""starting stone""}",,,,"{givename name=""starting misc""}",,,,"{givename name=""starting cloth/trash""}",`,,` -,,,`,,`,,,,,,,,,,,,,otherstone,,,,,nocontainers,,,,nocontainers,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,,,,,,,,,,`,,` +,,,`,,`,`,"wt{name=""Starter mechanic's""}",`,,`,"wc{name=""Starter carpenter""}",`,,`,"wr{name=""Starter craftsdwarf's""}",`,,`,"wm{name=""Starter stoneworker's""}",`,,,,,,,,,,,`,,` +,,,`,,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` +,,,`,,`,,`,N,N,,,,,,`,,,,,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,`,,`,~,`,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` +,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` ,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` @@ -622,7 +552,7 @@ Feel free to assign an unimportant animal to the pasture in the main entranceway ,,,`,,`,,,,,,,,,,`,,`,~,`,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` +,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` ,,,`,,`,,,,,,,,,`,h1,,,,,,h1,`,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,h1,h1,,,,,,h1,h1,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,h1,h1,,h1,h1,h1,,h1,h1,,,,,,,,,`,,` @@ -656,7 +586,7 @@ Feel free to assign an unimportant animal to the pasture in the main entranceway ,,,`,,`,,,,,,,,,,`,,`,~,`,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,t1,t1 -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,t1,t1 +,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,t1,t1 ,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,t1,t1 ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,t1,t1 ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,t1,t1 @@ -690,7 +620,7 @@ Feel free to assign an unimportant animal to the pasture in the main entranceway ,,,`,,`,,,,,,,,,,`,,`,~,`,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` +,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` ,,,`,,`,,,,,,,,,`,Cf,,,,,,Cf,`,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,Cf,Cf,,,,,,Cf,Cf,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,Cf,Cf,,Cf,Cf,Cf,,Cf,Cf,,,,,,,,,`,,` @@ -724,7 +654,7 @@ Feel free to assign an unimportant animal to the pasture in the main entranceway ,,,`,,`,,,,,,,,,,Cw,,H,~,H,,Cw,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,Cf,,`,`,`,,Cf,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,Cw,,,,,,Cw,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,Cw,Cw,Cf,Cw,Cf,Cw,Cw,`,`,,`,`,`,`,`,`,`,,` +,,,`,,`,`,`,`,`,`,`,,`,`,Cw,Cw,Cf,Cw,Cf,Cw,Cw,`,`,,,,,,,,`,,` ,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` @@ -792,7 +722,7 @@ Feel free to assign an unimportant animal to the pasture in the main entranceway ,,,`,,`,,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,d,,`,`,`,,d,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,d,`,d,`,`,`,`,,`,`,`,`,`,`,`,,` +,,,`,,`,`,`,`,`,`,`,,`,`,`,`,d,`,d,`,`,`,`,,,,,,,,`,,` ,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` @@ -825,14 +755,14 @@ Feel free to assign an unimportant animal to the pasture in the main entranceway ,,,`,,`,,`,,,,,,,,`,~,~,~,~,~,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,~,~,~,~,~,~,~,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,`,~,~,~,~,~,`,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,~,~,~,~,~,~,~,Cf,Cf,Cf,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,`,~,~,~,~,~,`,,,Cf,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,~,`,~,`,`,`,`,Cf,`,`,`,`,`,`,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,Cf,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,Cf,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,Cf,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,Cf,`,,` +,,,`,,`,,`,,,,,Cf,Cf,Cf,~,~,~,~,~,~,~,,,,,,,,,,`,,` +,,,`,,`,,`,,,,,Cf,,,`,~,~,~,~,~,`,,,,,,,,,,`,,` +,,,`,,`,`,`,`,`,`,`,Cf,`,`,`,`,~,`,~,`,`,`,`,,,,,,,,`,,` +,,,`,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,,`,,,,,,,,`,,,,,,,,,`,,` +,,,`,,`,Cf,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,Cf,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,Cf,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,Cf,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` ,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,` ,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` @@ -856,24 +786,24 @@ Feel free to assign an unimportant animal to the pasture in the main entranceway ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,,`,,,,,,,,`,Cf,,Cf,,Cf,`,,,,,,,,,,`,,` -,,,`,,`,,Cw,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,,Cf,,,,,,,,`,,`,`,`,,`,,,,,,,,,,`,,` -,,,`,,`,,Cw,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,`,Cf,Cf,Cf,Cf,Cf,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,Cw,Cf,Cw,`,`,`,,`,,`,`,`,Cw,Cf,Cw,`,`,`,`,`,`,,` -,,,`,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,~,,,,,,~,`,,,,,,,Cf,Cf,`,,` -,,,`,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,~,~,Cf,Cf,Cf,Cf,Cf,~,~,,,,,,,,Cf,`,,` -,,,`,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,~,~,,~,~,~,,~,~,,,,,Cf,Cf,,Cf,`,,` -,,,`,,`,,Cf,,Cf,Cf,Cf,Cf,Cf,,Cf,,~,~,~,,Cf,,,Cf,,,,,,Cf,`,,` -,,,`,,`,,Cf,,Cf,Cf,Cf,Cf,Cf,`,,,~,~,~,,,`,,Cf,,,,,Cf,Cf,`,,` +,,,`,,`,,`,,,,,,,,`,Cf,,Cf,,Cf,`,Cf,Cf,,Cf,Cf,Cf,Cf,Cf,,`,,` +,,,`,,`,,Cw,,,,,,,,,,`,`,`,,,Cf,Cf,,Cf,Cf,Cf,Cf,Cf,,`,,` +,,,`,,`,,Cf,,,,,,,,`,,`,`,`,,`,Cf,Cf,,Cf,Cf,Cf,Cf,Cf,,`,,` +,,,`,,`,,Cw,,,,,,,,,,`,`,`,,,Cf,Cf,,Cf,Cf,Cf,Cf,Cf,,`,,` +,,,`,,`,,`,,,,,,,,`,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,,Cf,Cf,Cf,Cf,Cf,,`,,` +,,,`,,`,`,`,`,`,`,Cw,Cf,Cw,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` +,,,`,,`,Cf,Cf,,Cf,Cf,,,,`,~,Cf,Cf,Cf,Cf,Cf,~,`,,,,,,,,,`,,` +,,,`,,`,Cf,,,,,,,,~,~,Cf,Cf,Cf,Cf,Cf,~,~,,,,,,,,,`,,` +,,,`,,`,Cf,,,,,,,,~,~,,~,~,~,,~,~,,,,,,,,,`,,` +,,,`,,`,Cf,,,,,,Cf,,Cf,Cf,,~,~,~,,Cf,Cf,,,,,,,,,`,,` +,,,`,,`,Cf,Cf,,,,,Cf,,`,,,~,~,~,,,`,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` -,,,`,Cf,,,,,,,,,Cf,,,,,~,,,,,Cf,,,,,,,,,Cf,` +,,,`,Cf,Cf,,,,,,,,Cf,Cf,,,,~,,,,Cf,Cf,,,,,,,,Cf,Cf,` ,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` -#place label(surface_place) start(19; 19) hidden() remaining surface stockpiles +#dig label(surface_traffic) start(19; 19) hidden() set traffic designations @@ -890,64 +820,26 @@ Feel free to assign an unimportant animal to the pasture in the main entranceway ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,,`,,,,,,,,`,,,,,,`,a5(9x5),,,,,,,,,`,,` +,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` -,,,`,,`,g(3x3),,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,c,,,,,,,`,,,,,,,,`,,c,,,,,,,`,,` +,,,`,,`,`,`,`,`,`,`,or,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` +,,,`,,`,,,,,,,,or,`,or,or,ol,ol,ol,ol,,`,,,,,,,,,`,,` +,,,`,,`,,,,,,,,or,ol,ol,or,ol,ol,ol,ol,ol,ol,,,,,,,,,`,,` +,,,`,,`,,,,,,,,or,ol,ol,or,,,,,ol,ol,,,,,,,,,`,,` +,,,`,,`,,,,,,,,or,ol,ol,or,,,,,ol,ol,,,,,,,,,`,,` +,,,`,,`,,,,,,,,or,`,or,or,,,,,,`,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` ,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,` -,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` - - - -"#build label(surface_build) start(19; 19) hidden() message(Use autofarm to manage farm crop selection. -Remember to connect the levers to the gates once they are built.) gates, barracks, farm area, and trade area" - - - -,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,~h,`,~,~,N,N,N,N,N,`,Tl,,Tl,,Tl,`,,,,,,,,,,`,,` -,,,`,,`,~h,`,p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,~h,d,p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),`,,`,`,`,,`,,,,,,,,,,`,,` -,,,`,,`,~h,`,p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,~h,`,N,N,N,N,N,N,N,`,Tl,Tl,Tl,Tl,Tl,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,d,`,`,`,`,,`,,`,`,`,`,d,`,`,`,`,`,`,`,,` -,,,`,,`,,,,,,,,,`,,gw,gw,gw,gw,gw,,`,,,,,,,h,b,`,,` -,,,`,,`,,,,,,,,,ga,ga,gw,gw,gw,gw,gw,gd,gd,,,,,,,,b,`,,` -,,,`,,`,,,,,,D,,,ga,ga,,,,,,gd,gd,,,,,a,r,,b,`,,` -,,,`,,`,,trackstopS,,,,,,,ga,ga,,,,,,gd,gd,,trackstopS,,,,,,b,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,h,b,`,,` -,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` -,,,`,gd,gd,,,,,,,,gd,gd,,,,,,,,ga,ga,,,,,,,,ga,ga,` -,,,`,`,`,`,`,`,`,`,`,`,`,`,gw,gw,gw,gw,gw,gw,gw,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,gw,gw,gw,gw,gw,gw,gw -,,,,,,,,,,,,,,,gw,gw,gw,gw,gw,gw,gw - -#aliases -"prisoner_route_enable: {enableanimals}{cages}{permittraps}{animalsprefix}{Right}{permitsearch search="" men""}{permitsearch search=dwarves}{permitsearch search=elves}{permitsearch search=humans}{permitsearch search=kobolds}{permitsearch search=gremlins}{permitsearch search=giants}{permitsearch search=goblins}{permitsearch search=ettins}{permitsearch search=cyclopes}{permitsearch search=ogres}{permitsearch search=eyes}{permitsearch search=reachers}{permitsearch search=gorlaks}{permitsearch search=trolls}{permitsearch search=minotaurs}^" +,,,`,`,`,`,`,`,`,`,`,`,`,`,ol,ol,ol,ol,ol,ol,ol,`,`,`,`,`,`,`,`,`,`,`,` +,,,,,,,,,,,,,,,ol,ol,ol,ol,ol,ol,ol +,,,,,,,,,,,,,,,ol,ol,ol,ol,ol,ol,ol -"#query label(surface_query) start(19; 19) hidden() message(Remember to assign minecarts to the trade goods and prisoner processing quantum stockpiles (run ""assign-minecarts all""). +"#place label(surface_place) start(19; 19) hidden() message(Remember to assign minecarts to the trade goods and prisoner processing quantum stockpiles (run ""assign-minecarts all""). Feel free to adjust the configuration of the ""trade goods"" feeder stockpile so it accepts the item types you want to trade away. If those items types are also accepted by other stockpiles, configure those stockpiles to give to the ""trade goods"" stockpile. -You might also want to set the ""trade goods quantum"" stockpile to Auto Trade if you have the autotrade DFHack plugin enabled.)" +You might also want to set the ""trade goods quantum"" stockpile to autotrade.) remaining surface stockpiles" @@ -958,30 +850,32 @@ You might also want to set the ""trade goods quantum"" stockpile to Auto Trade i ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,,,,,,,,,,,,,,,,,"a{name=""Pets/Prisoner feeder""}(9x5)",,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,,`,,,,,,,,`,"{givename name=""trade depo gate""}",,"{givename name=""inner main gate""}",,"{givename name=""barracks gate""}",`,"{givename name=""prison/training area""}",,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` +,,,`,,`,,`,,,,,,,,`,,,,,,`,,"c{name=""Organic trade goods quantum"" quantum=true}:+all",,,,,,,,`,,` +,,,`,,`,,`,,,,,,,,,,`,`,`,,,"g{name=""Trade goods"" containers=0}:-cat_finished_goods/type/,core/artifact+crafts(2x3)",,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,`,"{givename name=""left outer gate""}","{givename name=""left inner gate""}","{givename name=""outer main gate""}","{givename name=""right inner gate""}","{givename name=""right outer gate""}",`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` -,,,`,,`,nocontainers,crafts,,,,,,,`,,,,"{givename name=""inner main gate""}",,,,`,,,,,,,,,`,,` -,,,`,,`,"{givename name=""trade goods""}",,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,{forbidmasterworkfinishedgoods}{forbidartifactfinishedgoods},,,,,,,,"{givename name=""trade depo gate""}",,,,,,,,"{givename name=""barracks gate""}",,,,,,,,,`,,` -,,,`,,`,,"{quantumstopfromnorth name=""Trade Goods quantum""}",,,,,,,,,,,,,,,,,"{quantumstop name=""Prisoner/Cage quantum"" move={Up 5} move_back={Down 5} route_enable={prisoner_route_enable}}{givename name=""prisoner/cage dumper""}",,,,,,,`,,` -,,,`,,`,,"{quantum name=""trade goods quantum""}",,,,,,,`,,,,,,,,`,,"{quantum name=""prisoner/cage quantum"" quantum_enable={enableanimals}}",,,,,,,`,,` +,,,`,,`,,`,,,,,,,,`,,,,,,`,,"c{name=""Inorganic trade goods quantum"" quantum=true}:+all-organic",,,,,,,,`,,` +,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` +,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` +,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,,,,,,,"a{name=""Prisoner/cage quantum"" quantum=true}",,`,,,,,,,,`,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,"{givename name=""left outer gate""}",,,,,,,,,"{givename name=""left inner gate""}",,,,,,,,"{givename name=""right inner gate""}",,,,,,,,,"{givename name=""right outer gate""}",,` -,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,"{givename name=""outer main gate""}",,,,`,`,`,`,`,`,`,`,`,`,`,` +,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,` +,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` -#dig label(surface_traffic) start(19; 19) hidden() set traffic designations +#aliases +"#build label(surface_build) start(19; 19) hidden() message(Use autofarm to manage farm crop selection. +Remember to connect the levers to the gates once they are built.) gates, barracks, farm area, and trade area" @@ -998,22 +892,22 @@ You might also want to set the ""trade goods quantum"" stockpile to Auto Trade i ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,or,`,`,`,`,`,`,`,,` -,,,`,,`,,,,,,,,,`,,ol,ol,ol,ol,ol,,`,or,,,,,,,,`,,` -,,,`,,`,,,,,,,,,ol,ol,ol,ol,ol,ol,ol,ol,ol,or,,,,,,,,`,,` -,,,`,,`,,,,,,,,,ol,ol,,,,,,ol,ol,or,,,,,,,,`,,` -,,,`,,`,,,,,,,,,ol,ol,,,,,,ol,ol,or,,,,,,,,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,or,,,,,,,,`,,` +,,,`,,`,~h{do_install=true do_gather=true}(1x1),`,~,~,N,N,N,N,N,`,"Tl{name=""Barracks gate""}",,"Tl{name=""Inner main gate""}",,"Tl{name=""Trade depo gate""}",`,"trackstopE{name=""Organic trade goods dumper"" take_from=""Trade goods"" route=""Organic trade goods quantum""}",,,~,~,~,~,~,,`,,` +,,,`,,`,~h{do_install=true do_gather=true}(1x1),`,p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),,,`,`,`,,,,,,~,~,~,~,~,,`,,` +,,,`,,`,"~h{name=""reserved for splitting"" do_install=true}(1x1)",d,p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),`,,`,`,`,,`,,,,~,~,D,~,~,,`,,` +,,,`,,`,~h{do_install=true do_gather=true}(1x1),`,p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),,,`,`,`,,,,,,~,~,~,~,~,,`,,` +,,,`,,`,~h{do_install=true do_gather=true}(1x1),`,N,N,N,N,N,N,N,`,"Tl{name=""Left outer gate""}(1x1)","Tl{name=""Left inner gate""}(1x1)","Tl{name=""Outer main gate""}(1x1)","Tl{name=""Right inner gate""}(1x1)","Tl{name=""Right outer gate""}(1x1)",`,"trackstopE{name=""Inorganic trade goods dumper"" take_from=""Trade goods,Organic trade goods quantum"" route=""Inorganic trade goods quantum""}:-organic",,,~,~,~,~,~,,`,,` +,,,`,,`,`,`,`,`,`,`,d,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` +,,,`,,`,b,h,,a,r,,,,`,,"gw{name=""Inner main gate""}",gw,gw,gw,gw,,`,,,,,,,,,`,,` +,,,`,,`,b,,,,,,,,"ga{name=""Barracks gate""}",ga,gw,gw,gw,gw,gw,"gd{name=""Trade depo gate""}",gd,,,,,,,,,`,,` +,,,`,,`,b,,,,,,,,ga,ga,,,,,,gd,gd,,,,,,,,,`,,` +,,,`,,`,b,,,,,,"trackstopS{name=""Prisoner/cage dumper"" take_from=""Pets/Prisoner feeder"" route=""Prisoner/cage quantum""}:-cat_animals/tameable",,ga,ga,,,,,,gd,gd,,,,,,,,,`,,` +,,,`,,`,b,h,,,,,,,`,,,,,,,,`,s,,s,,,s,,s,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,` -,,,`,`,`,`,`,`,`,`,`,`,`,`,ol,ol,ol,ol,ol,ol,ol,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,ol,ol,ol,ol,ol,ol,ol -,,,,,,,,,,,,,,,ol,ol,ol,ol,ol,ol,ol +,,,`,"gd{name=""Left outer gate""}",gd,,,,,,,,"gd{name=""Left inner gate""}",gd,,,,,,,,"ga{name=""Right inner gate""}",ga,,,,,,,,"ga{name=""Right outer gate""}",ga,` +,,,`,`,`,`,`,`,`,`,`,`,`,`,"gw{name=""Outer main gate""}",gw,gw,gw,gw,gw,gw,`,`,`,`,`,`,`,`,`,`,`,` +,,,,,,,,,,,,,,,gw,gw,gw,gw,gw,gw,gw +,,,,,,,,,,,,,,,gw,gw,gw,gw,gw,gw,gw #dig label(surface_clear_large) start(19; 19) hidden() clear wider area of trees t1(37x33) @@ -1031,51 +925,17 @@ t1(37x33) ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,`,`,,`,`,,` +,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` ,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,`,,`,~,`,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` ,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,` -,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` - - - -#query label(surface_query2) start(19; 19) hidden() - - - -,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,cg,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,cg,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,c,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,`,,` -,,,`,,`,cg,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,cg,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,r&,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` ,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,` @@ -1105,7 +965,7 @@ t1(37x33) ,,,`,,Cw,,,,,,,,,,~,,`,`,`,,~,,,,,,,,,,Cw,,` ,,,`,,Cw,,~,,,,,,,,,,`,`,`,,,,,,,,,,,,Cw,,` ,,,`,,Cw,,Cw,,,,,,,,~,,,,,,~,,,,,,,,,,Cw,,` -,,,`,,Cw,Cw,Cw,Cw,Cw,Cw,~,,~,Cw,~,~,,~,,~,~,Cw,~,,~,Cw,Cw,Cw,Cw,Cw,Cw,,` +,,,`,,Cw,Cw,Cw,Cw,Cw,Cw,~,,~,Cw,~,~,,~,,~,~,Cw,Cw,,,,,,,,Cw,,` ,,,`,,Cw,,,,,,,,,Cw,,,,,,,,Cw,,,,,,,,,Cw,,` ,,,`,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,Cw,,` ,,,`,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,Cw,,` @@ -1134,17 +994,17 @@ t1(37x33) ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,~,`,~,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,,`,,,,,,,,`,~,Cf,~,Cf,~,`,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,~,Cf,Cf,Cf,Cf,Cf,~,,,,,,,,,,`,,` -,,,`,,`,,~,,,,,,,,`,Cf,`,Cf,`,Cf,`,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,~,Cf,Cf,Cf,Cf,Cf,~,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,`,~,~,~,~,~,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,~,`,`,`,`,~,`,~,`,`,`,`,~,`,`,`,`,`,`,`,,` -,,,`,,`,~,~,~,~,~,~,~,~,`,~,~,~,~,~,~,~,`,Cf,Cf,Cf,Cf,Cf,Cf,~,~,`,,` -,,,`,,`,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,Cf,Cf,Cf,Cf,Cf,Cf,Cf,~,`,,` -,,,`,,`,~,~,~,~,~,~,~,~,~,~,Cf,~,~,~,Cf,~,~,Cf,Cf,Cf,Cf,~,~,Cf,~,`,,` -,,,`,,`,Cf,~,Cf,~,~,~,~,~,~,~,Cf,~,~,~,Cf,~,~,Cf,~,Cf,Cf,Cf,Cf,Cf,~,`,,` -,,,`,,`,Cf,~,Cf,~,~,~,~,~,`,Cf,Cf,~,~,~,Cf,Cf,`,Cf,~,Cf,Cf,Cf,Cf,~,~,`,,` +,,,`,,`,,`,,,,,,,,`,~,Cf,~,Cf,~,`,~,~,Cf,~,~,~,~,~,Cf,`,,` +,,,`,,`,,`,,,,,,,,~,Cf,Cf,Cf,Cf,Cf,~,~,~,Cf,~,~,~,~,~,Cf,`,,` +,,,`,,`,,~,,,,,,,,`,Cf,`,Cf,`,Cf,`,~,~,Cf,~,~,~,~,~,Cf,`,,` +,,,`,,`,,`,,,,,,,,~,Cf,Cf,Cf,Cf,Cf,~,~,~,Cf,~,~,~,~,~,Cf,`,,` +,,,`,,`,,`,,,,,,,,`,~,~,~,~,~,`,~,~,Cf,~,~,~,~,~,Cf,`,,` +,,,`,,`,`,`,`,`,`,`,~,`,`,`,`,~,`,~,`,`,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` +,,,`,,`,~,~,Cf,~,~,Cf,Cf,Cf,`,~,~,~,~,~,~,~,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` +,,,`,,`,~,Cf,Cf,Cf,Cf,Cf,Cf,Cf,~,~,~,~,~,~,~,~,~,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` +,,,`,,`,~,Cf,Cf,Cf,Cf,Cf,Cf,Cf,~,~,Cf,~,~,~,Cf,~,~,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` +,,,`,,`,~,Cf,Cf,Cf,Cf,Cf,~,Cf,~,~,Cf,~,~,~,Cf,~,~,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` +,,,`,,`,~,~,Cf,Cf,Cf,Cf,~,Cf,`,Cf,Cf,~,~,~,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,`,`,`,`,`,`,`,`,`,,` ,,,`,~,,,,,,,,,,,Cf,Cf,Cf,~,Cf,Cf,Cf,,,,,,,,,,,~,` ,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` @@ -1153,8 +1013,8 @@ t1(37x33) #build label(surface_traps) start(19; 19) hidden() -,,,,,Tc,Tc,,,,,,,,,,,,,,,,,,,,,,,,Tc,Tc -,,,,,Tc,Tc,,,,,,,,,,,,,,,,,,,,,,,,Tc,Tc +,,,,,Tc,,,,,,,,,,,,,,,,,,,,,,,,,,Tc +,,,,,Tc,,,,,,,,,,,,,,,,,,,,,,,,,,Tc ,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` @@ -1173,7 +1033,7 @@ t1(37x33) ,,,`,,`,,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` +,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` ,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` @@ -1205,14 +1065,14 @@ t1(37x33) ,,,`,,`,,`,,,,,,,,`,~,~,~,~,~,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,~,~,~,~,~,~,~,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,`,~,~,~,~,~,`,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,~,~,~,~,~,~,~,~,~,~,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,`,~,~,~,~,~,`,,,~,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,~,`,~,`,`,`,`,~,`,`,`,`,`,`,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,~,~,~,~,~,~,~,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,~,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,~,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,~,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,~,`,,` +,,,`,,`,,`,,,,,~,~,~,~,~,~,~,~,~,~,,,,,,,,,,`,,` +,,,`,,`,,`,,,,,~,,,`,~,~,~,~,~,`,,,,,,,,,,`,,` +,,,`,,`,`,`,`,`,`,`,~,`,`,`,`,~,`,~,`,`,`,`,,,,,,,,`,,` +,,,`,,`,~,~,~,~,~,~,~,,`,,,,,,,,`,,,,,,,,,`,,` +,,,`,,`,~,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,~,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,~,,,,,,,,,,,,,,,,,,,,,,,,,`,,` +,,,`,,`,~,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` ,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,` ,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` @@ -1239,14 +1099,14 @@ t1(37x33) ,,,`,,`,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,~,~,~,~,~,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` ,,,`,,`,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,~,~,~,~,~,~,~,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` ,,,`,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,~,~,~,~,~,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` -,,,`,,`,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,~,~,~,~,~,~,~,~,~,~,Cf,Cf,Cf,Cf,Cf,Cf,`,,` -,,,`,,`,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,~,~,~,~,~,`,Cf,Cf,~,Cf,Cf,Cf,Cf,Cf,Cf,`,,` -,,,`,,`,`,`,`,`,`,`,Cf,`,`,`,`,~,`,~,`,`,`,`,~,`,`,`,`,`,`,`,,` -,,,`,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,~,~,~,~,~,~,~,`,,` -,,,`,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,~,`,,` -,,,`,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,~,`,,` -,,,`,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,~,`,,` -,,,`,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,~,`,,` +,,,`,,`,Cf,`,Cf,Cf,Cf,Cf,~,~,~,~,~,~,~,~,~,~,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` +,,,`,,`,Cf,`,Cf,Cf,Cf,Cf,~,Cf,Cf,`,~,~,~,~,~,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` +,,,`,,`,`,`,`,`,`,`,~,`,`,`,`,~,`,~,`,`,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` +,,,`,,`,~,~,~,~,~,~,~,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` +,,,`,,`,~,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` +,,,`,,`,~,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` +,,,`,,`,~,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` +,,,`,,`,~,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,,` ,,,`,,`,`,`,`,`,`,`,`,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,`,`,`,`,`,`,`,`,`,,` ,,,`,,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,,` ,,,`,`,`,`,`,`,`,`,`,`,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,`,`,`,`,`,`,`,`,`,`,` @@ -1275,7 +1135,7 @@ t1(37x33) ,,,`,,`,~,~,~,~,~,~,~,~,~,`,~,~,~,~,~,`,~,~,~,~,~,~,~,~,~,`,,` ,,,`,,`,~,`,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,`,,` ,,,`,,`,~,`,~,~,~,~,~,~,~,`,~,~,~,~,~,`,~,~,~,~,~,~,~,~,~,`,,` -,,,`,,`,`,`,`,`,`,`,~,`,`,`,`,~,`,~,`,`,`,`,~,`,`,`,`,`,`,`,,` +,,,`,,`,`,`,`,`,`,`,~,`,`,`,`,~,`,~,`,`,`,`,~,~,~,~,~,~,~,`,,` ,,,`,,`,~,~,~,~,~,~,~,~,`,~,~,~,~,~,~,~,`,~,~,~,~,~,~,~,~,`,,` ,,,`,,`,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,`,,` ,,,`,,`,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,`,,` @@ -1309,7 +1169,7 @@ t1(37x33) ,,,`,,`,~,~,~,~,~,~,~,~,~,`,~,~,~,~,~,`,~,~,~,~,~,~,~,~,~,`,,` ,,,`,,`,~,`,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,`,,` ,,,`,,`,~,`,~,~,~,~,~,~,~,`,~,~,~,~,~,`,~,~,~,~,~,~,~,~,~,`,,` -,,,`,,`,`,`,`,`,`,`,~,`,`,`,`,~,`,~,`,`,`,`,~,`,`,`,`,`,`,`,,` +,,,`,,`,`,`,`,`,`,`,~,`,`,`,`,~,`,~,`,`,`,`,~,~,~,~,~,~,~,`,,` ,,,`,,`,~,~,~,~,~,~,~,~,`,~,~,~,~,~,~,~,`,~,~,~,~,~,~,~,~,`,,` ,,,`,,`,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,`,,` ,,,`,,`,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,`,,` @@ -1321,10 +1181,10 @@ t1(37x33) -#build label(surface_corridor_gates) start(19; 19) hidden() gates for the longer trap hallways +#build label(surface_corridor_gates) start(19; 19) hidden() message(Remember to connect the levers to the new external trap gates.) gates for the longer trap hallways -,,,,gx,,,,,,,,,,,,,,,,,,,,,,,,,,,,gx +,,,,"gx{name=""Left trap gate""}",,,,,,,,,,,,,,,,,,,,,,,,,,,,"gx{name=""Right trap gate""}" ,,,`,gx,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,gx,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` @@ -1340,10 +1200,10 @@ t1(37x33) ,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` ,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,`,Tl,`,`,`,Tl,`,,,,,,,,,,`,,` +,,,`,,`,,,,,,,,,,`,"Tl{name=""Left trap gate""}",`,`,`,"Tl{name=""Right trap gate""}",`,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` ,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` +,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,` ,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` ,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` @@ -1377,7 +1237,7 @@ t1(37x33) ,,,Cw,,`,,,,,,,,,,`,~,`,`,`,~,`,,,,,,,,,,`,,Cw ,,,Cw,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,Cw ,,,Cw,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,Cw -,,,Cw,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,Cw +,,,Cw,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,,Cw ,,,Cw,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,Cw ,,,Cw,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,Cw ,,,Cw,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,Cw @@ -1411,7 +1271,7 @@ t1(37x33) ,,,`,Cf,`,~,~,~,~,~,~,~,~,~,`,~,~,~,~,~,`,~,~,~,~,~,~,~,~,~,`,Cf,` ,,,`,Cf,`,~,`,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,`,Cf,` ,,,`,Cf,`,~,`,~,~,~,~,~,~,~,`,~,~,~,~,~,`,~,~,~,~,~,~,~,~,~,`,Cf,` -,,,`,Cf,`,`,`,`,`,`,`,~,`,`,`,`,~,`,~,`,`,`,`,~,`,`,`,`,`,`,`,Cf,` +,,,`,Cf,`,`,`,`,`,`,`,~,`,`,`,`,~,`,~,`,`,`,`,~,~,~,~,~,~,~,`,Cf,` ,,,`,Cf,`,~,~,~,~,~,~,~,~,`,~,~,~,~,~,~,~,`,~,~,~,~,~,~,~,~,`,Cf,` ,,,`,Cf,`,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,`,Cf,` ,,,`,Cf,`,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,`,Cf,` @@ -1426,8 +1286,8 @@ t1(37x33) #build label(surface_corridor_traps) start(19; 19) hidden() traps for the longer trap hallways -,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~ -,,,`,~,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,~,` +,,Tc,Tc,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,Tc,Tc +,,Tc,`,~,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,~,`,Tc ,,,`,Tc,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,Tc,` ,,,`,Tc,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,Tc,` ,,,`,Tc,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,Tc,` @@ -1445,7 +1305,7 @@ t1(37x33) ,,,`,Tc,`,,,,,,,,,,`,~,`,`,`,~,`,,,,,,,,,,`,Tc,` ,,,`,Tc,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,Tc,` ,,,`,Tc,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,Tc,` -,,,`,Tc,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,Tc,` +,,,`,Tc,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,,,,,,,`,Tc,` ,,,`,Tc,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,Tc,` ,,,`,Tc,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,Tc,` ,,,`,Tc,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,Tc,` @@ -1453,42 +1313,8 @@ t1(37x33) ,,,`,Tc,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,Tc,` ,,,`,Tc,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,Tc,` ,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,` -,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` - - - -#query label(surface_query_corridor) start(19; 19) hidden() (Remember to connect the levers to the new external trap gates.) configure barracks and name outer levers/gates - - - -,,,`,"{givename name=""left trap gate""}",`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,"{givename name=""right trap gate""}",` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,`,"{givename name=""left trap gate""}",`,`,`,"{givename name=""right trap gate""}",`,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,,,`,`,`,,,,,,,,,,,,`,,` -,,,`,,`,,`,,,,,,,,`,,,,,,`,,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,,,,,,,,,,,,,,,,,,`,,` -,,,`,,`,,,,,,,,,`,,,,,,,,`,,,,,,,,,`,,` -,,,`,,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,,` -,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,` -,,,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` - +,,Tc,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,Tc +,,Tc,Tc,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Tc,Tc #notes label(farming_help) @@ -1497,7 +1323,7 @@ Screenshot: https://drive.google.com/file/d/1fBC3G5Y888l4tVe5REAyAd_zeojADVme "" Features: - Pairs with the surface blueprints for vents that prevent miasma -- Farm plots (intended to be managed by DFHack autofarm) +- Farm plots (can be managed by DFHack autofarm) - Plentiful food storage - Refuse/corpse quantum stockpile - Small dormitory and dining room for post-embark needs @@ -1514,25 +1340,21 @@ Workshops: - Screw Press "" Manual steps you have to take: -- Check to make sure the lower office is assigned to your manager and assign the upper office to your bookkeeper (if different from your manager) "- Assign a minecart to your refuse quantum stockpile hauling route (you can run ""assign-minecarts all"" at the DFHack prompt to do this)" -"- If the industry level is already built, configure the jugs, pots, and bags stockpiles to take from the ""Goods"" quantum stockpile (the one on the left) on the industry level" "" Farming Walkthrough: "1) Wait until you have channeled the miasma vents and cleared trees on the surface before digging out the farming level on the z-level below the surface, otherwise you will end up with extra ramps on the farming level and unprotected holes through the surface when you later chop down trees growing above empty space." "" -"2) Start digging with /farming1 and get started on manufacturing furniture by running ""quickfort orders"" on /farming2 and /farming3." +"2) Start digging with /farming1 and get started on manufacturing furniture by running ""quickfort orders"" on /farming2" "" -"3) Once the level is dug out, run /farming2 to build workshops, stockpiles, and the furniture we need to anchor the rooms. Remember to assign a minecart to the newly-designated quantum refuse dump. There are also jugs, pots, and bags stockpiles on this level that should be configured to ""take"" from the industry level stockpile once we get the industry level built." +"3) Once the level is dug out, run /farming2 to designate zones, build workshops and stockpiles, and place furniture. Remember to assign a minecart to the newly-designated quantum refuse dump." "" -"4) When the furniture is in place, run /farming3 to designate your starter dining room and dormitory and build the farm plots and remaining furniture. The blueprint also attempts to assign the lower office to your manager, but double-check this assignment in case your dwarves are in an unexpected order." +"4) Once your fort has enough free time to build the remaining doors, run /farming3. Run ""quickfort orders"" for /farming3." "" -"5) Once your fort has enough free time to build the remaining doors, run /farming4. This will also enable seasonal fertilization for your farm plots. Run ""quickfort orders"" for /farming4." -"" -"6) You can disassemble the dining room and dormitory once the services and apartments levels are up and running, if you like." +"5) You can disassemble the dining room and dormitory once the services and apartments levels are up and running, if you like." "#dig label(farming1) start(16; 18; central stairs) message(Once the area is dug out, continue with /farming2.)" -# this level is dug at priority 2 since it is dug in soil. it's worth the miner's time to stop digging the industry level and -# quickly dig out this one. +# this level is dug at priority 2 since it is dug in soil. it's worth the miner's time to +# stop digging the industry level and quickly dig out this one. ,,,,,,,,,2,2,2,,2,2,2,2,2,,2,2,2,2 ,,,,,,,,,2,2,2,,2,2,2,2,2,,2,2,2,2 ,,,,,,,,,2,2,2,,2,2,2,2,2,,2,2,2,2 @@ -1563,35 +1385,29 @@ Farming Walkthrough: "#meta label(farming2) start(central stairs) message(Remember to enqueue manager orders for this blueprint. Once furniture has been placed, continue with /farming3.) workshops, stockpiles, and important furniture" -build/farming_build +zone/farming_zone place/farming_place +build/farming_build traffic/farming_traffic -query_stockpiles/farming_query_stockpiles -link_stockpiles/farming_link -"" -#meta label(farming3) start(central stairs) message(Remember to enqueue manager orders for this blueprint.) configure rooms and build farm plots and more furniture -query_rooms/farming_rooms -build2/farming_build2 "" -#meta label(farming4) start(central stairs) message(Remember to enqueue manager orders for this blueprint.) configure farm plots and build remaining furniture -query_plots/farming_query_plots -build3/farming_build3 -#build label(farming_build) start(16; 18) hidden() workshops and important furniture +#meta label(farming3) start(central stairs) message(Remember to enqueue manager orders for this blueprint.) build remaining doors +doors/farming_doors +#zone label(farming_zone) start(16; 18) hidden() rooms -,,,,,,,,,`,`,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,,,c,t,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,,,`,`,`,,`,`,`,`,`,,`,`,t,c +,,,,,,,,,T{pets=true}(1x1),`,`,,`,`,`,`,`,,"h{name=""Starter dining hall""}(4x6)",,,` +,,,,,,,,,T{pets=true}(1x1),`,`,,`,`,`,`,`,,`,`,`,` +,,,,,,,,,T{pets=true}(1x1),`,`,,`,`,`,`,`,,`,`,`,` ,,,,,,,,,,,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,`,`,`,,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,c,t,`,`,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,`,`,`,,`,,`,`,`,`,`,,` -,,,,,,,,,,,`,,`,`,`,`,`,,`,,`,`,b +,,,,,,,"o{name=""Manager's office"" assigned_unit=manager}(3x1)",,`,,`,,`,`,`,`,`,,`,`,`,` +,,,,,,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,` +,,,,,,,"o{name=""Bookkeeper's office"" assigned_unit=bookkeeper}(3x1)",,`,,`,,`,`,`,`,`,,` +,,,,,,,,,,,`,,`,`,`,`,`,,`,,"D{name=""Starter dormitory""}(3x3)",,` ,,,,,,`,`,`,`,,`,,`,`,`,`,`,,`,`,`,`,` -,,,,,,`,wl,`,`,,`,,`,`,`,`,`,,`,,`,`,` +,,,,,,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,` ,,,`,`,,`,`,`,`,,`,,`,`,`,`,`,,` -,,wq,`,`,,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,,`,`,` -,,wp,`,`,`,`,ww,`,`,`,`,,,`,,`,,,`,`,`,wu,`,`,`,wz,` +,,`,`,`,,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,,`,`,` +,,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,` ,,,`,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,` ,,,,`,,,`,,,,,,`,`,`,`,`,,,,,`,,,,` ,,`,`,`,`,`,`,`,`,`,`,,`,`,~,`,`,,`,`,`,`,`,`,`,`,`,` @@ -1602,40 +1418,71 @@ build3/farming_build3 ,,`,`,`,`,`,`,`,`,,`,`,,,`,,,`,`,,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,,`,`,,`,`,`,,`,`,,,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,wh,`,,`,`,`,,`,wn,`,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,,trackstopS,,,`,`,`,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,`,`,`,,,`,,,`,`,`,,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,` -#place label(farming_place) start(16; 18) hidden() stockpiles +"#place label(farming_place) start(16; 18) hidden() message(remember to assign a minecart to the refuse quantum stockpile (run ""assign-minecarts all"")" -,,,,,,,,,`,`,`,,`,`,`,f10(1x9),b(1x12),,f(4x2),,,` +,,,,,,,,,`,`,`,,`,`,`,"c{name=""Seeds"" barrels=10 links_only=true take_from=""Starting food""}:+seeds(1x9)","c{name=""Potash""}:+potash(1x12)",,"c{name=""booze"" barrels=-1 take_from=""Starting food""}:+booze(4x2)",,,` ,,,,,,,,,`,`,`,,`,`,`,`,`,,`,`,`,` ,,,,,,,,,`,`,`,,`,`,`,`,`,,`,`,`,` ,,,,,,,,,,,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,`,`,`,,`,,`,`,`,`,`,,`,f(3x2),,` +,,,,,,,`,`,`,,`,,`,`,`,`,`,,`,"c{name=""Prepared food"" take_from=""Starting food""}:+preparedmeals(3x2)",,` ,,,,,,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,` ,,,,,,,`,`,`,,`,,`,`,`,`,`,,` ,,,,,,,,,,,`,,`,`,`,`,`,,`,,`,`,` -,,,,,,`,`,`,u,,`,,`,`,`,`,`,,`,`,`,`,` -,,,,,,`,`,`,u,,`,,f(4x3),,,`,`,,`,,`,`,` -,,,u,u,,`,`,`,u,,`,,`,`,`,`,`,,` -,,`,u,u,,`,`,`,u,,`,,`,`,`,`,`,,`,,`,`,`,,`,`,` -,,`,g,g,`,`,`,`,u,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,` -,,,g,g,,`,`,`,u,,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,` +,,,,,,`,`,`,"u{name=""Pots"" take_from=""Starting misc""}:-cat_furniture/type+pots(1x4)",,`,,`,`,`,`,`,,`,`,`,`,` +,,,,,,`,`,`,~,,`,,"c{name=""Seeds feeder"" give_to=""Seeds"" take_from=""Starting food""}:+seeds(4x3)",,,,`,,`,,`,`,` +,,,"u{name=""Bags"" take_from=""Starting misc""}:-cat_furniture/type+bags(2x2)",~,,`,`,`,~,,`,,`,`,`,`,`,,` +,,`,~,~,,`,`,`,~,,`,,`,`,`,`,`,,`,,`,`,`,,`,`,` +,,`,"c{name=""Jugs"" take_from=""Starting misc""}:+cat_finished_goods/core,total+woodtools(2x2)",~,`,`,`,`,"u{name=""Barrels"" take_from=""Starting misc,Starting food""}:-cat_furniture/type+barrels(1x2)",`,`,,,`,,`,,,`,`,`,`,`,`,`,`,` +,,,~,~,,`,`,`,~,,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,` +,,,,`,,,`,,,,,,`,`,`,`,`,,,,,`,,,,` +,,"c{name=""Plants"" barrels=-1 take_from=""Starting food""}:+plants",c,c,c,c,c,c,c,c,c,,`,`,~,`,`,,"c{name=""Cookable food"" barrels=-1 take_from=""Starting food""}:+cat_food/meat/,fish/prepared/,egg/,cheese/,leaves/,powder/,glob/,liquid/plant/,paste/,pressed/,milk,royal_jelly-dye-cat_food/tallow,thread,liquid/misc/",c,c,c,c,c,c,c,c,c +,,c,c,c,c,c,c,c,c,c,c,`,`,`,`,`,`,`,c,c,c,c,c,c,c,c,c,c +,,c,c,c,c,c,c,c,c,c,c,,`,`,`,`,`,,c,c,c,c,c,c,c,c,c,c +,,c,c,c,c,c,c,c,c,c,,,,`,,`,,,,c,c,c,c,c,c,c,c,c +,,c,c,c,c,c,c,c,c,,,c,`,`,`,`,`,c,,,c,c,c,c,c,c,c,c +,,c,c,c,c,c,c,c,c,,"c{name=""Unprepared fish"" take_from=""Starting food""}:+unpreparedfish",c,,,`,,,"c{name=""Rawhides"" take_from=""Starting cloth/trash""}:+rawhides",c,,c,c,c,c,c,c,c,c +,,c,c,c,c,c,c,c,,,c,c,,"c{name=""Refuse feeder"" give_to=""Rawhides"" take_from=""Starting cloth/trash""}:+cat_refuse/type(1x3)","y{name=""Corpse feeder"" take_from=""Starting cloth/trash""}:+cat_refuse/corpses,bodyparts(2x3)",~,,c,c,,,c,c,c,c,c,c,c +,,c,c,c,c,c,c,c,,`,`,`,,~,~,~,,`,`,`,,c,c,c,c,c,c,c +,,c,c,c,c,c,c,c,,`,`,`,,~,~,~,,`,`,`,,c,c,c,c,c,c,c +,,c,c,c,c,c,c,c,,`,`,`,,,`,,,`,`,`,,c,c,c,c,c,c,c +,,,,,,,,,,,,,,,"ry{name=""Refuse/corpse quantum"" give_to=""Rawhides"" quantum=true}" + + +#build label(farming_build) start(16; 18) hidden() workshops and important furniture + + +,,,,,,,,,n,`,`,,p{seasonal_fertilize=true}(3x1),,,`,`,,`,`,`,` +,,,,,,,,,n,`,`,,p{seasonal_fertilize=true}(3x1),,,`,`,,`,`,`,` +,,,,,,,,,n,`,`,,p{seasonal_fertilize=true}(3x1),,,`,`,,c,t,t,c +,,,,,,,,,,,`,,p{seasonal_fertilize=true}(3x1),,,`,`,,c,t,t,c +,,,,,,,t,c,`,,`,,p{seasonal_fertilize=true}(3x1),,,`,`,,`,`,`,` +,,,,,,,`,`,`,`,`,,p{seasonal_fertilize=true}(3x1),,,`,`,,`,`,`,` +,,,,,,,t,c,`,,`,,p{seasonal_fertilize=true}(3x1),,,`,`,,` +,,,,,,,,,,,`,,p{seasonal_fertilize=true}(3x1),,,`,`,,`,,b,b,b +,,,,,,`,`,`,`,,`,,p{seasonal_fertilize=true}(3x1),,,`,`,,`,`,`,`,h +,,,,,,`,wl,`,`,,`,,`,`,`,`,`,,`,,b,b,b +,,,`,`,,`,`,`,`,,`,,`,`,`,`,`,,` +,,wq,`,`,,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,,`,`,` +,,wp,`,`,`,`,ww,`,`,`,`,,,`,,`,,,`,`,`,wu,`,`,`,wz,` +,,,`,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,` ,,,,`,,,`,,,,,,`,`,`,`,`,,,,,`,,,,` -,,f,f,f,f,f,f,f,f,f,f,,`,`,~,`,`,,f,f,f,f,f,f,f,f,f,f -,,f,f,f,f,f,f,f,f,f,f,`,`,`,`,`,`,`,f,f,f,f,f,f,f,f,f,f -,,f,f,f,f,f,f,f,f,f,f,,`,`,`,`,`,,f,f,f,f,f,f,f,f,f,f -,,f,f,f,f,f,f,f,f,f,,,,`,,`,,,,f,f,f,f,f,f,f,f,f -,,f,f,f,f,f,f,f,f,,,f,`,`,`,`,`,r,,,f,f,f,f,f,f,f,f -,,f,f,f,f,f,f,f,f,,f,f,,,`,,,r,r,,f,f,f,f,f,f,f,f -,,f,f,f,f,f,f,f,,,f,f,,r(2x3),,ry2(1x3),,r,r,,,f,f,f,f,f,f,f -,,f,f,f,f,f,f,f,,`,`,`,,`,`,`,,`,`,`,,f,f,f,f,f,f,f -,,f,f,f,f,f,f,f,,`,`,`,,`,`,`,,`,`,`,,f,f,f,f,f,f,f -,,f,f,f,f,f,f,f,,`,`,`,,,`,,,`,`,`,,f,f,f,f,f,f,f -,,,,,,,,,,,,,,,ry +,,`,`,`,`,`,`,`,`,`,`,,`,`,~,`,`,,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,,,,`,,`,,,,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,,,`,d,`,`,`,d,`,,,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,,`,`,,,d,,,`,`,,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,`,`,,`,`,`,,`,`,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,`,wh,`,,`,`,`,,`,wn,`,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,`,`,`,,,"trackstopS{name=""Refuse/corpse dumper"" take_from=""Refuse feeder,Corpse feeder"" route=""Refuse/corpse quantum""}",,,`,`,`,,`,`,`,`,`,`,` +,,,,,,,,,,,,,,,` #dig label(farming_traffic) start(16; 18) hidden() keep hungry dwarves away from the crops and food stores so they prefer the prepared meals @@ -1652,181 +1499,24 @@ build3/farming_build3 ,,,,,,ol,ol,ol,ol,,ol,,or,or,or,or,or,,ol,ol,ol,ol,ol ,,,,,,ol,ol,ol,ol,,ol,,or,or,or,or,or,,ol,,ol,ol,ol ,,,ol,ol,,ol,ol,ol,ol,,ol,,or,or,or,or,or,,ol -,,ol,ol,ol,,ol,ol,ol,ol,,ol,,or,or,or,or,or,,ol,,ol,ol,ol,,ol,ol,ol -,,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,,or,,or,,,ol,ol,ol,ol,ol,ol,ol,ol,ol -,,,ol,ol,,ol,ol,ol,ol,,ol,ol,ol,ol,ol,ol,ol,ol,ol,,ol,ol,ol,,ol,ol,ol +,,ol,ol,ol,,ol,ol,ol,ol,,ol,,or,or,or,or,or,,ol,,or,or,or,,or,or,or +,,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,,or,,or,,,ol,or,or,or,or,ol,or,or,or +,,,ol,ol,,ol,ol,ol,ol,,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,,or,or,or ,,,,or,,,or,,,,,,ol,`,`,`,ol,,,,,or,,,,or ,,or,or,or,or,or,or,or,or,or,or,,ol,`,~,`,ol,,or,or,or,or,or,or,or,or,or,or ,,or,or,or,or,or,or,or,or,or,or,or,ol,`,`,`,ol,or,or,or,or,or,or,or,or,or,or,or ,,or,or,or,or,or,or,or,or,or,or,,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,or -,,or,or,or,or,or,or,or,or,or,,,,ol,,ol,,,,or,or,or,or,or,or,or,or,or -,,or,or,or,or,or,or,or,or,,,ol,ol,ol,ol,ol,ol,ol,,,or,or,or,or,or,or,or,or -,,or,or,or,or,or,or,or,or,,ol,ol,,,ol,,,ol,ol,,or,or,or,or,or,or,or,or -,,or,or,or,or,or,or,or,,,ol,ol,,ol,ol,ol,,ol,ol,,,or,or,or,or,or,or,or -,,or,or,or,or,or,or,or,,ol,ol,ol,,ol,ol,ol,,ol,ol,ol,,or,or,or,or,or,or,or -,,or,or,or,or,or,or,or,,ol,ol,ol,,ol,ol,ol,,ol,ol,ol,,or,or,or,or,or,or,or -,,or,or,or,or,or,or,or,,ol,ol,ol,,,ol,,,ol,ol,ol,,or,or,or,or,or,or,or -,,,,,,,,,,,,,,,ol - +,,or,or,or,or,or,or,or,or,or,,,,or,,or,,,,or,or,or,or,or,or,or,or,or +,,or,or,or,or,or,or,or,or,,,or,or,or,or,or,or,or,,,or,or,or,or,or,or,or,or +,,or,or,or,or,or,or,or,or,,or,or,,,or,,,or,or,,or,or,or,or,or,or,or,or +,,or,or,or,or,or,or,or,,,or,or,,or,or,or,,or,or,,,or,or,or,or,or,or,or +,,or,or,or,or,or,or,or,,or,or,or,,or,or,or,,or,or,or,,or,or,or,or,or,or,or +,,or,or,or,or,or,or,or,,or,or,or,,or,or,or,,or,or,or,,or,or,or,or,or,or,or +,,or,or,or,or,or,or,or,,or,or,or,,,or,,,or,or,or,,or,or,or,or,or,or,or +,,,,,,,,,,,,,,,or -"#query label(farming_query_stockpiles) start(16; 18) hidden() message(remember to: -- assign a minecart to the refuse quantum stockpile (run ""assign-minecarts all"") -- if the industry level is already built, configure the jugs, pots, and bags stockpiles to take from the ""Goods"" quantum stockpile on the industry level) config stockpiles" - -,,,,,,,,,`,`,`,,`,`,`,seeds,potash,,booze,,,` -,,,,,,,,,`,`,`,,`,`,`,linksonly,nocontainers,,"{givename name=""booze""}",`,`,` -,,,,,,,,,`,`,`,,`,`,`,"{givename name=""seeds""}","{givename name=""potash""}",,`,`,`,` -,,,,,,,,,,,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,`,`,`,,`,,`,`,`,`,`,,`,preparedfood -,,,,,,,`,`,`,`,`,,`,`,`,`,`,,`,"{givename name=""prepared food""}",`,` -,,,,,,,`,`,`,,`,,`,`,`,`,`,,` -,,,,,,,,,,,`,,`,`,`,`,`,,`,,`,`,` -,,,,,,`,`,`,pots,,`,,`,`,`,`,`,,`,`,`,`,` -,,,,,,`,`,`,"{givename name=""pots""}",,`,,seeds,nocontainers,"{givename name=""seeds feeder""}",give2up,`,,`,,`,`,` -,,,bags,,,`,`,`,`,,`,,`,`,`,`,`,,` -,,`,nocontainers,"{givename name=""bags""}",,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,,`,`,` -,,`,woodentools,,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,` -,,,nocontainers,"{givename name=""jugs""}",,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,` -,,,,`,,,`,,,,,,`,`,`,`,`,,,,,`,,,,` -,,plants,,,`,`,`,`,`,`,`,,`,`,~,`,`,,`,`,`,,,,,,,"{givename name=""cookable food""}" -,,`,,,,"{givename name=""plants""}",`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,forbidplants,,,,,`,` -,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,forbidtallow,,,,,`,` -,,`,`,`,`,`,`,`,`,`,,,,`,,`,,,,`,`,forbiddye,,,,`,`,` -,,`,`,`,`,`,`,`,`,,,unpreparedfish,,,,,,rawhides,,,`,forbidunpreparedfish,,,,,,` -,,`,`,`,`,`,`,`,`,,`,nocontainers,,,`,,,"{givename name=""rawhides""}",`,,`,forbidmiscliquid,,,,,,` -,,`,`,`,`,`,`,`,,,`,"{givename name=""unprepared fish""}",,forbidcraftrefuse,"{givename name=""refuse feeder""}",corpses,,t{Left 3}{Down 4}&,`,,,forbidpreparedfood,,,,,,` -,,`,`,`,`,`,`,`,,`,`,`,,forbidcorpses,"{give move=""{Right 3}{Up}""}","{givename name=""corpse feeder""}",,`,`,`,,forbidbooze,,,,,`,` -,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,forbidseeds,,,,,`,` -,,`,`,`,`,`,`,`,,`,`,`,,,"{quantumstop name=""Refuse/Corpse quantum"" sp_links=""{sp_link move={Up} move_back={Down}}{sp_link move=""""{Right}{Up}"""" move_back=""""{Down}{Left}""""}""}{givename name=""refuse/corpse dumper""}",,,`,`,`,,forbidwax,,,,`,`,` -,,,,,,,,,,,,,,,"{quantum name=""refuse/corpse quantum""}" - - -#query label(farming_link) start(16; 18) hidden() set farming stockpiles to take from starting surface stockpiles - - -,,,,,,,,,`,`,`,,`,`,`,t{Down 6}{Left 10}<&,`,,t{Down 6}{Left 13}<&,`,`,` -,,,,,,,,,`,`,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,,,`,`,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,,,,,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,`,`,`,,`,,`,`,`,`,`,,`,t{Down 2}{Left 14}<&,`,` -,,,,,,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,`,`,`,,`,,`,`,`,`,`,,` -,,,,,,,,,,,`,,`,`,`,`,`,,`,,`,`,` -,,,,,,`,`,`,t{Up 2}{Right 11}<&,,`,,`,`,`,`,`,,`,`,`,`,` -,,,,,,`,`,`,`,,`,,t{Up 3}{Left 7}<&,`,`,`,`,,`,,`,`,` -,,,t{Up 4}{Right 17}<&,`,,`,`,`,`,,`,,`,`,`,`,`,,` -,,`,`,`,,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,,`,`,` -,,`,t{Up 6}{Right 17}<&,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,` -,,,`,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,` -,,,,`,,,`,,,,,,`,`,`,`,`,,,,,`,,,,` -,,t{Up 9}{Right 4}<&,`,`,`,`,`,`,`,`,`,,`,`,~,`,`,,t{Up 9}{Left 13}<&,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,,,,`,,`,,,,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,,,t{Up 13}{Left 6}<&,`,`,`,`,`,`,,,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,,`,`,,,`,,,`,`,,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,,t{Up 15}{Right 10}<&,`,`,,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,,`,,,`,`,`,,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,` - - -#query label(farming_rooms) start(16; 18) hidden() message(Check to ensure the lower office got assigned to your manager and assign the upper office to your bookkeeper (if different from your manager).) configure rooms - - -,,,,,,,,,`,`,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,,,r&a+&,,,,`,`,`,`,`,,`,`,`,` -,,,,,,,,,`,`,`,,`,`,`,`,`,,`,`,r+&h -,,,,,,,,,,,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,`,`,`,,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,r&a+&,,,`,`,,`,`,`,`,`,,`,`,`,` -,,,,,,,`,`,`,,`,,`,`,`,`,`,,` -,,,,,,,,,,,`,,`,`,`,`,`,,`,,`,`,r&d -,,,,,,`,`,`,`,,`,,`,`,`,`,`,,`,`,`,`,` -,,,,,,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,` -,,,`,`,,`,`,`,`,,`,,`,`,`,`,`,,` -,,`,`,`,,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,,`,`,` -,,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,` -,,,`,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,` -,,,,`,,,`,,,,,,`,`,`,`,`,,,,,`,,,,` -,,`,`,`,`,`,`,`,`,`,`,,`,`,~,`,`,,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,,,,`,,`,,,,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,,`,`,,,`,,,`,`,,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,,`,`,`,,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,,`,,,`,`,`,,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,` - - -"#build label(farming_build2) start(16; 18) hidden() farm plots, remaining furniture, and important doors" - - -,,,,,,,,,`,`,`,,p(3x1),,,`,`,,`,`,`,` -,,,,,,,,,`,`,`,,p(3x1),,,`,`,,`,`,`,` -,,,,,,,,,`,`,`,,p(3x1),,,`,`,,c,t,~,~ -,,,,,,,,,,,`,,p(3x1),,,`,`,,c,t,t,c -,,,,,,,`,`,`,,`,,p(3x1),,,`,`,,`,`,`,` -,,,,,,,`,`,`,`,`,,p(3x1),,,`,`,,`,`,`,` -,,,,,,,`,`,`,,`,,p(3x1),,,`,`,,` -,,,,,,,,,,,`,,p(3x1),,,`,`,,`,,b,b,~ -,,,,,,`,`,`,`,,`,,p(3x1),,,`,`,,`,`,`,`,h -,,,,,,`,`,`,`,,`,,`,`,`,`,`,,`,,b,b,b -,,,`,`,,`,`,`,`,,`,,`,`,`,`,`,,` -,,`,`,`,,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,,`,`,` -,,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,` -,,,`,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,` -,,,,`,,,`,,,,,,`,`,`,`,`,,,,,`,,,,` -,,`,`,`,`,`,`,`,`,`,`,,`,`,~,`,`,,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,,,,`,,`,,,,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,,,`,d,`,`,`,d,`,,,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,,`,`,,,d,,,`,`,,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,,`,`,`,,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,,`,,,`,`,`,,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,` - - -#query label(farming_query_plots) start(16; 18) hidden() configure farm plots for seasonal fertilization - - -,,,,,,,,,`,`,`,,s,`,`,`,`,,`,`,`,` -,,,,,,,,,`,`,`,,s,`,`,`,`,,`,`,`,` -,,,,,,,,,`,`,`,,s,`,`,`,`,,`,`,`,` -,,,,,,,,,,,`,,s,`,`,`,`,,`,`,`,` -,,,,,,,`,`,`,,`,,s,`,`,`,`,,`,`,`,` -,,,,,,,`,`,`,`,`,,s,`,`,`,`,,`,`,`,` -,,,,,,,`,`,`,,`,,s,`,`,`,`,,` -,,,,,,,,,,,`,,s,`,`,`,`,,`,,`,`,` -,,,,,,`,`,`,`,,`,,s,`,`,`,`,,`,`,`,`,` -,,,,,,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,` -,,,`,`,,`,`,`,`,,`,,`,`,`,`,`,,` -,,`,`,`,,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,,`,`,` -,,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,` -,,,`,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,` -,,,,`,,,`,,,,,,`,`,`,`,`,,,,,`,,,,` -,,`,`,`,`,`,`,`,`,`,`,,`,`,~,`,`,,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,,,,`,,`,,,,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,,`,`,,,`,,,`,`,,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,,`,`,`,,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,`,`,,,`,,,`,`,`,,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,` - - -#build label(farming_build3) start(16; 18) hidden() remaining doors +#build label(farming_doors) start(16; 18) hidden() remaining doors ,,,,,,,,,`,`,`,,`,`,`,`,`,,`,`,`,` @@ -1862,18 +1552,18 @@ Sets up workshops for all non-farming industries Screenshot: https://drive.google.com/file/d/1emMaHHCaUPcdRbkLQqvr-0ZCs2tdM5X7 "" Features: -- Space-efficient layout for all workshops +- Compact layout that covers all workshops - Manager orders that automate basic fortress maintenance "- Space available underneath the forge and smelters for magma, allowing the starting forge and smelters to be eventually replaced by magma versions." - Quantum stockpiles for compact storage with separate stockpiles for: - A reserve of uncut gems for strange moods that the jeweler's workshop cannot take from -"- Wood, steel bars, and coal so you can see at a glance if you're low on stock" -- Items that cannot be quantum stockpiled (e.g. lye and sand bags) +"- Wood, iron bars, steel bars, flux, and coal so you can see at a glance if you're low on stock" +"- Items that cannot be quantum stockpiled (e.g. lye, dye, and sand bags)" - Meltable weapons and armor "" Workshops: -- 2x Mason +- 2x Stonecutter - 4x Craftsdwarf - 1x Jeweler - 1x Mechanic @@ -1890,33 +1580,29 @@ Workshops: - 1x Dyer - 1x Loom - 1x Clothier - "" Manual steps you have to take: -- Assign minecarts to your quantum stockpile hauling routes -"- Give from the ""Goods"" quantum stockpile to the jugs, pots, and bags stockpiles on the farming level" +- Assign minecarts to your quantum stockpile hauling routes. "" Optional manual steps you can take: -- Restrict the Mechanic's workshop to only allow skilled workers so unskilled trap-resetters won't be tasked to build mechanisms. -"- Restrict the Craftsdwarf's workshops to only allow labors that take from the adjacent stockpiles. That is, only allow Woodcrafting for the Craftsdwarf's workshop on the left near the wood stockpile, Stonecrafting and Strand Extraction for the Craftsdwarf's workshop near the Mason's workshops, and Bonecrafting for one of the Craftsdwarf's workshop near the Clothier's workshop. The last Craftdwarf's workshop can hold all the remaining labors, or it can be a secondary workshop for a labor that you want more dwarves working on." "- To encourage your masons to concentrate on building blocks and other high-volume orders, it helps to set one of your Mason's workshops to service a maximum of 2 manager orders at a time." "- Once you have enough haulers, you can increase the rate of stone and ore hauling jobs by building more wheelbarrows and adding them to the stone and ore feeder stockpiles." -"- If desired, set one or both stockpiles in the bottom left to auto-melt. This results in melting all weapons and armor that are inferior to masterwork. This is great for upgrading your military, but it takes a *lot* of fuel unless you have first replaced the forge and smelters with magma versions. If you enable automelt and you don't have magma forges and magma smelters, be sure to be in a heavily forested area, enable auto-chop, and keep your coal stocks high." +"- If desired, set one or both stockpiles in the bottom left to auto-melt. This results in melting all weapons and armor that are inferior to masterwork. This is great for upgrading your military, but it takes a *lot* of fuel unless you have first replaced the forge and smelters with magma versions. If you enable automelt and you don't have magma forges and magma smelters, be sure to be in a heavily forested area, set up autochop, and keep your coal stocks high." "" Industry Walkthrough: -"1) Start digging out /industry1 as soon as you find a stone layer at least two layers beneath the surface so the boulders can be used by your starting workshops. The services level is intended to be dug beneath this one, and there is space on that level to route magma underneath your furnaces so you can replace the furnaces on this level with magma-powered equivalents." +"1) Start digging out /industry1 as soon as you find a non-aquifer stone layer at least two layers beneath the surface so the boulders can be used by your starting workshops. The services level is intended to be dug beneath this one, and there is space on that level to route magma underneath your furnaces so you can replace the furnaces on this level with magma-powered equivalents." "" -"2) Queue up manufacturing by running ""quickfort orders"" on /industry2. You brought an anvil with you (right??), so you can remove the unneeded anvil work order from the manager orders screen (j-m). Note that stockpiles that accept containers may claim the barrels you need to build the Dyer's Workshop and Ashery. If you see those two buildings not being constructed, build a few extra barrels or run combine-plants and combine-drinks to free up some existing ones." +"2) Queue up manufacturing by running ""quickfort orders"" on /industry2. You brought an anvil with you (right??), so you can remove the unneeded anvil work order from the manager orders screen. Note that stockpiles that accept containers may claim the barrels you need to build the Dyer's Workshop and Ashery. If you see those two buildings not being constructed, build a few extra barrels or run combine all to free up some existing ones." "" -"3) Once the area is dug out, run /industry2. Remember to assign minecarts to to your quantum stockpile hauling routes, and if the farming level is already built, give from the ""Goods"" quantum stockpile (the one on the left) to the jugs, pots, and bags stockpiles on the farming level." +"3) Once the area is dug out, run /industry2. Remember to assign minecarts to to your quantum stockpile hauling routes." "" -"4) Once you have enough dwarves to do maintenance tasks (that is, after the first or second migration wave), run ""orders import library/basic"" to use the provided basic.json to take care of your fort's basic needs, such as food, booze, and raw material processing." +"4) Once you have enough dwarves to do maintenance tasks (that is, after the first or second migration wave), run ""orders import library/basic"" to use the provided manager orders to take care of your fort's basic needs, such as food, booze, and raw material processing." "" "5) If you want to automatically melt goblinite and other low-quality weapons and armor, mark the south-east stockpiles for auto-melt. If you don't have a high density of trees to make into charcoal, though, be sure to route magma to the level beneath this one and replace the forge and furnaces with magma equivalents." "" "6) Once you have magma furnaces (or abundant fuel) and more dwarves, run ""orders import library/furnace"", ""orders import library/military"", and ""orders import library/smelting"" to import the remaining fort automation orders. The military orders are optional if you are not planning to have a military, of course." "" -"7) At any time, feel free to build extra workshops or designate custom stockpiles in the unused space in the top and bottom right. The space is there for you to use!" +"7) At any time, feel free to build extra workshops or designate custom stockpiles in the remaining open space. The space is there for you to use! Note the area in the bottom right can be used for additional magma-powered furnaces and workshops since there is space reserved for magma in those spots in the level beneath." "#dig label(industry1) start(18; 18; central stairs) message(Once the area is dug out, continue with /industry2.)" @@ -1953,12 +1639,12 @@ Industry Walkthrough: ,,,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d -"#meta label(industry2) start(central stairs) message(Remember to enqueue manager orders for this blueprint.) build workshops and stockpiles, configure stockpiles" +#meta label(industry2) start(central stairs) message(Remember to enqueue manager orders for this blueprint.) workshops and stockpiles traffic/industry_traffic -build/industry_build place/industry_place -query/industry_query -#dig label(industry_traffic) start(18; 18; central stairs) hidden() +build/industry_build +build2/industry_build2 +#dig label(industry_traffic) start(18; 18; central stairs) hidden() traffic patterns ,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` @@ -1994,117 +1680,115 @@ query/industry_query ,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` -#build label(industry_build) start(18; 18) hidden() +"#place label(industry_place) start(18; 18) hidden() message(remember to: +- assign minecarts to to your quantum stockpile hauling routes (use ""assign-minecarts all"") +- if you want to automatically melt goblinite and other low-quality weapons and armor, mark the south-east stockpiles for auto-melt +- once you have enough dwarves, run ""orders import library/basic"" to automate your fort's basic needs (see /industry_help for more info on this file)) industry stockpiles" + + +,,,,,,,,,,,"e{name=""Rough gems for moods"" containers=0 take_from=""Stoneworker quantum,Gem feeder""}:=roughgems",e,e,e,e,e,e,e,e,e,e,e,e +,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,"se{name=""Stoneworker quantum"" quantum=true}",`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,"s10{name=""Stone feeder""}:=otherstone(5x4)",,,~,~,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,` +,,"w{name=""Wood"" take_from=""Goods/wood quantum,Wood feeder""}",`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,"c{name=""Dye"" barrels=-1 }:+dye" +,,w,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,c +,,w,`,`,`,`,`,`,`,`,`,`,`,`,"e{name=""Gem feeder"" containers=0}(5x1)",,,~,~,`,`,`,`,`,`,`,`,`,`,`,`,c +,,w,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,c +,,w,`,`,`,`,`,`,"w{name=""Wood feeder""}(2x5)",,"g{name=""Goods feeder"" containers=0}:+cat_food/tallow+wax-crafts-goblets(3x3)",,`,,`,`,`,`,`,,"hlS{name=""Cloth/bones feeder"" containers=0}:+cat_refuse/skulls/,bones/,hair/,shells/,teeth/,horns/-adamantinethread(5x5)",,,~,~,`,`,`,`,`,`,c +,,w,`,`,`,`,`,`,~,~,~,~,~,`,`,,,,`,`,~,~,~,~,~,`,`,`,`,`,`,c +,,`,`,`,`,`,"c{name=""Goods/wood quantum"" quantum=true give_to=Pots,Barrels,Jugs,Bags}:+all",`,~,~,~,~,~,,`,,`,,`,,~,~,~,~,~,`,"r{name=""Cloth/bones quantum"" quantum=true}:+all",`,`,`,`,c +,,"c{name=""Lye"" barrels=2}:+miscliquid",`,`,`,`,`,`,~,~,"u2{name=""Furniture feeder""}:-sand(3x2)",~,~,`,`,,,,`,`,~,~,~,~,~,`,`,`,`,`,`,c +,,c,`,`,`,`,`,`,~,~,~,~,~,,`,`,`,`,`,,~,~,~,~,~,`,`,`,`,`,`,c +,,c,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,c +,,c,`,`,`,`,`,`,`,`,`,`,`,`,"bnpdz{name=""Bar/military feeder"" containers=0}:-potash+adamantinethread(5x3)",,,,~,`,`,`,`,`,`,`,`,`,`,`,`,c +,,c,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,c +,,c,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,c +,,,,"pd{name=""Meltable steel/bronze"" take_from=""Metalworker quantum,Bar/military feeder""}:-cat_weapons/mats/,other/,core/masterful,core/artifact-cat_armor/mats/,other/,core/masterful,core/artifact+bronzeweapons+bronzearmor+steelweapons+steelarmor(7x3)",,,~,~,~,~,`,`,`,`,"s5{name=""Ore/clay feeder""}:-otherstone(5x2)",,,~,~,`,`,`,`,`,`,`,`,`,`,` +,,,,~,~,~,~,~,~,~,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,` +,,,,~,~,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,"c{name=""Coal"" containers=0 take_from=""Metalworker quantum,Bar/military feeder""}:+coal",`,"c{name=""Metalworker quantum"" quantum=true}:+all",`,"c{name=""Iron"" containers=0 take_from=""Metalworker quantum,Bar/military feeder""}:+ironbars",`,`,`,`,`,`,`,`,`,`,` +,,,,"pd{name=""Other meltables"" take_from=""Metalworker quantum,Bar/military feeder""}:-cat_weapons/other/,core/masterful,core/artifact-cat_armor/other/,core/masterful,core/artifact-bronzeweapons-bronzearmor-steelweapons-steelarmor(7x3)",,,~,~,~,~,`,`,`,`,c,"c{name=Flux take_from=""Metalworker quantum,Ore/clay feeder""}:+flux(3x1)",,,c,`,`,`,`,`,`,`,`,`,`,` +,,,,~,~,~,~,~,~,~,`,`,`,`,c,`,`,`,c,`,`,`,`,`,`,`,`,`,`,` +,,,,~,~,~,~,~,~,~,`,`,`,`,c,`,`,`,c,`,`,`,`,`,`,`,`,`,`,` +,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,,,,,,,,"u{name=""Sand bags""}:-cat_furniture/type+sand",u,u,u,u,u,`,"c{name=""Steel"" containers=0 take_from=""Metalworker quantum,Bar/military feeder""}:+steelbars",c,c,c,c,c + + +#build label(industry_build) start(18; 18) hidden() workshops to build first ,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,wj,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,wr,`,`,`,`,`,`,`,wt,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,trackstopN,`,`,`,`,`,`,`,`,ws,`,`,`,` -,,,,`,`,wS,`,`,wb,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,"wr{name=""Stone craftsdwarf""}",`,`,`,`,`,`,`,wt,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,"trackstopN{name=""Stone/gem dumper"" take_from=""Stone feeder,Gem feeder"" route=""Stone/gem quantum""}",`,`,`,`,`,`,`,`,~,`,`,`,` +,,,,`,`,~,`,`,~,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,wm,`,`,`,`,`,`,`,wm,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,`,`,wy,`,`,ew,`,`,ew,`,`,`,`,`,`,`,`,`,`,`,`,`,wk,`,`,wo,`,`,wd,`,` -,,`,`,`,`,`,`,`,`,`,`,`,`,,,d,,d,,,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,~,`,`,~,`,`,~,`,`,`,`,`,`,`,`,`,`,`,`,`,~,`,`,~,`,`,~,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,,,~,,~,,,`,`,`,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,`,`,d,`,,,,`,d,`,`,`,`,`,`,`,`,`,`,`,` -,,`,`,wc,`,`,`,trackstopW,`,`,`,`,`,,`,,`,,`,,`,`,`,`,`,trackstopE,`,`,`,we,`,` -,,`,`,`,`,`,`,`,`,`,`,`,`,d,`,,,,`,d,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,~,`,,,,`,~,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,wc,`,`,`,"trackstopW{name=""Goods/wood dumper"" take_from=""Wood feeder,Goods feeder,Furniture feeder"" route=""Goods/wood quantum""}",`,`,`,`,`,,`,,`,,`,,`,`,`,`,`,"trackstopE{name=""Cloth/bones dumper"" take_from=""Cloth/bones feeder"" route=""Cloth/bones quantum""}",`,`,`,~,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,~,`,,,,`,~,`,`,`,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,`,`,,,d,,d,,,`,`,`,`,`,`,`,`,`,`,`,` -,,`,`,wr,`,`,ew,`,`,ew,`,`,`,`,`,`,`,`,`,`,`,`,`,wr,`,`,wr,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,,,~,,~,,,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,~,`,`,~,`,`,~,`,`,`,`,`,`,`,`,`,`,`,`,`,~,`,`,~,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,es,`,`,`,`,`,`,`,es,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,trackstopS,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,es,`,`,`,`,`,`,`,es,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,"trackstopS{name=""Metalworker dumper"" take_from=""Bar/military feeder,Ore/clay feeder"" route=""Metalworker quantum""}",`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,eg,`,`,`,wf,`,`,`,ek,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,~,`,`,`,~,`,`,`,~,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` -#place label(industry_place) start(18; 18) hidden() +#build label(industry_build2) start(18; 18) hidden() remaining workshops -,,,,,,,,,,,e,e,e,e,e,e,e,e,e,e,e,e,e ,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,"wj{name=""Encruster"" take_from=""Goods/wood quantum,Stoneworker quantum,Gem feeder""}",`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,`,ws,`,`,`,` +,,,,`,`,wS,`,`,wb,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,wy,`,`,ew,`,`,ew,`,`,`,`,`,`,`,`,`,`,`,`,`,wk,`,`,wo,`,`,"wd{take_from=""Cloth/bones feeder,Cloth/bones quantum,Dye""}",`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,,,d,,d,,,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,d,`,,,,`,d,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,~,`,`,`,~,`,`,`,`,`,,`,,`,,`,,`,`,`,`,`,~,`,`,`,we,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,d,`,,,,`,d,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,,,d,,d,,,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,"wr{name=""Wood craftsdwarf""}",`,`,ew,`,`,ew,`,`,`,`,`,`,`,`,`,`,`,`,`,"wr{name=""Misc craftsdwarf""}",`,`,"wr{name=""Bone craftsdwarf""}",`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,es,`,`,`,`,`,`,`,es,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,c,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,`,`,s4(5x4),,,~,~,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,` -,,w,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,` -,,w,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,` -,,w,`,`,`,`,`,`,`,`,`,`,`,`,e(5x1),,,~,~,`,`,`,`,`,`,`,`,`,`,`,`,` -,,w,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,` -,,w,`,`,`,`,`,`,w(2x5),,fg(3x3),,`,,`,`,`,`,`,,frhlS(5x5),,,~,~,`,`,`,`,`,`,` -,,w,`,`,`,`,`,`,~,~,~,~,~,`,`,,,,`,`,~,~,~,~,~,`,`,`,`,`,`,` -,,`,`,`,`,`,c,`,~,~,~,~,~,,`,,`,,`,,~,~,~,~,~,`,r,`,`,`,`,` -,,f3,`,`,`,`,`,`,~,~,u2(3x2),~,~,`,`,,,,`,`,~,~,~,~,~,`,`,`,`,`,`,` -,,f3,`,`,`,`,`,`,~,~,~,~,~,,`,`,`,`,`,,~,~,~,~,~,`,`,`,`,`,`,` -,,f3,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,` -,,f3,`,`,`,`,`,`,`,`,`,`,`,`,bnpdhz(5x3),,,,~,`,`,`,`,`,`,`,`,`,`,`,`,` -,,f3,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,` -,,f3,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,pd(7x3),,,~,~,~,~,`,`,`,`,s2(5x2),,,~,~,`,`,`,`,`,`,`,`,`,`,` -,,,,~,~,~,~,~,~,~,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,` -,,,,~,~,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,`,`,b,`,c,`,b,`,`,`,`,`,`,`,`,`,`,` -,,,,pd(7x3),,,~,~,~,~,`,`,`,`,b,s,s,s,b,`,`,`,`,`,`,`,`,`,`,` -,,,,~,~,~,~,~,~,~,`,`,`,`,b,`,`,`,b,`,`,`,`,`,`,`,`,`,`,` -,,,,~,~,~,~,~,~,~,`,`,`,`,b,`,`,`,b,`,`,`,`,`,`,`,`,`,`,` -,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,,,,,,,u,u,u,u,u,u,`,b,b,b,b,b,b - - -"#query label(industry_query) start(18; 18) hidden() message(remember to: -- assign minecarts to to your quantum stockpile hauling routes (use ""assign-minecarts all"") -- if the farming level is already built, give from the ""Goods"" quantum stockpile to the jugs, pots, and bags stockpiles on the farming level -- if you want to automatically melt goblinite and other low-quality weapons and armor, mark the south-east stockpiles for auto-melt -- once you have enough dwarves, run ""orders import library/basic"" to automate your fort's basic needs (see /industry_help for more info on this file) -- optionally, restrict the labors for your Craftsdwarf's and Mechanic's workshops as per the guidance in /industry_help)" - - -,,,,,,,,,,,roughgems,,,,nocontainers,"{givename name=""rough gems for moods""}",t{Down 5}&,,,,,~,~ -,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,es,`,`,`,`,`,`,`,es,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,"{givename name=""stone craftsdwarf""}",`,`,`,"{quantum name=""stoneworker quantum""}g{Up 3}&",`,`,`,~,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,"{quantumstop name=""Stoneworker quantum"" sp_links=""{sp_link move={Down} move_back={Up}}{sp_link move=""""{Down 5}"""" move_back=""""{Up 5}""""}""}{givename name=""stoneworker dumper""}",`,`,`,`,`,`,`,`,~,`,`,`,` -,,,,`,`,~,`,`,~,`,`,`,`,`,otherstone,,,,~,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,~,`,"{givename name=""stone feeder""}",~,~,~,~,`,~,`,`,`,`,`,`,`,`,` -,,"{givename name=""wood""}",`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,` -,,~,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,` -,,~,`,~,`,`,~,`,`,~,`,`,`,`,nocontainers,"{givename name=""gem feeder""}",~,~,~,`,`,`,`,~,`,`,~,`,`,~,`,` -,,~,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,` -,,~,`,`,`,`,`,`,"{givename name=""wood feeder""}",~,"{givename name=""goods feeder""}",nocontainers,~,,`,`,`,`,`,,craftrefuse,,,,~,`,`,`,`,`,`,` -,,t{Right 5}{Down}&,`,`,`,`,`,`,~,~,{tallow}{permitwax},~,~,`,`,,,,`,`,"{givename name=""cloth/bones feeder""}",g{Up 3}{Right 5}&,~,~,~,`,`,`,`,`,`,` -,,`,`,~,`,`,"{quantum name=""goods/wood quantum""}g{Up 13}{Right 10}&","{quantumstop name=""Goods/Wood quantum"" sp_links=""{sp_link move={Right} move_back={Left}}{sp_link move=""""{Right 5}"""" move_back=""""{Left 5}""""}{sp_link move=""""{Down}{Right 5}"""" move_back=""""{Left 5}{Up}""""}""}{givename name=""goods/wood dumper""}",~,~,{forbidcrafts}{forbidgoblets},~,~,,`,,`,,`,,nocontainers,~,~,~,~,"{quantumstopfromwest name=""Clothier/Bones quantum""}{givename name=""cloth/bones dumper""}","{quantum name=""cloth/bones quantum""}g{Up 4}{Right 3}&",`,`,~,`,` -,,miscliquid,`,`,`,`,`,`,~,~,"{givename name=""furniture feeder""}",~,~,`,`,,,,`,`,forbidadamantinethread,~,~,~,~,`,`,`,`,`,`,` -,,"{givename name=""miscliquid""}",`,`,`,`,`,`,~,~,forbidsand,~,~,,`,`,`,`,`,,dye,~,~,~,~,`,`,`,`,`,`,` -,,~,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,` -,,~,`,"{givename name=""wood craftsdwarf""}",`,`,~,`,`,~,`,`,`,`,forbidpotash,nocontainers,"{givename name=""bar/military feeder""}",~,~,`,`,`,`,"{givename name=""misc craftsdwarf""}",`,`,"{givename name=""bone craftsdwarf""}",`,`,`,`,` -,,~,`,`,`,`,`,`,`,`,`,`,`,`,adamantinethread,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,` -,,~,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,nocontainers,t{Right 12}{Up 3}&,t{Right 11}{Down 3}&,"{givename name=""meltable steel/brnze""}",,,,`,`,~,`,forbidotherstone,,,,,`,~,`,`,`,`,`,`,`,`,` -,,,,{bronzeweapons}{permitsteelweapons}{forbidmasterworkweapons}{forbidartifactweapons},,,,,,,`,`,`,`,"{givename name=""ore/clay feeder""}",~,~,~,~,`,`,`,`,`,`,`,`,`,`,` -,,,,{bronzearmor}{permitsteelarmor}{forbidmasterworkarmor}{forbidartifactarmor},,,,,,,`,`,`,`,`,`,"{quantumstop name=""Metalworker quantum"" sp_links=""{sp_link move={Up} move_back={Down}}{sp_link move=""""{Up 5}"""" move_back=""""{Down 5}""""}""}{givename name=""metalworker dumper""}",`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,`,`,`,`,`,`,`,~,`,t{Right 2}&,`,"{quantum name=""metalworker quantum""}",`,t{Left 2}&,`,~,`,`,`,`,`,`,`,`,` -,,,,nocontainers,t{Right 12}{Up 7}&,t{Right 11}{Up 1}&,"{givename name=""other meltables""}",,,,`,`,`,`,coal,flux,t{Up}&,"{givename name=""flux""}",ironbars,`,`,`,`,`,`,`,`,`,`,` -,,,,{metalweapons}{forbidbronzeweapons}{forbidsteelweapons}{forbidmasterworkweapons}{forbidartifactweapons},,,,,,,`,`,`,`,"{givename name=""coal""}",`,`,`,"{givename name=""iron""}",`,`,`,`,`,`,`,`,`,`,` -,,,,{metalarmor}{forbidbronzearmor}{forbidsteelarmor}{forbidmasterworkarmor}{forbidartifactarmor},,,,,,,`,`,~,`,nocontainers,`,~,`,nocontainers,`,~,`,`,`,`,`,`,`,`,` +,,,,`,`,`,`,`,`,`,`,`,eg,`,`,`,wf,`,`,`,ek,`,`,`,`,`,`,`,`,` +,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,,,,,,,sand,"{givename name=""sand bags""}",nocontainers,~,~,~,`,t{Up 5}{Left}&,,,nocontainers,steelbars,"{givename name=""steel""}" #notes label(services_help) @@ -2113,53 +1797,55 @@ Screenshot: https://drive.google.com/file/d/13vDIkTVOZGkM84tYf4O5nmRs4VZdE1gh "" Features: - Spacious dining room/tavern (tavern is restricted to residents-only by default) -- Prepared food and drink stockpiles +- Large prepared food and drink stockpiles - Well cistern system (bring your own water) -- Hospital with a well for washing +- Hospital (also restricted to residents by default) with a well for washing +- Well-appointed jail cells +- Bolt-recycling archery range for your marksdwarves +- Interrogation room for your Captain of the Guard - Garbage dump - Empty space for magma to power forges and smelters in the industry level above "" -Note the hospital also has animal training enabled so it can be used with the dwarfvet plugin if it's enabled. +Note the hospital is attached to an animal training zone so it can be used with the dwarfvet plugin if it's enabled. "" Manual steps you have to take: -"- If you want to tavern to attract visitors, change the restriction in the (l)ocation menu." -"- Fill the cisterns with water, either with a bucket brigade or by plumbing flowing water. Fill so that there are two z-levels of 7-depth water to prevent muddiness. If you want to fill with buckets, designate a pond zone on the level below the main floor. If you feel adventurous and are experienced with water pressure, you can instead route (depressurized!) water to the second-to-bottom level (the one above the up staircases)." +"- If you want to tavern to attract visitors, change the restriction in the location configuration screen." +"- Fill the cisterns with water, either with a bucket brigade or by plumbing flowing water. Fill so that there are two z-levels of 7-depth water to prevent muddiness. If you want to fill with buckets, you can use the pre-designated pond zones on the level below the main floor. If you feel adventurous and are experienced with water pressure, you can instead route (depressurized!) water to the second-to-bottom level (the one above the up staircases)." "- If you are filling the wells with a bucket brigade and at least one well is already constructed, you'll run into issues with the dwarves stealing water from one well to fill another. Temporarily deconstruct the wells or temporarily build grates beneath the wells to block the buckets to avoid this issue. Remember to rebuild the wells or remove the grates afterwards, though!" -- Assign the office to the right of the barracks to your Sheriff/Captain of the Guard to use it as an interrogation room. "" Services Walkthrough: -1) Start this level when your fort grows to about 50 dwarves so everyone has a place to eat. +1) Start this level when your fort grows to about 30 dwarves so everyone has a place to eat. "" -2) Start digging with /services1. Note that this digs out the main level and three levels below for the wells. +2) Start digging with /services1. Note that this digs out the main level and three levels below for the well cisterns. "" -"3) Once the area is dug out, set up important furniture, stockpiles, hospital zone and garbage dump zone with /services2. Run ""quickfort orders"" for /services2." +"3) Once the area is dug out, set up zones/locations and start populating the rooms with /services2. Run ""quickfort orders"" for /services2." "" -"4) When the table and chair have been placed in the dining room, the beds are placed in the rented rooms, and the weapon rack and archery targets are constructed in the barracks, run /services3 to build the rest of the furniture and configure your dining room/tavern and barracks. Run ""quickfort orders"" for /services3." +4) Fill the wells with either bucket brigades or by carefully routing flowing water. "" -5) Fill the wells with either bucket brigades or by carefully routing flowing water. +"5) When your fort has grown some more, or you start needing a jail cell, run /services3 to extend the rooms a bit more. Run ""quickfort orders"" for /services3." "" -"6) When your fort is mature enough to need jail cells, run /services4 to set those up, anytime after the restraints are built in the jail cell block. You also get some decorative statues to increase the value of your dining hall. Assign the office to the right of the barracks to your Sheriff/Captain of the Guard to use it as an interrogation room. Run ""quickfort orders"" for /services4." +"6) When your fort is more mature and you need to expand the rooms, run /services4 to finish everything up. If you didn't have a Sheriff/Captain of the Guard to automatically assign to the interrogation room when you ran /services2, you can manually assign the office now. Run ""quickfort orders"" for /services4." "#dig label(services1) start(18; 18; central stairs) message(Once the area is dug out, continue with /services2.)" -,d,d,d,,d,d,d,,d,d,d,,d,h,d,,j,,d,h,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,h,d,,d,,d,h,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,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,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,h,d,,d,h,d,,d,h,d,,d,h,d,,d,h,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,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,d,d,d,d +,d,d,d,d,d,d,d,d,d,d,d,,h,h,h,h,h,h,h,h,h,h,,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,d,d +,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,,j,,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,,,,,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,d,d,d,d,d,d,d,d,,d,,d,`,`,`,d,,d,,d,d,d,h,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,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,h,d,d,d,d,d,,d,,d,`,`,`,d,,d,,d,d,d,h,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,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 @@ -2177,33 +1863,33 @@ Services Walkthrough: #> -,,,,,,,,,,,,,j5,h5,j,,u,,j,h5,j5 -,,,,,,,,,,,,,5,5,5,5,d,5,5,5,5 -,,,,,,,,,,,,,,,,,d -,,,,,,,,,,,,,,,,,d -,,,,,,,,,,,,,j5,h5,j,,d,,j,h5,j5 -,,,,,,,,,,,,,5,5,5,5,d,5,5,5,5 -,,,,,,,,,,,,,,,,,d -,,,,,,,,,,,,,,,,,d -,,,,,,,,,,,,,,,,,d -,,,,,,,,,,,,,,,,,d -,,,,,,,,,,,,,,,,,d -,,,,,,,,,,,,,,,,,d,d,d,d,d,d,d,d,d,d -,,,,,,,,,,,,,,,,,6,,,,,,,,,d -,,,,,,,,,,,,,,,,,d,,,,,,,,,d -,,,,,,,,,,,,,,,d,d,d,d,d,,,,,,,d -,,,,,,,,,,,,,,,d,`,`,`,d,,,,,,5,5,5 -,,,,,,,,,,,,,,,d,`,`,`,d,,,,,,j,h5,j5 +,,,,,,,,,,,,,j5,h5,j,,j5,h5,j,,j5,h5,j,,j5,h5,j,,j5,h5,j +,,,,,,,,,,,,,5,5,5,,5,5,5,,5,5,5,,5,5,5,,5,5,5 +,,,,,,,,,,,,,,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,,,,,,,,,,,,,,,,,,u,d,d +,,,,,,d,,,,,,,,,,,,,,,,,,,,d +,,,,,,d,,,,,,,,,,,,,,,,,,,,d +,,,,,,d,,,,,,,,,,,,,,,,,,,,d +,,,,,,d,,,,,,,,,d,d,d,d,d,,,,,,,d +,,,,,5,5,5,,,,,,,,d,`,`,`,d,,,,,,5,5,5 +,,,,,j5,h5,j,,,,,,,,d,`,`,`,d,,,,,,j5,h5,j ,,,,,,,,,,,,,,,d,`,`,`,d ,,,,,,,,,,,,,,,d,d,d,d,d #> -,,,,,,,,,,,,,u5,h5,i,,,,i,h5,u5 +,,,,,,,,,,,,,u5,h5,i,,u5,h5,i,,u5,h5,i,,u5,h5,i,,u5,h5,i + -,,,,,,,,,,,,,u5,h5,i,,,,i,h5,u5 @@ -2215,17 +1901,17 @@ Services Walkthrough: ,,,,,,,,,,,,,,,d,d,d,d,d ,,,,,,,,,,,,,,,d,`,`,`,d -,,,,,,,,,,,,,,,d,`,`,`,d,,,,,,i,h5,u5 +,,,,,u5,h5,i,,,,,,,,d,`,`,`,d,,,,,,u5,h5,i ,,,,,,,,,,,,,,,d,`,`,`,d ,,,,,,,,,,,,,,,d,d,d,d,d #> -,,,,,,,,,,,,,,d,u,,,,u,d +,,,,,,,,,,,,,,d,u,,,d,u,,,d,u,,,d,u,,,d,u + -,,,,,,,,,,,,,,d,u,,,,u,d @@ -2237,93 +1923,88 @@ Services Walkthrough: ,,,,,,,,,,,,,,,d,d,d,d,d ,,,,,,,,,,,,,,,d,`,`,`,d -,,,,,,,,,,,,,,,d,`,`,`,d,,,,,,u,d +,,,,,,d,u,,,,,,,,d,`,`,`,d,,,,,,,d,u ,,,,,,,,,,,,,,,d,`,`,`,d ,,,,,,,,,,,,,,,d,d,d,d,d -"#meta label(services2) start(central stairs) message(Remember to enqueue manager orders for this blueprint. -Once furniture has been placed, continue with /services3.) dining hall anchors, stockpiles, hospital, garbage dump" +"#meta label(services2) start(central stairs) message(Once furniture has been built, continue with /services3.) zones and minimally functional hospital and dining hall" traffic/services_traffic zones/services_zones -build/services_build place/services_place -name_zones/services_name_zones -query_stockpiles/services_query_stockpiles +build/services_build "" -"#meta label(services3) start(central stairs) message(Remember to enqueue manager orders for this blueprint.) configure dining room/tavern, build dining hall and hospital furniture" -query_dining/services_query_dining -query_rented_rooms/services_query_rented_rooms +"#meta label(services3) start(central stairs) message(Once furniture has been built, continue with /services4.) expand furnishings" +place2/services_place2 build2/services_build2 "" -#meta label(services4) start(central stairs) message(Remember to enqueue manager orders for this blueprint.) declare and furnish jail and build decorative furniture +#meta label(services4) start(central stairs) complete furnishings +place3/services_place3 build3/services_build3 -place_jail/services_place_jail -query_jail/services_query_jail -#dig label(services_traffic) start(18; 18) hidden() keep lollygaggers out of the cisterns - -,ol,ol,ol,,ol,ol,ol,,ol,ol,ol,,or,or,or,,or,,or,or,or -,ol,ol,ol,,ol,ol,ol,,ol,ol,ol,,or,or,or,or,or,or,or,or,or -,ol,ol,ol,,ol,ol,ol,,ol,ol,ol,,or,or,or,,or,,or,or,or -,,ol,,,,ol,,,,ol,,,,,,,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,,or,,or,or,or,,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,,or,,or,or,or,,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,,,,,or,,,,,,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,,,,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,or,or,or,or,or,or,or,or,or,,or,,or,,or,,or -,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,,,,,or,,or,,,,,or,,or,,or,,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,,,oh,oh,oh,oh,oh,,,,or,or,or,or,or,or,or,or,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,`,`,`,oh,oh,oh,oh,oh,oh,oh,oh,oh,or,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,`,,oh,`,`,`,oh,,`,,oh,oh,oh,`,oh,or,or,or,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,`,`,`,oh,oh,oh,oh,oh,oh,oh,oh,oh,or,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,,,oh,oh,oh,oh,oh,,,,or,or,or,or,or,or,or,or,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,,,,,or,,,,,,or,,or,,or,,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,,,,,,,,,,,,or,,or,,or,,or -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh -,,,,oh,oh,,oh,oh -,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh -,oh,oh,oh,oh,oh,,oh,oh,oh,oh,oh +#dig label(services_traffic) start(18; 18) hidden() keep lollygaggers out of the cisterns and justice areas + +,`,`,`,,`,`,`,,`,`,`,,or,or,or,,or,or,or,,or,or,or,,or,or,or,,or,or,or +,`,`,`,,`,`,`,,`,`,`,,or,or,or,,or,or,or,,or,or,or,,or,or,or,,or,or,or +,`,`,`,,`,`,`,,`,`,`,,or,or,or,,or,or,or,,or,or,or,,or,or,or,,or,or,or +,,`,,,,`,,,,`,,,,or,,,,or,,,,or,,,,or,,,,or +,`,`,`,`,`,`,`,`,`,`,`,,,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or +,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,,or +,`,`,`,`,`,`,`,`,`,`,`,,or,or,or,or,or,or,or,or,or,or,,or,,or,or,or,or,or +,`,`,`,`,`,`,`,`,`,`,`,,or,or,or,or,or,or,or,or,or,or,,or,,or,or,or,or,or +,`,`,`,`,`,`,`,`,`,`,`,,or,or,or,or,or,or,or,or,or,or,,or,,or,or,or,or,or +,`,`,`,`,`,`,`,`,`,`,`,,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or +,`,`,`,`,`,`,`,`,`,`,`,,or,or,or,or,or,or,or,or,or,or,,or,,or,or,or,or,or +,`,`,`,`,`,`,`,`,`,`,`,,or,or,or,or,or,or,or,or,or +,`,`,`,`,`,`,`,`,`,`,`,,or,or,or,or,or,or,or,or,or,,or,,or,,or,,or +,`,`,`,`,`,`,`,`,`,`,`,,,,,or,,or,,,,,or,,or,,or,,or +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,or,,or,,or,,or +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,oh,oh,oh,oh,oh,oh,oh,oh,ol,or,or,or,or +,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,oh,oh,oh,oh,oh,ol,or +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,oh,oh,oh,oh,oh,oh,oh,oh,ol,or,or,or,or +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,or,,or,,or,,or +,`,`,`,`,`,`,`,`,`,`,`,,,,,,or,,,,,,or,,or,,or,,or +,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,or,,or,,or,,or +,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,` +,,,,`,`,,`,` +,`,`,`,`,`,,`,`,`,`,` +,`,`,`,`,`,,`,`,`,`,` +,`,`,`,`,`,,`,`,`,`,` +,`,`,`,`,`,,`,`,`,`,` +,`,`,`,`,`,,`,`,`,`,` #> -,,,,,,,,,,,,,or,or,or,,or,,or,or,or -,,,,,,,,,,,,,or,or,or,or,or,or,or,or,or -,,,,,,,,,,,,,,,,,or -,,,,,,,,,,,,,,,,,or -,,,,,,,,,,,,,or,or,or,,or,,or,or,or -,,,,,,,,,,,,,or,or,or,or,or,or,or,or,or -,,,,,,,,,,,,,,,,,or -,,,,,,,,,,,,,,,,,or -,,,,,,,,,,,,,,,,,or -,,,,,,,,,,,,,,,,,or -,,,,,,,,,,,,,,,,,or -,,,,,,,,,,,,,,,,,or,or,or,or,or,or,or,or,or,or -,,,,,,,,,,,,,,,,,or,,,,,,,,,or -,,,,,,,,,,,,,,,,,or,,,,,,,,,or -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,,or -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,or,or,or -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,or,or,or +,,,,,,,,,,,,,or,or,or,,or,or,or,,or,or,or,,or,or,or,,or,or,or +,,,,,,,,,,,,,or,or,or,,or,or,or,,or,or,or,,or,or,or,,or,or,or +,,,,,,,,,,,,,,or,,,,or,,,,or,,,,or,,,,or +,,,,,,,,,,,,,,or,,,,or,,,,or,,,,or,,,,or +,,,,,,,,,,,,,,or,,,,or,,,,or,,,,or,,,,or +,,,,,,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or,or +,,,,,,or,,,,,,,,,,,,,,,,,,,,or +,,,,,,or,,,,,,,,,,,,,,,,,,,,or +,,,,,,or,,,,,,,,,,,,,,,,,,,,or +,,,,,,or,,,,,,,,,,,,,,,,,,,,or +,,,,,,or,,,,,,,,,,,,,,,,,,or,or,or +,,,,,,or,,,,,,,,,,,,,,,,,,,,or +,,,,,,or,,,,,,,,,,,,,,,,,,,,or +,,,,,,or,,,,,,,,,,,,,,,,,,,,or +,,,,,,or,,,,,,,,,`,`,`,`,`,,,,,,,or +,,,,,or,or,or,,,,,,,,`,`,`,`,`,,,,,,or,or,or +,,,,,or,or,or,,,,,,,,`,`,`,`,`,,,,,,or,or,or ,,,,,,,,,,,,,,,`,`,`,`,` ,,,,,,,,,,,,,,,`,`,`,`,` #> -,,,,,,,,,,,,,or,or,or,,,,or,or,or +,,,,,,,,,,,,,or,or,or,,or,or,or,,or,or,or,,or,or,or,,or,or,or + -,,,,,,,,,,,,,or,or,or,,,,or,or,or @@ -2335,17 +2016,17 @@ query_jail/services_query_jail ,,,,,,,,,,,,,,,`,`,`,`,` ,,,,,,,,,,,,,,,`,`,`,`,` -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,or,or,or +,,,,,or,or,or,,,,,,,,`,`,`,`,`,,,,,,or,or,or ,,,,,,,,,,,,,,,`,`,`,`,` ,,,,,,,,,,,,,,,`,`,`,`,` #> -,,,,,,,,,,,,,,or,or,,,,or,or +,,,,,,,,,,,,,,or,or,,,or,or,,,or,or,,,or,or,,,or,or + -,,,,,,,,,,,,,,or,or,,,,or,or @@ -2357,33 +2038,33 @@ query_jail/services_query_jail ,,,,,,,,,,,,,,,`,`,`,`,` ,,,,,,,,,,,,,,,`,`,`,`,` -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,or,or +,,,,,,or,or,,,,,,,,`,`,`,`,`,,,,,,,or,or ,,,,,,,,,,,,,,,`,`,`,`,` ,,,,,,,,,,,,,,,`,`,`,`,` -"#zone label(services_zones) start(18; 18) hidden() message(If you'd like to fill your wells via bucket brigade, activate the inactive pond zones one level down from where the wells will be built.) garbage dump, hospital, and pond zones" - -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,,`,,,,`,,,,`,,,,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,ht,ht,ht,ht,ht,ht,ht,ht,ht -,`,`,`,`,`,`,`,`,`,`,`,,,,,`,,`,,,,ht,ht,ht,ht,ht,ht,ht,ht,ht,ht -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,ht,ht,ht,ht,ht,ht,ht,ht,ht,ht -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,ht,ht,ht,ht,ht,ht,ht,ht,ht,ht -,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,ht,ht,ht,ht,ht,ht,ht,ht,ht,ht -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,ht,ht,ht,ht,ht,ht,ht,ht,ht,ht -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,ht,ht,ht,ht,ht,ht,ht,ht,ht,ht -,`,`,`,`,`,`,`,`,`,`,`,,,,,,d,,,,,ht,ht,ht,ht,ht,ht,ht,ht,ht,ht -,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,ht,ht,ht,ht,ht,ht,ht,ht,ht +"#zone label(services_zones) start(18; 18) hidden() message(If you'd like to fill your wells via bucket brigade, activate the inactive pond zones one level down from where the wells will be built.) garbage dump, hospital, taverrn, barracks, archery range, and pond zones" +,,,,,,,,,,,,"j{name=""Jail 1""}(5x5)",,,,"j{name=""Jail 2""}(5x5)",,,,"j{name=""Jail 3""}(5x5)",,,,"j{name=""Jail 4""}(5x5)",,,,"j{name=""Jail 5""}(5x5)" +,"b{location=tavern/bigpub name=""Rented room 1""}(1x3)","b{location=tavern/bigpub name=""Rented room 2""}(1x3)","b{location=tavern/bigpub name=""Rented room 3""}(1x3)",,"b{location=tavern/bigpub name=""Rented room 4""}(1x3)","b{location=tavern/bigpub name=""Rented room 5""}(1x3)","b{location=tavern/bigpub name=""Rented room 6""}(1x3)",,"b{location=tavern/bigpub name=""Rented room 7""}(1x3)","b{location=tavern/bigpub name=""Rented room 8""}(1x3)","b{location=tavern/bigpub name=""Rented room 9""}(1x3)",,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +"h{location=tavern/bigpub allow=residents name=""Grand hall tavern""}(13x31)",,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,` +,`,`,`,`,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,,`,"o{name=""Interrogation room"" assigned_unit=sheriff}(7x7)" +,`,`,`,`,`,`,`,`,`,`,`,,"B{name=""Marksdwarf barracks""}a{name=""Shooting gallery"" shoot_from=""south""}",Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba +,`,`,`,`,`,`,`,`,`,`,`,,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,Ba,,m{location=hospital name=Hospital allow=residents},,m,,m,,m +,`,`,`,`,`,`,`,`,`,`,`,,,,,`,,`,,,,,m,,m,,m,,m +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,m,,m,,m,,m +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,m,m,m,m,m,m,m,m,m,m +,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,m,m,m,m,m,m,m +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,m,m,m,m,m,m,m,m,m,m +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,m,,m,,m,,m +,`,`,`,`,`,`,`,`,`,`,`,,,,,,"d{name=""Garbage dump""}",,,,,,m,,m,,m,,m +,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,m,,m,,m,,m ,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,` @@ -2399,84 +2080,48 @@ query_jail/services_query_jail #> -,,,,,,,,,,,,,`,apPf,`,,`,,`,apPf,` -,,,,,,,,,,,,,`,`,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,`,apPf,`,,`,,`,apPf,` -,,,,,,,,,,,,,`,`,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,,,`,,,,,,,,,` -,,,,,,,,,,,,,,,,,`,,,,,,,,,` -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,,` -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,`,`,` -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,`,apPf,` +,,,,,,,,,,,,,`,"p{name=""Jail 1 cistern"" pond=true active=false}",`,,`,"p{name=""Jail 2 cistern"" pond=true active=false}",`,,`,"p{name=""Jail 3 cistern"" pond=true active=false}",`,,`,"p{name=""Jail 4 cistern"" pond=true active=false}",`,,`,"p{name=""Jail 5 cistern"" pond=true active=false}",` +,,,,,,,,,,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,,,,,,,,,,,,,,`,,,,`,,,,`,,,,`,,,,` +,,,,,,,,,,,,,,`,,,,`,,,,`,,,,`,,,,` +,,,,,,,,,,,,,,`,,,,`,,,,`,,,,`,,,,` +,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,,,`,,,,,,,,,,,,,,,,,,,,` +,,,,,,`,,,,,,,,,,,,,,,,,,,,` +,,,,,,`,,,,,,,,,,,,,,,,,,,,` +,,,,,,`,,,,,,,,,,,,,,,,,,,,` +,,,,,,`,,,,,,,,,,,,,,,,,,`,`,` +,,,,,,`,,,,,,,,,,,,,,,,,,,,` +,,,,,,`,,,,,,,,,,,,,,,,,,,,` +,,,,,,`,,,,,,,,,,,,,,,,,,,,` +,,,,,,`,,,,,,,,,`,`,`,`,`,,,,,,,` +,,,,,`,`,`,,,,,,,,`,`,`,`,`,,,,,,`,`,` +,,,,,`,"p{name=""Tavern cistern"" pond=true active=false}",`,,,,,,,,`,`,`,`,`,,,,,,`,"p{name=""Hospital cistern"" pond=true active=false}",` ,,,,,,,,,,,,,,,`,`,`,`,` ,,,,,,,,,,,,,,,`,`,`,`,` -#build label(services_build) start(18; 18) hidden() build basic hospital and dining room anchor - -,b,b,b,,b,b,b,,b,b,b,,`,`,`,,`,,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,,`,,,,`,,,,`,,,,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,d,,,,,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,A,A,A,`,A,A,A,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,r,`,`,`,`,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,d,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,trackstopN,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,,`,,`,,b -,`,`,`,`,`,`,`,`,`,`,`,,,,,d,,d,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,t,`,`,`,`,R -,`,`,`,`,`,`,`,`,`,`,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,h -,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,l,`,`,`,`,R -,`,`,`,`,`,`,`,`,`,`,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,t,c,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,R -,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,h,`,`,`,`,` -,,,,`,`,,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` - #place label(services_place) start(18; 18) hidden() -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,,`,,,,`,,,,`,,,,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,c,`,`,`,`,`,`,`,` +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,` +,`,`,`,`,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,"z{name=""Training quantum"" quantum=true}",`,`,`,`,`,,`,,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,z(7x1),,,`,`,`,`,`,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,,"z{name=""Training bolts feeder"" containers=0 take_from=""Metalworker quantum""}:-cat_ammo/type/,mats/,other/+bolts+woodammo+boneammo(9x1)",,,,,,,,`,,`,,`,,`,,` ,`,`,`,`,`,`,`,`,`,`,`,,,,,`,,`,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,c,,,,,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,,,,,,"c{name=""Garbage dump"" links_only=true}",,,,,,`,,`,,`,,` ,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,`,,`,,`,,` ,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,` @@ -2485,41 +2130,42 @@ query_jail/services_query_jail ,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,,`,` -,f(5x5),,,`,`,,f(5x5),,,`,` +,"c{name=""Prepared food"" barrels=-1}:+preparedmeals(5x5)",,,,`,,"c{name=""Booze"" barrels=-1}:+booze(5x5)",,,,` ,`,`,`,`,`,,`,`,`,`,` ,`,`,`,`,`,,`,`,`,`,` ,`,`,`,`,`,,`,`,`,`,` ,`,`,`,`,`,,`,`,`,`,` -#query label(services_name_zones) start(18; 18) hidden() - -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,,`,,,,`,,,,`,,,,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,"{namezone name=""hospital""}" -,`,`,`,`,`,`,`,`,`,`,`,,,,,`,,`,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,"{namezone name=""garbage dump""}" +"#build label(services_build) start(18; 18) hidden() message(Remember to enqueue manager orders for this blueprint. +Assign a minecart to the training ammo quantum dump with ""assign-minecarts all"") build basic hospital, dining room, and barracks" + +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,` +,`,`,`,`,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,A,A,A,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,h,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,b,`,`,`,"trackstopN{name=""Training bolts dumper"" take_from=""Training bolts feeder"" route=""Training bolts quantum""}",`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,,`,,`,,b +,`,`,`,`,`,`,`,`,`,`,`,,,,,`,,`,,,,,`,,`,,`,,d +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,t,`,`,d,R +,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,l,`,`,h +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,d,R +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,,`,,`,,` ,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,`,,`,,`,,` +,`,`,`,`,`,`,c,t,t,c,` +,`,`,`,`,`,`,c,t,t,c,` +,`,`,`,`,`,`,c,t,t,c,` +,`,`,`,`,`,`,c,t,t,c,` ,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,h,`,`,`,`,` ,,,,`,`,,`,` ,`,`,`,`,`,,`,`,`,`,` ,`,`,`,`,`,,`,`,`,`,` @@ -2527,50 +2173,28 @@ query_jail/services_query_jail ,`,`,`,`,`,,`,`,`,`,` ,`,`,`,`,`,,`,`,`,`,` -#> - -,,,,,,,,,,,,,`,"{namezone name=""jail3 well""}",`,,`,,`,"{namezone name=""jail4 well""}",` -,,,,,,,,,,,,,`,`,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,`,"{namezone name=""jail1 well""}",`,,`,,`,"{namezone name=""jail2 well""}",` -,,,,,,,,,,,,,`,`,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,,,`,,,,,,,,,` -,,,,,,,,,,,,,,,,,`,,,,,,,,,` -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,,` -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,`,`,` -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,`,"{namezone name=""hospital well""}",` -,,,,,,,,,,,,,,,`,`,`,`,` -,,,,,,,,,,,,,,,`,`,`,`,` - -"#query label(services_query_stockpiles) start(18; 18) hidden() message(Configure the training ammo stockpile to take from the metalworker quantum on the industry level. Assign a minecart to the training ammo quantum dump with ""assign-minecarts all"") configure stockpiles" - -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,,`,,,,`,,,,`,,,,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,"{quantum name=""training quantum""}",`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,"{quantumstopfromsouth name=""Training quantum""}{givename name=""training dumper""}",`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,nocontainers,{bolts}{forbidmetalbolts}{forbidartifactammo},"{givename name=""training bolts""}",`,`,`,`,`,,`,,`,,`,,` +#place label(services_place2) start(18; 18) hidden() jail food and booze + +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,"c{name=""Jail booze"" barrels=-1 take_from=""Booze""}:+booze(1x2)",,`,`,`,,`,`,` +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,"c{name=""Jail food"" take_from=""Prepared food""}:+preparedmeals(2x1)",,`,,`,`,`,,`,`,` +,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,` +,`,`,`,`,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,~,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,~,~,~,~,~,~,~,~,~,,`,,`,,`,,` ,`,`,`,`,`,`,`,`,`,`,`,,,,,`,,`,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,"{givename name=""garbage dump""}" +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,,,,,,~,,,,,,`,,`,,`,,` ,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,`,,`,,`,,` ,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,` @@ -2579,41 +2203,41 @@ query_jail/services_query_jail ,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,,`,` -,preparedfood,"{givename name=""prepared food""}",`,`,`,,booze,"{givename name=""booze""}",`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` - -"#query label(services_query_dining) start(18; 18) hidden() message(The tavern is restricted to residents only by default. If you'd like your tavern to attract vistors, please go to the (l)ocation menu and change the restriction.) set up dining room/tavern and barracks" - -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,,`,,,,`,,,,`,,,,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,r+&w,r+&w,r+&w,`,r+&w,r+&w,r+&w,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,r{+ 2}&,,,`,`,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,`,,`,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,"r{+ 12}&h{givename name=""grand hall""}lai^l{Up}r^q",,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,` +,~,~,~,~,~,,~,~,~,~,~ +,~,~,~,~,~,,~,~,~,~,~ +,~,~,~,~,~,,~,~,~,~,~ +,~,~,~,~,~,,~,~,~,~,~ +,~,~,~,~,~,,~,~,~,~,~ + +#build label(services_build2) start(18; 18) hidden() message(Remember to enqueue manager orders for this blueprint.) expand each room + +,`,b,`,,`,b,`,,`,b,`,,`,`,`,,`,`,`,,t,l,b,,`,`,`,,`,`,` +,`,h,`,,`,h,`,,`,h,`,,`,`,`,,`,`,`,,c,v,`,,`,`,`,,`,`,` +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,,`,,,,`,,,,`,,,,`,,,,`,,,,d,,,,`,,,,` +,`,`,`,`,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,,` +,`,`,`,`,`,`,`,`,`,`,`,,A,A,A,~,~,~,A,A,A,A,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,c,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,t,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,c,`,` +,`,`,`,`,`,`,`,`,`,`,`,,~,`,`,`,`,`,`,`,h,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,~,`,`,`,~,`,`,`,b +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,b,,b,,b,,~ +,`,`,`,`,`,`,`,`,`,`,`,,,,,`,,`,,,,,d,,d,,d,,~ +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,~,`,`,~,~ +,`,`,`,`,`,l,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,~,`,`,~ +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,~,~ +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,,`,,`,,` ,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,,`,,`,,` ,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,`,,`,,`,,` +,`,c,t,t,c,`,~,~,~,~,` +,`,c,t,t,c,`,~,~,~,~,` +,`,c,t,t,c,`,~,~,~,~,` +,`,c,t,t,c,`,~,~,~,~,` ,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` +,h,`,`,`,`,~,`,`,`,`,h ,,,,`,`,,`,` ,`,`,`,`,`,,`,`,`,`,` ,`,`,`,`,`,,`,`,`,`,` @@ -2621,28 +2245,28 @@ query_jail/services_query_jail ,`,`,`,`,`,,`,`,`,`,` ,`,`,`,`,`,,`,`,`,`,` -#query label(services_query_rented_rooms) start(18; 18) hidden() attach rented rooms to tavern - -,r&l-&,r&l-&,r&l-&,,r&l-&,r&l-&,r&l-&,,r&l-&,r&l-&,r&l-&,,`,`,`,,`,,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,,`,,,,`,,,,`,,,,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,` +#place label(services_place3) start(18; 18) hidden() remaining jail food and booze + +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,`,`,`,,`,`,`,,`,`,`,,`,`,"c{name=""Jail booze"" barrels=-1 take_from=""Booze""}:+booze(1x2)",,`,`,"c{name=""Jail booze"" barrels=-1 take_from=""Booze""}:+booze(1x2)",,`,`,~,,`,`,"c{name=""Jail booze"" barrels=-1 take_from=""Booze""}:+booze(1x2)",,`,`,"c{name=""Jail booze"" barrels=-1 take_from=""Booze""}:+booze(1x2)" +,`,`,`,,`,`,`,,`,`,`,,"c{name=""Jail food"" take_from=""Prepared food""}:+preparedmeals(2x1)",,`,,"c{name=""Jail food"" take_from=""Prepared food""}:+preparedmeals(2x1)",,`,,~,`,`,,"c{name=""Jail food"" take_from=""Prepared food""}:+preparedmeals(2x1)",,`,,"c{name=""Jail food"" take_from=""Prepared food""}:+preparedmeals(2x1)",,` +,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,` +,`,`,`,`,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,~,`,`,`,`,`,,`,,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,,~,~,~,~,~,~,~,~,~,,`,,`,,`,,` ,`,`,`,`,`,`,`,`,`,`,`,,,,,`,,`,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,,,,,,~,,,,,,`,,`,,`,,` ,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,`,,`,,`,,` ,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,` @@ -2651,172 +2275,42 @@ query_jail/services_query_jail ,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` - -"#build label(services_build2) start(18; 18) hidden() build rest of hospital and dining room, doors, prep for jail" - -,~,~,~,,~,~,~,,~,~,~,,`,`,`,,`,,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,v,`,d,`,d,`,v,` -,f,`,h,,f,`,h,,f,`,h,,`,`,`,,`,,`,`,` -,,d,,,,d,,,,d,,,,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,v,`,d,`,d,`,v,`,,`,`,c,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,~,,,,,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,b,~,~,~,`,~,~,~,h,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,b,`,`,`,~,`,`,`,`,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,b,`,`,`,`,`,`,`,`,~,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,b,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,b,`,`,`,`,`,`,`,a,,b,,b,,b,,~ -,`,`,`,`,`,`,`,`,`,`,`,,,,,~,,~,,,,,d,,d,,d,,d -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,~,`,`,`,d,~ -,`,c,t,t,c,`,c,t,t,c,`,~,`,d,`,`,`,`,`,d,`,d,`,`,`,`,`,`,~ -,`,c,t,t,c,`,c,t,t,c,`,,`,,`,`,`,`,`,,`,,`,`,`,~,`,`,`,d,~ -,`,c,t,t,c,`,c,t,t,c,`,~,`,d,`,`,`,`,`,d,`,d,`,`,`,`,`,`,f -,`,c,t,~,~,`,c,t,t,c,`,,,,`,`,`,`,`,,,,`,`,`,t,`,`,`,d,~ +,~,~,~,~,~,,~,~,~,~,~ +,~,~,~,~,~,,~,~,~,~,~ +,~,~,~,~,~,,~,~,~,~,~ +,~,~,~,~,~,,~,~,~,~,~ +,~,~,~,~,~,,~,~,~,~,~ + +#build label(services_build3) start(18; 18) hidden() message(Remember to enqueue manager orders for this blueprint.) finalize furniture + +,b,~,b,,b,~,b,,b,~,b,,t,l,b,,t,l,b,,~,~,~,,t,l,b,,t,l,b +,h,~,h,,h,~,h,,h,~,h,,c,v,`,,c,v,`,,~,~,`,,c,v,`,,c,v,` +,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` +,,d,,,,d,,,,d,,,,d,,,,d,,,,~,,,,d,,,,d +,`,`,`,s,`,`,`,s,`,`,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,,` +,s,`,`,`,`,`,`,`,`,`,s,,~,~,~,~,~,~,~,~,~,~,,`,,j,`,`,`,j +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,,`,`,~,`,` +,s,`,`,`,`,`,`,`,`,`,s,,`,`,`,`,`,`,`,`,`,`,,`,,j,`,~,`,j +,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,d,`,d,`,`,~,`,` +,s,`,`,`,`,`,`,`,`,`,s,,~,h,h,`,`,`,h,h,~,`,,`,,j,`,`,`,j +,`,`,`,`,`,`,`,`,`,`,`,,~,b,b,`,~,`,b,b,~ +,s,`,`,`,`,`,`,`,`,`,s,,`,`,`,`,`,`,`,`,`,,~,,~,,~,,~ +,`,`,`,`,`,`,`,`,`,`,`,,,,,d,,d,,,,,~,,~,,~,,~ +,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,,`,,`,,` +,`,`,`,`,`,`,`,`,`,`,`,d,`,d,`,`,`,`,`,d,`,d,`,`,`,`,`,~,`,`,~,~ +,`,c,t,`,`,~,`,`,t,c,`,,s,,`,`,`,`,`,,s,,`,`,`,~,`,`,~ +,`,c,t,`,`,`,`,`,t,c,`,d,`,d,`,`,`,`,`,d,`,d,`,`,`,`,`,t,`,`,~,~ +,`,c,t,t,c,`,c,t,t,c,`,,,,`,`,`,`,`,,,,`,,`,,`,,` ,`,c,t,t,c,`,c,t,t,c,`,,,,,,`,,,,,,d,,d,,d,,d ,`,c,t,t,c,`,c,t,t,c,`,,,,,,,,,,,,b,,b,,b,,b -,`,c,t,t,c,`,c,t,t,c,` -,`,c,t,t,c,`,c,t,t,c,` -,`,c,t,t,c,`,c,t,t,c,` -,`,c,t,t,c,`,c,t,t,c,` -,`,`,`,`,`,`,`,`,`,`,` -,h,`,`,`,`,~,`,`,`,`,h -,,,,d,d,,d,d -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` - -#> - -,,,,,,,,,,,,,`,`,`,,`,,`,`,` -,,,,,,,,,,,,,`,`,`,d,`,d,`,`,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,`,`,`,,`,,`,`,` -,,,,,,,,,,,,,`,`,`,d,`,d,`,`,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,` -,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,` -,,,,,,,,,,,,,,,,,`,,,,,,,,,` -,,,,,,,,,,,,,,,,,d,,,,,,,,,` -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,,d -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,`,`,` -,,,,,,,,,,,,,,,`,`,`,`,`,,,,,,`,`,` -,,,,,,,,,,,,,,,`,`,`,`,` -,,,,,,,,,,,,,,,`,`,`,`,` - -"#build label(services_build3) start(18; 18) hidden() jail, statues" - -,~,~,~,,~,~,~,,~,~,~,,t,l,b,,`,,t,l,b -,`,`,`,,`,`,`,,`,`,`,,c,~,`,~,`,~,c,~,` -,~,`,~,,~,`,~,,~,`,~,,`,`,`,,`,,`,`,` -,,~,,,,~,,,,~,,,,,,,` -,`,`,`,s,`,`,`,s,`,`,`,,t,l,b,,`,,t,l,b,,j,`,`,`,j -,`,`,`,`,`,`,`,`,`,`,`,,c,~,`,~,`,~,c,~,`,,`,`,~,`,` -,s,`,`,`,`,`,`,`,`,`,s,,`,`,`,,`,,`,`,`,,v,`,t,`,v -,`,`,`,`,`,`,`,`,`,`,`,,,,,,~,,,,,,`,`,c,`,` -,s,`,`,`,`,`,`,`,`,`,s,,~,~,~,~,`,~,~,~,~,,j,`,`,`,j -,`,`,`,`,`,`,`,`,`,`,`,,~,`,`,`,~,`,`,`,`,,,,d -,s,`,`,`,`,`,`,`,`,`,s,,~,`,`,`,`,`,`,`,`,~,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,~,`,`,`,`,`,`,`,` -,s,`,`,`,`,`,`,`,`,`,s,,~,`,`,`,`,`,`,`,~,,~,,~,,~,,~ -,`,`,`,`,`,`,`,`,`,`,`,,,,,~,,~,,,,,~,,~,,~,,~ -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,s,`,~,`,`,`,~,~ -,`,~,~,~,~,`,~,~,~,~,`,~,`,~,`,`,`,`,`,~,`,~,`,`,`,`,`,`,~ -,`,~,~,~,~,`,~,~,~,~,`,,s,,`,`,`,`,`,,s,,`,`,`,~,`,`,`,~,~ -,`,~,~,~,~,`,~,~,~,~,`,~,`,~,`,`,`,`,`,~,`,~,`,`,`,`,`,`,~ -,`,~,~,~,~,`,~,~,~,~,`,,,,`,`,`,`,`,,,,`,s,`,~,`,`,`,~,~ -,`,~,~,~,~,`,~,~,~,~,`,,,,,,`,,,,,,~,,~,,~,,~ -,`,~,~,~,~,`,~,~,~,~,`,,,,,,,,,,,,~,,~,,~,,~ ,`,~,~,~,~,`,~,~,~,~,` ,`,~,~,~,~,`,~,~,~,~,` ,`,~,~,~,~,`,~,~,~,~,` ,`,~,~,~,~,`,~,~,~,~,` ,`,`,`,`,`,`,`,`,`,`,` ,~,`,s,`,`,~,`,`,s,`,~ -,,,,~,~,,~,~ -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` - -#place label(services_place_jail) start(18; 18) hidden() - -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,`,f(1x2),`,`,`,`,`,f(1x2) -,`,`,`,,`,`,`,,`,`,`,,f(2x1),`,`,,`,,f(2x1),`,` -,,`,,,,`,,,,`,,,,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,f(1x2),`,`,`,`,`,f(1x2),,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,f(2x1),`,`,,`,,f(2x1),`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,`,,`,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,,`,`,`,`,` - -#query label(services_query_jail) start(18; 18) hidden() message(Assign the office to the right of the barracks to your Sheriff/Captain of the Guard to use it as your interrogation room) set up barracks and jail - -,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,`,` -,`,`,`,,`,`,`,,`,`,`,,`,"r--&j{givename name=""jail3""}","{booze}{givename name=""booze""}",`,`,`,`,"r--&j{givename name=""jail4""}","{booze}{givename name=""booze""}" -,`,`,`,,`,`,`,,`,`,`,,"{preparedfood}{givename name=""prepared food""}",t{Down 4}&,t{Down 4}&,,`,,"{preparedfood}{givename name=""prepared food""}",t{Down 4}&,t{Down 4}& -,,`,,,,`,,,,`,,,,,,,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,"r--&j{givename name=""jail1""}","{booze}{givename name=""booze""}",`,`,`,`,"r--&j{givename name=""jail2""}","{booze}{givename name=""booze""}",,`,`,"r+&{givename name=""sheriff's office""}",`,` -,`,`,`,`,`,`,`,`,`,`,`,,"{preparedfood}{givename name=""prepared food""}",t{Down 22}{Left 10}&,t{Down 22}{Left 4}&,,`,,"{preparedfood}{givename name=""prepared food""}",t{Left 6}&,t{Left 6}&,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,,,"{givename name=""interrogation""}" -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,`,,`,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,`,,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,,,`,,`,,`,,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,`,`,`,`,`,`,`,`,`,`,` -,,,,`,`,,`,` +,,,,d,d,,d,d ,`,`,`,`,`,,`,`,`,`,` ,`,`,`,`,`,,`,`,`,`,` ,`,`,`,`,`,,`,`,`,`,` @@ -2828,14 +2322,14 @@ query_jail/services_query_jail Screenshot: https://drive.google.com/file/d/17jHiCKeZm6FSS-CI4V0r0GJZh09nzcO_ "" Features: -"- Big rooms, optionally pre-furnished. Double-thick walls to ensure engravings add value to the ""correct"" side. Declare locations from the pre-created meeting zones as needed." +"- Big rooms, optionally pre-furnished. Double-thick walls to ensure engravings add maximum value. Declare locations from the pre-created meeting zones as needed." "" Guildhall Walkthrough: 1) Dig out the rooms with /guildhall1. "" -"2) Once the area is dug out, pre-create the zones and add doors and a few statues with /guildhall2. Run ""quickfort orders"" for /guildhall2." +"2) Once the area is dug out, choose a /guildhall2 variant based on your needs. For your first copy of this level, you probably want /guildhall2_default, which includes temple and library zones. For later copies you probably want to create all locations yourself, so you should choose /guildhall2_no_locations if you want the default furnishings or /guildhall2_custom for a full blank slate. Run ""quickfort orders"" for your chosen variant." "" -"3) Furnish individual rooms manually, or get default furnishings for a variety of room types by running /guildhall3. If you use the default furnishings, also run ""quickfort orders"" for /guildhall3. Declare appropriate locations from the pre-created zones as you need guildhalls, libraries, and temples. If you'd like a ""no specific diety"" temple declared for the top room and a library declared for the bottom room, run /guildhall4. Both locations will be ""Residents only"" by default, but you can change this in the (l)ocation menu if you want them to attract visitors. If you need more rooms, you can dig another /guildhall1 in an unused z-level." +"Note that the default temple and library are created ""Residents only"", but you can change this in the location configuration screen if you want them to attract visitors. If you need more rooms, you can dig another /guildhall1 in an unused z-level." "#dig label(guildhall1) start(15; 15; central stairs) message(Once the area is dug out, continue with /guildhall2.)" @@ -2866,33 +2360,44 @@ Guildhall Walkthrough: ,,d,d,d,d,d,d,d,,,d,d,d,d,d,d,d,,,d,d,d,d,d,d,d -#meta label(guildhall2) +#meta label(guildhall2_default) furnished with default temple and library +locations/guildhall_locations doors/guildhall_doors +furnish/guildhall_furnish +"" +#meta label(guildhall2_no_locations) fully furnished and zoned but no locations zones/guildhall_zones -"#build label(guildhall_doors) start(15; 15; central stairs) hidden() message(Remember to enqueue manager orders for this blueprint. -Smooth/engrave tiles, furnish rooms, and declare locations as required.) build doors" - +doors/guildhall_doors +furnish/guildhall_furnish +"" +#meta label(guildhall2_custom) only zones and doors +zones/guildhall_zones +doors/guildhall_doors +"" +"" +"#zone label(guildhall_locations) start(15; 15; central stairs) hidden() message(The library and temple are restricted to residents only by default. If you'd like them to attract vistors, please go to the location screen and change the restrictions.) declare a library and temple" +,m(9x9),,,,,,,,,"m{location=temple name=""All-inclusive temple"" allow=residents}(9x9)",,,,,,,,,m(9x9) ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,d,d,`,`,`,`,`,`,`,d,d,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,~,~,`,`,`,`,`,`,`,~,~,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -,,,,,,,d,,,,,,d,,d,,,,,,d -,,,,,,,d,,,,,,`,s,`,,,,,,d -,,`,`,`,`,`,`,`,,,,,d,,d,,,,,`,`,`,`,`,`,` +,,,,,,,~,,,,,,~,,~,,,,,,~ +,m(9x9),,,,,,~,,,,,,`,~,`,,,,m(9x9),,~ +,,`,`,`,`,`,`,`,,,,,~,,~,,,,,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,d,`,d,`,,,,`,d,`,d,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,s,,`,,`,,`,,s,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,d,`,d,`,,,,`,d,`,d,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,~,`,~,`,,,,`,~,`,~,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,~,,`,,`,,`,,~,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,~,`,~,`,,,,`,~,`,~,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,,,d,,d,,,,,`,`,`,`,`,`,` -,,,,,,,d,,,,,,`,s,`,,,,,,d -,,,,,,,d,,,,,,d,,d,,,,,,d +,,`,`,`,`,`,`,`,,,,,~,,~,,,,,`,`,`,`,`,`,` +,,,,,,,~,,,,,,`,~,`,,,,,,~ +,m(9x9),,,,,,~,,,m{location=library name=Library allow=residents}(9x9),,,~,,~,,,,m(9x9),,~ ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,d,d,`,`,`,`,`,`,`,d,d,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,~,~,`,`,`,`,`,`,`,~,~,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` @@ -2900,7 +2405,7 @@ Smooth/engrave tiles, furnish rooms, and declare locations as required.) build d ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -#zone label(guildhall_zones) start(15; 15; central stairs) hidden() designate zones +"#zone label(guildhall_zones) start(15; 15; central stairs) hidden() designate zones, ready for custom locations to be assigned" ,m(9x9),,,,,,,,,m(9x9),,,,,,,,,m(9x9) ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` @@ -2930,7 +2435,37 @@ Smooth/engrave tiles, furnish rooms, and declare locations as required.) build d ,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -"#build label(guildhall3) start(15; 15; central stairs) message(Remember to enqueue manager orders for this blueprint.) furnish 4 guildhalls, 3 temples, and a library" +#build label(guildhall_doors) start(15; 15; central stairs) hidden() message(Remember to enqueue manager orders for this blueprint.) build doors + + +,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,d,d,`,`,`,`,`,`,`,d,d,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` +,,,,,,,d,,,,,,d,,d,,,,,,d +,,,,,,,d,,,,,,`,s,`,,,,,,d +,,`,`,`,`,`,`,`,,,,,d,,d,,,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,d,`,d,`,,,,`,d,`,d,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,s,,`,,`,,`,,s,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,d,`,d,`,,,,`,d,`,d,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,,,d,,d,,,,,`,`,`,`,`,`,` +,,,,,,,d,,,,,,`,s,`,,,,,,d +,,,,,,,d,,,,,,d,,d,,,,,,d +,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,d,d,`,`,`,`,`,`,`,d,d,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` + + +"#build label(guildhall_furnish) start(15; 15; central stairs) hidden() furnish 4 guildhalls, 3 temples, and a library" ,,`,`,`,`,s,`,`,,,`,s,`,c,`,`,f,,,`,`,s,`,`,`,` @@ -2960,36 +2495,6 @@ Smooth/engrave tiles, furnish rooms, and declare locations as required.) build d ,,`,`,`,`,s,`,`,,,h,~c,~c,s,~c,~c,h,,,`,`,s,`,`,`,` -"#query label(guildhall4) start(15; 15; central stairs) message(The library and temple are restricted to residents only by default. If you'd like them to attract vistors, please go to the (l)ocation menu and change the restriction.) declare a library and temple" - - -,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,`,^ilat&^l{Up}r^q,,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -,,,,,,,`,,,,,,`,,`,,,,,,` -,,,,,,,`,,,,,,`,`,`,,,,,,` -,,`,`,`,`,`,`,`,,,,,`,,`,,,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,`,,`,,`,,`,,`,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,,`,`,`,`,`,,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,,,`,,`,,,,,`,`,`,`,`,`,` -,,,,,,,`,,,,,,`,`,`,,,,,,` -,,,,,,,`,,,,,,`,,`,,,,,,` -,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,`,^ilal&^l{Up}r^q,,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` -,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,`,,,`,`,`,`,`,`,` - - #notes label(beds_help) Suites for nobles and apartments for the teeming masses Suites screenshot: https://drive.google.com/file/d/1IBqCf6fF3lw7sHiBE_15Euubysl5AAiS @@ -2998,23 +2503,17 @@ Apt. screenshot: https://drive.google.com/file/d/1mDQQXG8BnXqasRGFC9R5N6xNALiswE Features: - Well-appointed suites to satisfy nobles - Apartments with beds and storage to keep dwarves happy and the fortress clean -- Apartments also serve as burial chambers since dwarves like looking at coffins -- Meta blueprint included for designating 5 levels of apartments for a full 200+ dwarves "" Suites Walkthrough: 1) Dig out the suites layer with /suites1. "" -"2) Once the area is dug out, furnish the suites with /suites2. The rooms are left unconfigured so you can assign them to specific nobles. Each room can serve as a bedroom, a dining hall, an office, and/or a tomb. Run ""quickfort orders"" for /suites2." +"2) Once the area is dug out, furnish the suites with /suites2. The rooms are left unzoned so you can configure them for specific nobles. Each room can serve as a bedroom, a dining hall, an office, and/or a tomb. Run ""quickfort orders"" for /suites2." "" Apartments Walkthrough: -"1) Dig out one layer of apartments with /apartments1, or 5 layers at once (enough for 200 dwarves) with by adding ""--repeat down,5"" to the quickfort command." +"1) Dig out one layer of apartments with /apartments1, or 5 layers at once (enough for 200 dwarves) with by adding ""--repeat down,5"" to the quickfort command or adjusting the settings in the gui/quickfort UI." "" -"2) Once a layer is dug out, build beds with /apartments2. Run ""quickfort orders"" for /apartments2." -"" -"3) Once the beds are built, configure the rooms and build the remaining furniture with /apartments3. Run ""quickfort orders"" for /apartments3." -"" -"4) Once the coffins are all in place, run ""burial -pets"" to set them all to accept burials." -"#dig label(suites1) start(18; 18; central ramp) message(Once the area is dug out, run /suites2) noble suites" +"2) Once a layer is dug out, build furniture with /apartments2. Run ""quickfort orders"" for /apartments2." +"#dig label(suites1) start(18; 18; central stairs) message(Once the area is dug out, run /suites2) noble suites" ,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,d,d,d,d,d,d @@ -3050,47 +2549,47 @@ Apartments Walkthrough: ,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,d,d,d,d,d,d -"#meta label(suites2) start(central ramp) message(Remember to enqueue manager orders for this blueprint. -bedrooms are left unconfigured so you can assign them to specific nobles.) build furniture and set traffic patterns" +"#meta label(suites2) start(central stairs) message(Remember to enqueue manager orders for this blueprint. +rooms are left unzoned so you can configure them for specific nobles.) build furniture and set traffic patterns" traffic_suites/suites_traffic build_suites/suites_build -#dig label(suites_traffic) start(18; 18; central ramp) hidden() +#dig label(suites_traffic) start(18; 18; central stairs) hidden() don't path through other dwarves' rooms ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,,,,or,,,,,,or,,,,`,,`,,,,or,,,,,,or,,,,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,,,,or,,,,,,or,,,,`,`,`,,,,or,,,,,,or,,,,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,,,,or,,,,,,or,,,,oh,,oh,,,,or,,,,,,or,,,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,oh,`,oh,or,`,`,`,`,`,,`,`,`,`,`,or,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,,,,,,,,,,,,,oh,`,oh,,,,,,,,,,,,,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,oh,`,oh,or,`,`,`,`,`,,`,`,`,`,`,or,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,,,or,,,,,,or,,,,oh,`,oh,,,,or,,,,,,or,,,,`,` +,`,`,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,`,`,`,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,`,` ,`,`,,`,`,`,`,`,`,`,`,`,`,,`,`,~,`,`,,`,`,`,`,`,`,`,`,`,`,,`,` -,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,`,`,,,,or,,,,,,or,,,,`,`,`,,,,or,,,,,,or,,,,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,`,`,,`,` -,`,`,,,,or,,,,,,or,,,,`,,`,,,,or,,,,,,or,,,,`,` +,`,`,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,`,`,`,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,oh,`,` +,`,`,,,,or,,,,,,or,,,,oh,`,oh,,,,or,,,,,,or,,,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,oh,`,oh,or,`,`,`,`,`,,`,`,`,`,`,or,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,,,,,,,,,,,,,oh,`,oh,,,,,,,,,,,,,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,or,`,`,`,`,`,,`,`,`,`,`,or,oh,`,oh,or,`,`,`,`,`,,`,`,`,`,`,or,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,`,`,`,`,`,,`,`,`,`,`,,oh,`,oh,,`,`,`,`,`,,`,`,`,`,`,,`,` +,`,`,,,,or,,,,,,or,,,,oh,,oh,,,,or,,,,,,or,,,,`,` ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -#build label(suites_build) start(18; 18; central ramp) hidden() +#build label(suites_build) start(18; 18; central stairs) hidden() ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` @@ -3126,150 +2625,316 @@ build_suites/suites_build ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -"#dig label(apartments1) start(18; 18; central ramp) message(Once the area is dug out, continue with /apartments2.) apartment complex" - -,,,,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,,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 -,,,,,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,,d,d,d,,d,d,d,,d,d,d,,d,d,d +"#dig label(apartments1) start(18; 18; central stairs) message(Once the area is dug out, continue with /apartments2.) apartment complex" + +,,,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 +,,,,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,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,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,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,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,,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,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,,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,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,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,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,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,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,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d - -"#build label(apartments2) start(18; 18; central ramp) message(Remember to enqueue manager orders for this blueprint. -Once beds have been placed, continue with /apartments3.) build beds" - -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,`,b,`,,`,b,`,,`,b,`,,`,b,`,,`,b,`,,`,b,`,,`,b,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,` -,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,`,b,`,,`,b,`,,`,b,`,,`,`,`,,`,b,`,,`,b,`,,`,b,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,,,,,,,,,,,,,`,`,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,`,b,`,,`,b,`,,`,b,`,,`,`,`,,`,b,`,,`,b,`,,`,b,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,,`,,`,`,`,,`,`,`,,`,`,` -,,,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,` -,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,` -,`,b,`,`,`,`,`,`,`,`,`,`,`,,`,`,~,`,`,,`,`,`,`,`,`,`,`,`,`,`,b,` -,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,` -,,,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,,`,,`,`,`,,`,`,`,,`,`,` -,,,,`,b,`,,`,b,`,,`,b,`,,`,`,`,,`,b,`,,`,b,`,,`,b,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,,,,,,,,,,,,,`,`,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,`,b,`,,`,b,`,,`,b,`,,`,`,`,,`,b,`,,`,b,`,,`,b,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,` -,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,`,b,`,,`,b,`,,`,b,`,,`,b,`,,`,b,`,,`,b,`,,`,b,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` - -#meta label(apartments3) start(central ramp) message(Remember to enqueue manager orders for this blueprint.) configure rooms and build remaining furniture -query_apartments/apartments_rooms -build2_apartments/apartments_build2 -#query label(apartments_rooms) start(18; 18) hidden() configure rooms - -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,`,r-&,`,,`,r-&,`,,`,r-&,`,,`,r-&,`,,`,r-&,`,,`,r-&,`,,`,r-&,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,` -,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,`,r-&,`,,`,r-&,`,,`,r-&,`,,`,`,`,,`,r-&,`,,`,r-&,`,,`,r-&,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,,,,,,,,,,,,,`,`,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,`,r-&,`,,`,r-&,`,,`,r-&,`,,`,`,`,,`,r-&,`,,`,r-&,`,,`,r-&,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,,`,,`,`,`,,`,`,`,,`,`,` -,,,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,` -,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,` -,`,r-&,`,`,`,`,`,`,`,`,`,`,`,,`,`,~,`,`,,`,`,`,`,`,`,`,`,`,`,`,r-&,` -,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,` -,,,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,,`,,`,`,`,,`,`,`,,`,`,` -,,,,`,r-&,`,,`,r-&,`,,`,r-&,`,,`,`,`,,`,r-&,`,,`,r-&,`,,`,r-&,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,,,,,,,,,,,,,`,`,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,`,r-&,`,,`,r-&,`,,`,r-&,`,,`,`,`,,`,r-&,`,,`,r-&,`,,`,r-&,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,` -,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,`,,,,`,,,,`,,,,`,,,,`,,,,`,,,,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` -,,,,`,r-&,`,,`,r-&,`,,`,r-&,`,,`,r-&,`,,`,r-&,`,,`,r-&,`,,`,r-&,` -,,,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,` - -"#build label(apartments_build2) start(18; 18) hidden() message(Coffins should be configured with DFHack ""burial"" script) build remaining furniture" - -,,,,n,`,h,,n,`,h,,n,`,h,,n,`,h,,n,`,h,,n,`,h,,n,`,h -,,,,`,~,`,,`,~,`,,`,~,`,,`,~,`,,`,~,`,,`,~,`,,`,~,` -,,,,n,`,f,,n,`,f,,n,`,f,,n,`,f,,n,`,f,,n,`,f,,n,`,f -,,,,,d,,,,d,,,,d,,,,d,,,,d,,,,d,,,,d -,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,`,`,`,`,`,`,`,`,`,`,`,`,s,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,d,,,,d,,,,d,,,`,`,`,,,d,,,,d,,,,d -,,,,n,`,h,,n,`,h,,n,`,h,,`,`,`,,n,`,h,,n,`,h,,n,`,h -,,,,`,~,`,,`,~,`,,`,~,`,,`,s,`,,`,~,`,,`,~,`,,`,~,` -,,,,n,`,f,,n,`,f,,n,`,f,,`,`,`,,n,`,f,,n,`,f,,n,`,f +,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,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,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,,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 + +#meta label(apartments2) start(central stairs) zone rooms and build furniture +zone_apartments/apartments_rooms +build_apartments/apartments_build +#zone label(apartments_rooms) start(18; 18; central stairs) hidden() zone rooms +,,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5) +,,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,,,,`,,,`,,,`,,,`,,,`,,`,,,`,,,`,,,`,,,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +b(4x5),,`,b(4x5),,`,b(4x5),,`,b(4x5),,`,b(4x5),,`,,`,`,`,b(4x5),`,,b(4x5),`,,b(4x5),`,,b(4x5),`,,b(4x5),` +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +b(4x5),,,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5),,,,`,`,`,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5) +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,`,`,,`,`,,`,`,,`,`,,`,`,,`,,`,,`,`,,`,`,,`,`,,`,`,,`,` +,`,,,`,,,`,,,`,,,`,,,`,`,`,,,`,,,`,,,`,,,`,,,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,~,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +b(4x5),`,,b(4x5),`,,b(4x5),`,,b(4x5),`,,b(4x5),`,,,`,`,`,b(4x5),,`,b(4x5),,`,b(4x5),,`,b(4x5),,`,b(4x5),,` +,`,`,,`,`,,`,`,,`,`,,`,`,,`,,`,,`,`,,`,`,,`,`,,`,`,,`,` +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +b(4x5),,,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5),,,,`,`,`,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5),,,b(4x5) +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,,`,,,`,,,`,,,`,,,`,,`,`,`,,`,,,`,,,`,,,`,,,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,b(4x5),,`,b(4x5),,`,b(4x5),,`,b(4x5),,`,b(4x5),,`,b(4x5),`,,b(4x5),`,,b(4x5),`,,b(4x5),`,,b(4x5),` +,,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,` + +#build label(apartments_build) start(18; 18; central stairs) hidden() message(Remember to enqueue manager orders for this blueprint.) build furniture + +,,,f,h,,f,h,,f,h,,f,h,,f,h,,h,f,,h,f,,h,f,,h,f,,h,f +,,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,,,b,`,,b,`,,b,`,,b,`,,b,`,,`,b,,`,b,,`,b,,`,b,,`,b +,,,,`,,,`,,,`,,,`,,,`,,`,,,`,,,`,,,`,,,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,`,,,`,,,`,,,`,,,`,,`,`,`,,`,,,`,,,`,,,`,,,` +,b,`,,b,`,,b,`,,b,`,,b,`,,`,`,`,,`,b,,`,b,,`,b,,`,b,,`,b +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,f,h,,f,h,,f,h,,f,h,,f,h,,`,`,`,,h,f,,h,f,,h,f,,h,f,,h,f ,,,,,,,,,,,,,,,,`,`,` -,,,,n,`,h,,n,`,h,,n,`,h,,`,s,`,,n,`,h,,n,`,h,,n,`,h -,,,,`,~,`,,`,~,`,,`,~,`,,`,`,`,,`,~,`,,`,~,`,,`,~,` -,,,,n,`,f,,n,`,f,,n,`,f,,d,,d,,n,`,f,,n,`,f,,n,`,f -,,,,,d,,,,d,,,,d,,,`,`,`,,,d,,,,d,,,,d -,n,`,h,,`,`,`,`,`,`,`,`,`,d,`,`,`,`,`,d,`,`,`,`,`,`,`,`,`,,n,`,h -,`,~,`,d,`,s,`,`,s,`,`,s,`,,`,`,~,`,`,,`,s,`,`,s,`,`,s,`,d,`,~,` -,n,`,f,,`,`,`,`,`,`,`,`,`,d,`,`,`,`,`,d,`,`,`,`,`,`,`,`,`,,n,`,f -,,,,,d,,,,d,,,,d,,,`,`,`,,,d,,,,d,,,,d -,,,,n,`,h,,n,`,h,,n,`,h,,d,,d,,n,`,h,,n,`,h,,n,`,h -,,,,`,~,`,,`,~,`,,`,~,`,,`,`,`,,`,~,`,,`,~,`,,`,~,` -,,,,n,`,f,,n,`,f,,n,`,f,,`,s,`,,n,`,f,,n,`,f,,n,`,f +,h,f,,h,f,,h,f,,h,f,,h,f,,`,`,`,,f,h,,f,h,,f,h,,f,h,,f,h +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,`,b,,`,b,,`,b,,`,b,,`,b,,`,,`,,b,`,,b,`,,b,`,,b,`,,b,` +,`,,,`,,,`,,,`,,,`,,,`,`,`,,,`,,,`,,,`,,,`,,,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,~,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,`,,,`,,,`,,,`,,,`,,,`,`,`,,,`,,,`,,,`,,,`,,,` +,`,b,,`,b,,`,b,,`,b,,`,b,,`,,`,,b,`,,b,`,,b,`,,b,`,,b,` +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,h,f,,h,f,,h,f,,h,f,,h,f,,`,`,`,,f,h,,f,h,,f,h,,f,h,,f,h ,,,,,,,,,,,,,,,,`,`,` -,,,,n,`,h,,n,`,h,,n,`,h,,`,`,`,,n,`,h,,n,`,h,,n,`,h -,,,,`,~,`,,`,~,`,,`,~,`,,`,s,`,,`,~,`,,`,~,`,,`,~,` -,,,,n,`,f,,n,`,f,,n,`,f,,`,`,`,,n,`,f,,n,`,f,,n,`,f -,,,,,d,,,,d,,,,d,,,`,`,`,,,d,,,,d,,,,d -,,,,,`,`,`,`,`,`,`,`,`,`,`,`,s,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` -,,,,,d,,,,d,,,,d,,,,d,,,,d,,,,d,,,,d -,,,,n,`,h,,n,`,h,,n,`,h,,n,`,h,,n,`,h,,n,`,h,,n,`,h -,,,,`,~,`,,`,~,`,,`,~,`,,`,~,`,,`,~,`,,`,~,`,,`,~,` -,,,,n,`,f,,n,`,f,,n,`,f,,n,`,f,,n,`,f,,n,`,f,,n,`,f +,f,h,,f,h,,f,h,,f,h,,f,h,,`,`,`,,h,f,,h,f,,h,f,,h,f,,h,f +,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,b,`,,b,`,,b,`,,b,`,,b,`,,`,`,`,,`,b,,`,b,,`,b,,`,b,,`,b +,,`,,,`,,,`,,,`,,,`,,`,`,`,,`,,,`,,,`,,,`,,,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` +,,,,`,,,`,,,`,,,`,,,`,,`,,,`,,,`,,,`,,,` +,,,b,`,,b,`,,b,`,,b,`,,b,`,,`,b,,`,b,,`,b,,`,b,,`,b +,,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,`,,`,` +,,,f,h,,f,h,,f,h,,f,h,,f,h,,h,f,,h,f,,h,f,,h,f,,h,f + +#notes label(crypt_help) +Places to rest your dead +Screenshot: https://drive.google.com/file/d/1IBqCf6fF3lw7sHiBE_15Euubysl5AAiS +"" +Features: +"- Staged crypt expansion that grows with your, um, need" +- 52 tombs in stage 1 +- 160 additional tombs in stage 2 (212 tombs total) +- Extendable in any direction by applying the blueprints multiple times +"" +Crypt Walkthrough: +1) Dig out the layer with /crypt1. +"" +"2) Once the area is dug out, add initial tombs with /crypt2." +"" +"3) If/when you need additional tombs, apply /crypt3." +"#dig label(crypt1) start(18; 18; central stairs) message(Once the area is dug out, continue with /crypt2.) crypt complex" + +,,,,,,,,,,,,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,,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,,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,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,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 +,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,,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,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,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,,d,,d,,d,,d,,d +,,,,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d + +#meta label(crypt2) start(central stairs) small crypt that can be extended later +zone/crypt_zone +build/crypt_build +"" +#meta label(crypt3) start(central stairs) crypt extension +zone_extended/crypt_extended_zone +build_extended/crypt_extended_build +#zone label(crypt_zone) start(18; 18; central stairs) hidden() zone tombs + + + + + + + + + +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,,,,,,,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,` +,,,,,,,,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,,,,,,,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,`,`,`,,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,`,`,`,`,`,`,,,,`,`,`,,,,`,`,`,`,`,` +,,,,,,,,T{pets=true}(1x1),,T{pets=true}(1x1),,`,`,`,`,,,,`,`,`,`,,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,,,,,,`,`,`,`,,~,,`,`,`,` +,,,,,,,,T{pets=true}(1x1),,T{pets=true}(1x1),,`,`,`,`,,,,`,`,`,`,,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,`,`,`,`,`,`,,,,`,`,`,,,,`,`,`,`,`,` +,,,,,,,,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,`,`,`,,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,,,,,,,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,` +,,,,,,,,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` + + + + + + + + + +#build label(crypt_build) start(18; 18; central stairs) hidden() message(Remember to enqueue manager orders for this blueprint.) build urns + + + + + + + + + +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,,,,,,,n,,n,,`,,n,,n,,n,,n,,`,,n,,n +,,,,,,,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,` +,,,,,,,,n,,n,,`,,n,,n,,n,,n,,`,,n,,n +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,,,,,,,n,,n,,`,,n,,`,s,`,,n,,`,,n,,n +,,,,,,,`,`,`,`,`,`,,,,`,`,`,,,,`,`,`,`,`,` +,,,,,,,,n,,n,,`,`,`,`,,,,`,`,`,`,,n,,n +,,,,,,,,,,,,`,`,s,`,,~,,`,s,`,` +,,,,,,,,n,,n,,`,`,`,`,,,,`,`,`,`,,n,,n +,,,,,,,`,`,`,`,`,`,,,,`,`,`,,,,`,`,`,`,`,` +,,,,,,,,n,,n,,`,,n,,`,s,`,,n,,`,,n,,n +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,,,,,,,n,,n,,`,,n,,n,,n,,n,,`,,n,,n +,,,,,,,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,` +,,,,,,,,n,,n,,`,,n,,n,,n,,n,,`,,n,,n +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` + + + + + + + + + +#zone label(crypt_extended_zone) start(18; 18; central stairs) hidden() zone more tombs + +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,~,,~,,`,,~,,~,,~,,~,,`,,~,,~,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,~,,~,,`,,~,,~,,~,,~,,`,,~,,~,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,~,,~,,`,,~,,`,`,`,,~,,`,,~,,~,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,~,,~,,`,`,`,`,,,,`,`,`,`,,~,,~,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,,,,,,`,`,`,`,,~,,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,~,,~,,`,`,`,`,,,,`,`,`,`,,~,,~,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,~,,~,,`,,~,,`,`,`,,~,,`,,~,,~,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,~,,~,,`,,~,,~,,~,,~,,`,,~,,~,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,~,,~,,`,,~,,~,,~,,~,,`,,~,,~,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,`,,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1),,T{pets=true}(1x1) +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` + +#build label(crypt_extended_build) start(18; 18; central stairs) hidden() message(Remember to enqueue manager orders for this blueprint.) build more urns + +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,n,,n,,`,,n,,n,,n,,n,,`,,n,,n,,n,,n,,n +,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,n,,n,,`,,n,,n,,n,,n,,`,,n,,n,,n,,n,,n +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,n,,n,,`,,n,,n,,n,,n,,`,,n,,n,,n,,n,,n +,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,n,,n,,`,,n,,n,,n,,n,,`,,n,,n,,n,,n,,n +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,~,,~,,`,,~,,~,,~,,~,,`,,~,,~,,n,,n,,n +,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,~,,~,,`,,~,,~,,~,,~,,`,,~,,~,,n,,n,,n +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,~,,~,,`,,~,,`,~,`,,~,,`,,~,,~,,n,,n,,n +,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,~,,~,,`,`,`,`,,,,`,`,`,`,,~,,~,,n,,n,,n +,,,,,,,,,,,,`,`,~,`,,~,,`,~,`,` +,,n,,n,,n,,~,,~,,`,`,`,`,,,,`,`,`,`,,~,,~,,n,,n,,n +,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,~,,~,,`,,~,,`,~,`,,~,,`,,~,,~,,n,,n,,n +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,~,,~,,`,,~,,~,,~,,~,,`,,~,,~,,n,,n,,n +,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,~,,~,,`,,~,,~,,~,,~,,`,,~,,~,,n,,n,,n +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,n,,n,,`,,n,,n,,n,,n,,`,,n,,n,,n,,n,,n +,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,n,,n,,`,,n,,n,,n,,n,,`,,n,,n,,n,,n,,n +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,n,,n,,`,,n,,n,,n,,n,,`,,n,,n,,n,,n,,n +,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,` +,,n,,n,,n,,n,,n,,`,,n,,n,,n,,n,,`,,n,,n,,n,,n,,n +,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,` From 25530d6e7be72a8839ea9975e2dc74789a23d934 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 7 Jun 2023 12:26:49 -0700 Subject: [PATCH 0054/4620] guide update - first draft --- docs/guides/quickfort-user-guide.rst | 1362 ++++++++++++++++---------- library/xml | 2 +- scripts | 2 +- 3 files changed, 822 insertions(+), 544 deletions(-) diff --git a/docs/guides/quickfort-user-guide.rst b/docs/guides/quickfort-user-guide.rst index ec416f18fb..a06413d402 100644 --- a/docs/guides/quickfort-user-guide.rst +++ b/docs/guides/quickfort-user-guide.rst @@ -4,12 +4,12 @@ Quickfort blueprint creation guide ================================== -`Quickfort ` is a DFHack script that helps you build fortresses from +`Quickfort ` is a DFHack tool that helps you build fortresses from "blueprint" .csv and .xlsx files. Many applications exist to edit these files, such as MS Excel and `Google Sheets `__. Most layout and building-oriented DF commands are supported through the use of multiple files or -spreadsheets, each describing a different phase of DF construction: designation, -building, placing stockpiles/zones, and setting configuration. +spreadsheets, each describing a different phase of DF construction: designating +digging, defining zones, placing stockpiles, and building. The original idea came from :wiki:`Valdemar's ` auto-designation macro. Joel Thornton reimplemented the core logic in Python and extended its @@ -21,51 +21,44 @@ interacts with Dwarf Fortress memory structures directly, allowing for instantaneous blueprint application, error checking and recovery, and many other advanced features. -This guide focuses on DFHack Quickfort's capabilities and teaches players how -to understand and create blueprint files. Some of the text was originally -written by Joel Thornton, reused here with his permission. +This guide focuses on DFHack Quickfort's capabilities and blueprint syntax, and +teaches players how to understand and create blueprint files. Some of the text +was originally written by Joel Thornton, reused here with his permission. -For those just looking to apply existing blueprints, check out the `quickfort -command's documentation ` for syntax. There are also many -ready-to-use blueprints available in the ``hack/data/blueprints`` subfolder in -your DFHack installation. Browse them on your computer or -:source:`online `, or run `gui/quickfort` to browse -and apply them to your fort! +If you are just looking to apply existing blueprints to your fort, check out +`gui/quickfort` (or `quickfort` for the commandline version). There are many +ready-to-use blueprints available in the `quickfort-library-guide` distributed +with DFHack. Before you become an expert at writing blueprints, though, you should know that the easiest way to make a quickfort blueprint is to build your plan "for real" -in Dwarf Fortress and then export your map using the DFHack `blueprint` plugin. -You can apply those blueprints as-is in your next fort, or you can fine-tune -them with additional features from this guide. +in Dwarf Fortress and then export your map using `gui/blueprint`. You can apply +those blueprints as-is in your next fort, or you can fine-tune them with +additional features from this guide. See the `Links`_ section for more information and online resources. - .. contents:: Table of Contents :local: :depth: 2 - Features -------- - General - - Manages blueprints to handle all phases of DF construction - - Supports .csv and multi-worksheet .xlsx blueprint files + - Blueprint modes for all phases of fort design + - Read blueprints from .csv or multi-worksheet .xlsx files - Near-instant application, even for very large and complex blueprints - Blueprints can span multiple z-levels - - You can package all blueprints and keystroke aliases needed for an entire - fortress in a single file for easy sharing - - "meta" blueprints that simplify the application of sequences of blueprints - - Undo functionality for dig, build, place, and zone blueprints - - Rotate blueprints or flip them around to your preference when you apply - them to the map - - Automatic cropping of blueprints so you don't get errors if the blueprint - extends off the map - - Can generate manager orders for everything required by a build blueprint + - Easy sharing of blueprints with multi-blueprint files + - Scripted application of sequences of blueprints + - Easy undo + - Rotate blueprints or flip them around + - Automatic cropping of blueprints that extend off the map + - Generate manager orders for items required by a blueprint - Includes a library of ready-to-use blueprints - - Blueprint debugging features + - Blueprint debugging - Dig mode @@ -76,58 +69,44 @@ Features - Handles carving arbitrarily complex minecart tracks, including tracks that cross other tracks +- Zone and place modes + + - Define zones and stockpiles of any shape, not just rectangles + - Configurable numbers of bins, barrels and wheelbarrows assigned to created + stockpiles + - Automatic splitting of stockpiles that exceed maximum dimension limits + - Create and attach locations to zones + - Full control over stockpile configuration based on the `stockpiles` + settings library + - Configurable zone/location settings, such as the pit/pond toggle or + hospital supply quantities + - Build mode - - Fully integrated with DFHack buildingplan: you can place buildings before - manufacturing building materials and you can use the buildingplan UI for - setting materials preferences + - Integrated with DFHack `buildingplan`: you can place buildings before + manufacturing building materials and you can use the `buildingplan` UI + for setting materials and quality preferences - Designate entire constructions in mid-air without having to wait for each tile to become supported - Automatic expansion of building footprints to their minimum dimensions, so only the center tile of a multi-tile building needs to be recorded in the blueprint - Tile occupancy and validity checking so, for example, buildings that - cannot be placed on a target tile will be skipped instead of messing up - the blueprint. Blueprints that are only partially applied for any reason - (e.g. you need to dig out some more tiles) can be safely reapplied to - build the remaining buildings. + cannot be placed on a target tile will be skipped instead of causing + errors and interrupting the blueprint. Blueprints that are only partially + applied for any reason (e.g. you need to dig out some more tiles) can be + safely reapplied to build the remaining buildings. - Relaxed rules for farm plot and road placement: you can still place the building even if an invalid tile (e.g. stone tiles for farm plots) splits the designated area into two disconnected parts - Intelligent boundary detection for adjacent buildings of the same type (e.g. a 6x6 block of ``wj`` cells will be correctly split into 4 jeweler's workshops) + - Set building properties (such as a name) + - Attach track stops to hauling routes -- Place and zone modes - - - Define stockpiles and zones of any shape, not just rectangles - - Configurable numbers of bins, barrels and wheelbarrows assigned to created - stockpiles - - Automatic splitting of stockpiles and zones that exceed maximum dimension - limits - - Fully configurable zone settings, such as pit/pond and hospital supply - counts - -- Query mode - - - Send arbitrary keystroke sequences to the UI -- *anything* you can do - through the UI is supported - - Supports aliases to simplify frequent keystroke combos - - Includes a library of pre-made and tested aliases to simplify most common - tasks, such as configuring stockpiles for important item types or creating - hauling routes for quantum stockpiles. - - Supports expanding aliases in other aliases for easy management of common - subsequences - - Supports repeating key sequences a specified number of times - - Skips sending keys when the cursor is over a tile that does not have a - stockpile or building, so missing buildings won't desynchronize your - blueprint - - Instant halting of query blueprint application when keystroke errors are - detected, such as when a mistake in a key sequence leaves us stuck in a - submenu, to make query blueprints easier to debug - -Creating blueprints -------------------- +Introduction to blueprints +-------------------------- We recommend using a spreadsheet editor such as Excel, `Google Sheets `__, or `LibreOffice `__ @@ -138,29 +117,27 @@ line (or upper-left cell) of the spreadsheet should look like this:: #dig -The keyword ``dig`` tells Quickfort we are going to be using the Designations -menu in DF. The following "mode" keywords are understood: +The keyword ``dig`` tells Quickfort we are going to be specifying designations. +The following "mode" keywords are understood: ============== =========== Blueprint mode Description ============== =========== -dig Designations menu (:kbd:`d`) -build Build menu (:kbd:`b`) -place Place stockpiles menu (:kbd:`p`) -zone Activity zones menu (:kbd:`i`) -query Set building tasks/prefs menu (:kbd:`q`) +dig Designations (digging, traffic, dumping, etc.) +build Constructions, buildings, and furniture +place Stockpiles +zone Activity zones ============== =========== If no modeline appears in the first cell, Quickfort assumes that it's looking at a ``#dig`` blueprint. There are also other modes that don't directly correspond to Dwarf Fortress -menus, but we'll talk about those `later `. +design operations, but we'll talk about those `later `. If you like, you may enter a comment after the mode keyword. This comment will -appear in the output of ``quickfort list`` when run from the ``DFHack#`` prompt -or in the dialog window when running `gui/quickfort`. You can use this space for -explanations, attribution, etc.:: +appear in the output of ``quickfort list`` or in the dialog window when running +`gui/quickfort`. You can use this space for explanations, attribution, etc.:: #dig grand dining room @@ -176,12 +153,31 @@ readability, but a real .csv file would have commas):: d d d d # # # # # # +The letter ``d`` here stands for "dig". The character sequences in these +blueprints are based on the old (pre-v50) keyboard shortcuts for the various DF +menus. Please see the `quickfort_guide_appendix` below for a full listing. + Note the :kbd:`#` symbols at the right end of each row and below the last row. These are completely optional, but can be helpful to make the row and column positions clear. -Once the dwarves have that dug out, let's build a walled-in bedroom within our -dug-out area:: +Once the dwarves have that dug out, let's zone it as a bedroom:: + + #zone + b b b b # + b b b b # + b b b b # + b b b b # + # # # # # + +This looks very similar to the ``#dig`` blueprint above, but with ``b``s +instead of ``d``s. The ``b``s mark the area for a ``b``edroom zone just like +the ``#dig`` blueprint marked the area for digging. It's important to wait +until after the area is completely dug out before applying further blueprints +since zones can't be applied to hidden tiles and furniture can't be built in +undug walls. + +Now, let's add some walls and furniture:: #build Cw Cw Cw Cw # @@ -190,17 +186,17 @@ dug-out area:: Cw Cw Cw # # # # # # -Note my generosity -- in addition to the bed (:kbd:`b`) I've built a container -(:kbd:`h`) here for the dwarf as well. You must use the full series of keys -needed to build something in each cell, e.g. :kbd:`C`:kbd:`w` indicates we -should enter DF's constructions submenu (:kbd:`C`) and select walls (:kbd:`w`). +The :kbd:`C`:kbd:`w` cells represent the constructed walls, leaving space for a +door that we might want to add later. And note my generosity -- in addition to +the bed (:kbd:`b`) I've built a container (:kbd:`h`) here for the dwarf as +well. -I'd also like to place a booze stockpile in the 2 unoccupied tiles in the room:: +Finally, let's place a booze stockpile in the 2 unoccupied tiles in the room:: - #place Place a food stockpile + #place personal booze stockpile ` ` ` ` # ` ~ ~ ` # - ` f f ` # + ` f f{name="bedroom booze"}:=booze ` ` ` # # # # # # @@ -213,45 +209,19 @@ multilayer or fortress-wide blueprint layouts as "chalk lines". QF is smart enough to recognize this as a 2x1 food stockpile, and creates it as such rather than as two 1x1 food stockpiles. Quickfort treats any connected region of identical designations as a single entity. The tiles can be connected -orthogonally or diagonally, just as long as they are touching. +orthogonally or diagonally, just as long as they are touching. You can also +treat disconnected segments as belonging to the same stockpile, but we'll get +into that later. -Lastly, let's turn the bed into a bedroom and set the food stockpile to hold -only booze. +Now what's all that business attached to the second ``f``? The part between the +curly brackets specifies properties, in this case the name that we want to give +the stockpile. The remaining part, from the colon (``:``) onward, applies the +``booze`` preset from the `stockpiles` library. That will configure the +stockpile to accept only booze. You can use presets (along with other options +that we'll go over later) to configure stockpiles however you want, directly +from the ``#place`` blueprint. -:: - - #query - ` ` ` ` # - ` r& ` # - ` booze # - ` ` ` ` # - # # # # # - -In row 2, column 2 we have ``r&``. This sends the :kbd:`r` key to DF when the -cursor is over the bed, causing us to "make room" and :kbd:`Enter`, represented -by special ``&`` alias, to indicate that we're done setting the size (the -default room size is fine here). - -In column 2, row 3 we have ``booze``. This is one of many alias keywords defined -in the included :source:`aliases library `. -This particular alias sets a food stockpile to accept only booze. It sends the -keys needed to navigate DF's stockpile settings menu, and then it sends an -Escape character to exit back to the map. It is important to exit out of any -menus that you enter while in query mode so that the cursor can move to the next -tile when it is done with the current tile. - -If there weren't an alias named ``booze`` then the literal characters -:kbd:`b`:kbd:`o`:kbd:`o`:kbd:`z`:kbd:`e` would have been sent, so be sure to -spell those aliases correctly! - -You can save a lot of time and effort by using aliases instead of adding all -key sequences directly to your blueprints. For more details, check out the -`quickfort-alias-guide`. You can also see examples of aliases being used in the -query blueprints in the -:source:`DFHack blueprint library `. You can create -your own aliases by adding them to :source:`dfhack-config/quickfort/aliases.txt` -in your DFHack folder or you can package them -`together with your blueprint files `. +And that's it! You now have a series of blueprints that you can "stamp" across your fort to quickly build new bedrooms. Area expansion syntax ~~~~~~~~~~~~~~~~~~~~~ @@ -273,7 +243,7 @@ In Quickfort, the following blueprints are equivalent:: The second example uses Quickfort's "area expansion syntax", which takes the form:: - keys(WxH) + text(WxH) Note that area expansion syntax can only specify rectangular areas. If you want to create extent-based structures (e.g. farm plots or stockpiles) in different @@ -333,6 +303,36 @@ blueprint could also be written as:: ga(4x-2) ` # # # # # # +Property syntax +~~~~~~~~~~~~~~~ + +Many things you can designate with `quickfort` are configurable. All buildings, +stockpiles, and zones, for example, can be named. These configuration elements +are expressed as properties. + +Properties are written between curly brackets (``{}``). There can be multiple +properties defined between those brackets, separated by spaces. Each property +has a name and a value, with an equal sign to connect them. If a property value +has a space within it, it should be surrounded by double quotes (``"``). + +If you have defined the area of something over multiple spreadsheet cells, you +can specify properties in just one of those cells and they will apply to the +whole object. You can even split properties up among multiple cells if that is +more convenient. If you are using expansion syntax, the expansion part always +goes last. + +Here's an example of a seed stockpile that is configured to take from a seed feeder stockpile:: + + #place + f{name=Seeds links_only=true}:=seeds(3x2) + + f + f{name="Seeds feeder" give_to=Seeds}:=seeds + f{containers=0} + +Different modes and different types may have different properties that you can +configure. See the `quickfort_guide_appendix` for a full list. + Automatic area expansion ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -406,15 +406,21 @@ You can go up or down multiple levels by adding a number after the ``<`` or #>2 r(10x10) +#dig mode +--------- + +``#dig`` blueprints are normally the first step in any design. They define the +boundaries and layouts for the blueprints for later stages of construction. Despite their name, ``#dig``` blueprints are for more than just digging. They also handle smoothing, carving, traffic designations, and marking items on the ground for dumping, forbidding, or other similar tags. See the full list of supported designations in the `#dig mode reference`_. + .. _quickfort-dig-priorities: Dig priorities ~~~~~~~~~~~~~~ -DF designation priorities are supported for ``#dig`` blueprints. The full syntax -is ``[letter][number][expansion]``, where if the ``letter`` is not specified, +DF designation priorities are supported in ``#dig`` blueprints. The full syntax +is ``[symbol][number][expansion]``, where if the ``symbol`` is not specified, ``d`` is assumed, and if ``number`` is not specified, ``4`` is assumed (the -default priority). So each of these blueprints is equivalent:: +default priority). So all of these blueprints are equivalent:: #dig dig the interior of the room at high priority d d d d d # @@ -457,222 +463,24 @@ center of the room marked for digging later:: d d d d d # # # # # # # -Then you can use "Toggle Standard/Marking" (:kbd:`d`:kbd:`M`) to convert the -center tiles to regular designations at your leisure. +Then you can use DF's "Toggle Standard/Marking" icons (DF calls them +"blueprints", but hopefully that won't get too confusing in this context) to +convert the center tiles to regular designations at your leisure. To apply an entire dig blueprint in marker mode, regardless of what the blueprint itself says, you can set the global quickfort setting -``force_marker_mode`` to ``true`` before you apply the blueprint. +``force_marker_mode`` to ``true`` before you apply the blueprint by running +``quickfort set force_marker_mode true``. -Note that the in-game UI setting "Standard/Marker Only" (:kbd:`d`:kbd:`m`) does -not have any effect on quickfort. +Note that the state of the in-game vanilla button that you use to draw +designations in either Standard or "Blueprint" mode does not have any effect on +`quickfort`. -Stockpiles and zones -~~~~~~~~~~~~~~~~~~~~ - -It is very common to have stockpiles that accept multiple categories of items or -zones that permit more than one activity. Although it is perfectly valid to -declare a single-purpose stockpile or zone and then modify it with a ``#query`` -blueprint, quickfort also supports directly declaring all the types in the -``#place`` and ``#zone`` blueprints. For example, to declare a 20x10 stockpile -that accepts both corpses and refuse, you could write:: - - #place refuse heap - yr(20x10) - -And similarly, to declare a zone that is a pasture, a fruit picking area, and a -meeting area all at once:: - - #zone main pasture and picnic area - nmg(10x10) - -The order of the individual letters doesn't matter. If you want to configure the -stockpile from scratch in a ``#query`` blueprint, you can place unconfigured -"custom" stockpiles with (:kbd:`c`). It is more efficient, though, to place -stockpiles using the keys that represent the categories of items that you want -to store, and then only use a ``#query`` blueprint if you need fine-grained -customization. - -.. _quickfort-place-containers: - -Stockpile bins, barrels, and wheelbarrows -````````````````````````````````````````` - -Quickfort has global settings for default values for the number of bins, -barrels, and wheelbarrows assigned to stockpiles, but these numbers can be set -for individual stockpiles as well. - -To set the number of bins, barrels, or wheelbarrows, just add a number after the -letter that indicates what type of stockpile it is. For example:: - - #place a stone stockpile with 5 wheelbarrows - s5(3x3) - - #place a bar, ammo, weapon, and armor stockpile with 20 bins - bzpd20(5x5) - -If the specified number exceeds the number of available stockpile tiles, the -number of available tiles is used. For wheelbarrows, that limit is reduced by 1 -to ensure there is at least one non-wheelbarrow tile available in the stockpile. -Otherwise no stone would ever be brought to the stockpile since all tiles would -be occupied by wheelbarrows! - -Quickfort figures out which container type is being set by looking at the letter -that comes just before the number. For example ``zf10`` means 10 barrels in a -stockpile that accepts both ammo and food, whereas ``z10f`` means 10 bins. If -the stockpile category doesn't usually use any container type, like refuse or -corpses, wheelbarrows are assumed:: - - #place a corpse stockpile with 3 wheelbarrows - y3(3x3) - -Note that if you are not using expansion syntax, each tile of the stockpile must -have the same text. Otherwise the stockpile boundaries will not be detected -properly:: - - #place a non-rectangular animal stockpile with 5 wheelbarrows - a5,a5,a5,a5 - a5, , ,a5 - a5, , ,a5 - a5,a5,a5,a5 - -Running ``quickfort orders`` on a ``#place`` blueprint with explicitly set -container/wheelbarrow counts will enqueue manager orders for the specified -number of containers or wheelbarrows, even if that number exceeds the in-game -size of the stockpile. For example, ``quickfort orders`` on the following -blueprint will enqueue 10 rock pots, even though the stockpile only has 9 -tiles:: - - #place - f10(3x3) - -Zone detailed configuration -``````````````````````````` - -Detailed configuration for zones, such as the pit/pond toggle, can also be set -by mimicking the hotkeys used to set them. Note that gather flags default to -true, so specifying them in a blueprint will turn the toggles off. If you need -to set configuration from multiple zone subscreens, separate the key sections -with :kbd:`^`. Note the special syntax for setting hospital supply levels, which -have no in-game hotkeys:: - - #zone a combination hospital and shrub (but not fruit) gathering zone - gGtf^hH{hospital buckets=5 splints=20}(10x10) - -The valid hospital settings (and their maximum values) are:: - - thread (1500000) - cloth (1000000) - splints (100) - crutches (100) - plaster (15000) - buckets (100) - soap (15000) - -To toggle the ``active`` flag for zones, add an :kbd:`a` character to the -string. For example, to create a *disabled* pond zone (that you later intend to -carefully fill with 3-depth water for a dwarven bathtub):: - - #zone disabled pond zone - apPf(1x3) - -Minecart tracks -~~~~~~~~~~~~~~~ - -There are two ways to produce minecart tracks, and they are handled very -differently by the game. You can carve them into hard natural floors or you can -construct them out of building materials. Constructed tracks are conceptually -simpler, so we'll start with them. - -Constructed tracks -`````````````````` - -Quickfort supports the designation of track stops and rollers in ``#build`` -blueprints. You can build a track stop with :kbd:`C`:kbd:`S` and some number of -:kbd:`d` and :kbd:`a` characters for selecting dump direction and friction. You -can build a roller with :kbd:`M`:kbd:`r` and some number of :kbd:`s` and -:kbd:`q` characters for direction and speed. However, this can get confusing -very quickly and is very difficult to read in a blueprint. Moreover, constructed -track segments don't even have keys associated with them at all! - -To solve this problem, Quickfort provides the following keywords for use in -build blueprints:: - - -- Track segments -- - trackN - trackS - trackE - trackW - trackNS - trackNE - trackNW - trackSE - trackSW - trackEW - trackNSE - trackNSW - trackNEW - trackSEW - trackNSEW - - -- Track/ramp segments -- - trackrampN - trackrampS - trackrampE - trackrampW - trackrampNS - trackrampNE - trackrampNW - trackrampSE - trackrampSW - trackrampEW - trackrampNSE - trackrampNSW - trackrampNEW - trackrampSEW - trackrampNSEW - - -- Horizontal and vertical roller segments -- - rollerH - rollerV - rollerNS - rollerSN - rollerEW - rollerWE - - Note: append up to four 'q' characters to roller keywords to set roller - speed. E.g. a roller that propels from East to West at the slowest speed can - be specified with 'rollerEWqqqq'. - - -- Track stops that (optionally) dump to the N/S/E/W -- - trackstop - trackstopN - trackstopS - trackstopE - trackstopW - - Note: append up to four 'a' characters to trackstop keywords to set friction - amount. E.g. a stop that applies the smallest amount of friction can be - specified with 'trackstopaaaa'. - -As an example, you can create an E-W track with stops at each end that dump to -their outside directions with the following blueprint:: - - #build Example track - trackstopW trackEW trackEW trackEW trackstopE - -Note that the **only** way to build track and track/ramp segments is with the -keywords. The UI method of using :kbd:`+` and :kbd:`-` keys to select the track -type from a list does not work since DFHack Quickfort doesn't actually send keys -to the UI to build buildings. The text in your spreadsheet cells is mapped -directly onto DFHack API calls. Only ``#query`` blueprints send actual keycodes -to the UI. - -Carved tracks -````````````` +Carved minecart tracks +~~~~~~~~~~~~~~~~~~~~~~ In the game, you carve a minecart track by specifying a beginning and ending -tile and the game "adds" the designation to the tiles in between. You cannot +tile, and the game "adds" the designation to the tiles in between. You cannot designate single tiles because DF needs a multi-tile track to figure out which direction the track should go on each tile. For example to carve two track segments that cross each other, you might use the cursor to designate a line of @@ -701,8 +509,8 @@ track of the form:: Quickfort supports both styles of specification for carving tracks with ``#dig`` blueprints. You can use the "additive" style to carve tracks in segments or you -can use the aliases to specify the track tile by tile. To designate track -segments, use area expansion syntax with a height or width of 1:: +can use the ``track`` aliases to specify the track tile by tile. To designate +track segments, use area expansion syntax with a height or width of 1:: #dig ` T(1x3) ` # @@ -757,10 +565,239 @@ masterwork engravings for destruction (unless forced to by a commandline parameter). You would run (and let your dwarves complete the jobs for) the sequence of blueprints until no tiles are designated by the "erase" blueprint. +#zone mode +---------- + +Zones define how regions of your fort should be treated. They are also the anchor point for "locations" like taverns and hospitals. Unlike stockpiles or buildings, zones can overlap, which can lead to some interesting layouts. + +Zone designation syntax +~~~~~~~~~~~~~~~~~~~~~~~ + +A zone is declared with a symbol followed by optional properties:: + + #zone a single tile garbage dump zone + d + + #zone a single tile garbage dump zone named "The Dump" + d{name="The Dump"} + + #zone interrogation room + o{name=Interrogation assigned_unit=sheriff} + + #zone a small inactive pond zone + p{name="Fill me" pond=true active=false}(3x3) + +If you want multiple zones that have the same footprint, they can be declared +from the same cell:: + + #zone pasture and training area + n{name="Main pasture"}t{name="Pet training area"}(14x10) + +or from different corners of the same rectangle:: + + #zone pasture and training area + n{name="Main pasture"}(10x2) + t{name="Pet training area"}(10x-2) + +and you can use this technique to achieve partial overlap, of course. The only configuration that can't be specified in a single blueprint is multiple non-rectangular zones that are partially overlapping. You will have to use multiple ``#zone`` blueprints to achieve that. + +Locations, locations, locations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Hospitals, guildhalls, taverns, libraries, and temples are locations. You can +declare a location in the properties for a zone:: + + #zone metalcrafter hall + m{location=guildhall profession=metalcrafter}(7x7) + +You can attach multiple zones to a single location by giving the location a +label (not a name -- you can name zones, but you can't directly name locations) +and then using that label for each of the zones you want to attach:: + + #zone tavern and rented room + b{location=tavern/bigpub name="Rent me"}(3x1) + h{location=tavern/bigpub name="Central pub" allow=residents}(25x40) + +Note that the label ("bigpub" in this case) will never appear in-game. It is only used in the context of the blueprint to identify a common location. + +#place mode +----------- + +``#place`` mode is dedicated to stockpiles, which are a major design element in any fortress. + +Stockpile designation syntax +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Just like zones, stockpiles can have properties like names or lists of other stockpiles to take from. Unlike zones, stockpiles can have configuration specifiers for exactly what types of items to accept. The full syntax looks like this:: + + types{properties}:configuration(expansion) + +You're already familiar with `Property syntax`_ and `Area expansion syntax`_, so let's focus in on the remaining elements. + +Stockpile types +~~~~~~~~~~~~~~~ + +The type of stockpile corresponds to the category of items it accepts. Some types will cause the stockpile to accept bins or barrels. See the full list in the `#place mode reference`_. + +It is very common to have stockpiles that accept multiple categories of items. +Although it is perfectly valid to declare a single-purpose stockpile, +`quickfort` also supports directly declaring all the categories at once. For +example, to declare a 20x10 stockpile that accepts both corpses and refuse, you +could write:: + + #place refuse heap + yr(20x10) + +The order of the individual letters doesn't matter. If you want to configure the +stockpile from scratch, you can place unconfigured "custom" stockpiles with (:kbd:`c`). It is more efficient, though, to place +stockpiles using the keys that represent the categories of items that you want +to store, and then only use a ``#query`` blueprint if you need fine-grained +customization. + +.. _quickfort-place-containers: + +Bins, barrels, and wheelbarrows +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Quickfort has global settings for default values for the number of bins, +barrels, and wheelbarrows assigned to stockpiles, but these numbers can be set +for individual stockpiles as well. + +To set the number of bins, barrels, or wheelbarrows, just add a number after the +letter that indicates what type of stockpile it is. For example:: + + #place a stone stockpile with 5 wheelbarrows + s5(3x3) + + #place a bar, ammo, weapon, and armor stockpile with 20 bins + bzpd20(5x5) + +If the specified number exceeds the number of available stockpile tiles, the +number of available tiles is used. For wheelbarrows, that limit is reduced by 1 +to ensure there is at least one non-wheelbarrow tile available in the stockpile. +Otherwise no stone would ever be brought to the stockpile since all tiles would +be occupied by wheelbarrows! + +Quickfort figures out which container type is being set by looking at the letter +that comes just before the number. For example ``zf10`` means 10 barrels in a +stockpile that accepts both ammo and food, whereas ``z10f`` means 10 bins. If +the stockpile category doesn't usually use any container type, like refuse or +corpses, wheelbarrows are assumed:: + + #place a corpse stockpile with 3 wheelbarrows + y3(3x3) + +Note that if you are not using expansion syntax, each tile of the stockpile must +have the same text. Otherwise the stockpile boundaries will not be detected +properly:: + + #place a non-rectangular animal stockpile with 5 wheelbarrows + a5,a5,a5,a5 + a5, , ,a5 + a5, , ,a5 + a5,a5,a5,a5 + +Running ``quickfort orders`` on a ``#place`` blueprint with explicitly set +container/wheelbarrow counts will enqueue manager orders for the specified +number of containers or wheelbarrows, even if that number exceeds the in-game +size of the stockpile. For example, ``quickfort orders`` on the following +blueprint will enqueue 10 rock pots, even though the stockpile only has 9 +tiles:: + + #place + f10(3x3) + +#build mode +----------- + +``#build`` mode handles buildings, furniture (which are also "buildings" +according to DF), constructions (including constructed tracks), and hauling +routes. + +Building designation syntax +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Other than names, most buildings do not have any extra properties. See the +`#build mode reference`_ for those that do. + +The syntax otherwise looks just like stockpiles, except that it only makes +sense to have a single symbol to indicate what to build on that tile:: + + symbol{properties}:configuration(expansion) + +Here's an example of a simple 5x5 square of flooring:: + + #build + Cf(5x5) + +or a named Jeweler's workshop that takes from specific stockpiles:: + + #build + wj{name="Encrusting center" take_from="Furniture,Gem storage"} + +The ``:configuration`` part is only relevant for hauling routes, which we'll go +over in the next section. + +Hauling route definitions +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Hauling routes are defined by properties and configuration attached to track +stops. You can define a single-stop hauling route for a quantum stockpile as +easily as a multi-stop stone quarry transportation line. The stockpile-like +``:configuration`` part of the syntax controls which item types are considered +"desired" for the hauling route stop. If it's not specified, then all item +types are accepted. This is the most common case since most hauling route +contents are filtered by the stockpiles that the stops take from, but the +flexibility is there for when multiple stops take different items from the same +stockpile, or when a stop only wants a subset of items from a stockpile. + +Here is a common setup for a quantum stone stockpile:: + + #place + s{name="Stone quantum" quantum=true} ~ s5{name="Stone feeder"}(3x3) + #build + ~ trackstopW{take_from="Stone feeder" route="Stone dumper"} + +This sets up the quantum stockpile and the feeder stockpile in the ``#place`` +blueprint, followed by the trackstop and the hauling route configuration in the +``#build`` blueprint. The ``route`` property is the name of the hauling route +to create (or attach to if it already exists). If you are applying a quantum +stockpile blueprint more than once in a fort, be sure to *avoid* defining the +``route`` property so that each application of the blueprint creates a unique +hauling route. Two quantum stockpiles on the same route will not function +propertly. + +Let's look at a slightly more complicated setup where we sort the stone into +different output quantum stockpiles:: + + #place + s{name="Other stone quantum" quantum=true} ~ s5e{name="Rock feeder"}(3x3) + s{name="Ore/clay stone quantum" quantum=true} ~ + s{name="Gem quantum" quantum=true} ~ + #build + ~ trackstopW{take_from="Rock feeder" route="Other stone"}:=otherstone + ~ trackstopW{take_from="Rock feeder" route="Ore/clay"}:=cat_stone-otherstone + ~ trackstopW{take_from="Rock feeder" route="Gems"}:=cat_gems + +You can see how we make use of the stockpile-style configuration syntax to +fine-tune the items desired by the hauling route stop. + +Finally, let's make a series of stops on a common hauling route. There is +nothing particularly special about this example. If the ``route`` property +names an existing route, the stop will be added to that route:: + + #dig + trackE trackEW trackEW trackW + #build + trackstop{route="Tick tock"} ~ ~ trackstop{route="Tick tock"} + +These two track stops (which do not dump their contents) simply exist on a +common route at the ends of a connected carved track. + .. _quickfort-modeline: Modeline markers -~~~~~~~~~~~~~~~~ +---------------- The modeline has some additional optional components that we haven't talked about yet. You can: @@ -774,7 +811,7 @@ about yet. You can: The full modeline syntax, when all optional elements are specified, is:: - #mode label(mylabel) start(X;Y;STARTCOMMENT) hidden() message(mymessage) comment + #mode label(mylabel) start(X;Y;startcomment) hidden() message(mymessage) comment Note that all elements are optional except for the initial ``#mode`` (though, as mentioned in the first section, if a modeline doesn't appear at all in the first @@ -783,16 +820,15 @@ no optional markers). Here are a few examples of modelines with optional elements before we discuss them in more detail:: #dig start(3; 3; Center tile of a 5-tile square) Regular blueprint comment - #build label(noblebedroom) start(10;15) - #query label(configstockpiles) No explicit 'start()' means cursor is at upper left corner + #build label(noblebedroom) No explicit 'start()' so cursor is in upper left #meta label(digwholefort) start(center of stairs on surface) - #dig label(digdining) hidden() called by the digwholefort meta blueprint + #dig label(dig_dining) hidden() called by the digwholefort meta blueprint #zone label(pastures) message(remember to assign animals to the new pastures) .. _quickfort-label: Blueprint labels -```````````````` +~~~~~~~~~~~~~~~~ Labels are displayed in the ``quickfort list`` output and are used for addressing specific blueprints when there are multiple blueprints in a single @@ -807,7 +843,7 @@ user-defined labels. .. _quickfort-start: Start positions -``````````````` +~~~~~~~~~~~~~~~ Start positions specify a cursor offset for a particular blueprint, simplifying the task of blueprint alignment. This is very helpful for blueprints that are @@ -842,7 +878,7 @@ You can use semicolons, commas, or spaces to separate the elements of the .. _quickfort-hidden: Hiding blueprints -````````````````` +~~~~~~~~~~~~~~~~~ A blueprint with a ``hidden()`` marker won't appear in ``quickfort list`` output unless the ``--hidden`` flag is specified. The primary reason for hiding a @@ -853,7 +889,7 @@ managed by a `meta blueprint `. .. _quickfort-message: Messages -```````` +~~~~~~~~ A blueprint with a ``message()`` marker will display a message after the blueprint is applied with ``quickfort run``. This is useful for reminding @@ -870,27 +906,26 @@ quotes automatically when they save/export the file. .. _quickfort-meta: -Meta blueprints -~~~~~~~~~~~~~~~ +#meta mode +---------- -Meta blueprints are blueprints that control how other blueprints are applied. -For example, meta blueprints can bundle a group of other blueprints so that they -can be run with a single command. They can also encode logic, like rotating the -blueprint or duplicating it across a specified number of z-levels. +``#meta`` blueprints are blueprints that control how other blueprints are +applied. For example, meta blueprints can bundle a group of other blueprints so +that they can be run with a single command. They can also encode logic, like +rotating the blueprint or duplicating it across a specified number of z-levels. A common scenario where meta blueprints are useful is when you have several phases to link together. For example you might: 1. Apply a dig blueprint to designate dig areas #. Wait for miners to dig +#. **Apply another dig blueprint** to designate traffic costs +#. **Apply a zone blueprint** to designate zones +#. **Apply a place buildprint** to designate and configure stockpiles #. **Apply a build buildprint** to designate buildings -#. **Apply a place buildprint** to designate stockpiles -#. **Apply a query blueprint** to configure stockpiles -#. Wait for buildings to get built -#. Apply a different query blueprint to configure rooms -Those three "apply"s in the middle might as well get done in one command instead -of three. A ``#meta`` blueprint can help with that. A meta blueprint refers to +Those last four "apply"s might as well get done in one command instead of four. +A ``#meta`` blueprint can help with that. A meta blueprint refers to other blueprints in the same file by their label (see the `Modeline markers`_ section above) in the same format used by the `quickfort` command: ``/