Merge branch 'develop' of https://github.com/DFHack/dfhack into embark-assistant

develop
PatrikLundell 2020-11-17 19:53:09 +01:00
commit 8f5d9fe1e9
52 changed files with 4623 additions and 1376 deletions

@ -5,7 +5,7 @@ on: [push, pull_request]
jobs: jobs:
build: build:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
name: build (Linux, GCC ${{ matrix.gcc }}) name: build (Linux, GCC ${{ matrix.gcc }}, ${{ matrix.plugins }} plugins)
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@ -14,9 +14,12 @@ jobs:
gcc: gcc:
- 4.8 - 4.8
- 7 - 7
plugins:
- default
include: include:
- os: ubuntu-20.04 - os: ubuntu-20.04
gcc: 10 gcc: 10
plugins: all
steps: steps:
- name: Set up Python 3 - name: Set up Python 3
uses: actions/setup-python@v2 uses: actions/setup-python@v2
@ -37,7 +40,6 @@ jobs:
zlib1g-dev zlib1g-dev
pip install sphinx pip install sphinx
- name: Install GCC - name: Install GCC
if: ${{ matrix.gcc < 7 || matrix.gcc > 9 }}
run: | run: |
sudo apt-get install gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }} sudo apt-get install gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
- name: Clone DFHack - name: Clone DFHack
@ -70,11 +72,15 @@ jobs:
-B build-ci \ -B build-ci \
-G Ninja \ -G Ninja \
-DDFHACK_BUILD_ARCH=64 \ -DDFHACK_BUILD_ARCH=64 \
-DBUILD_DOCS:BOOL=ON \
-DBUILD_TESTS:BOOL=ON \ -DBUILD_TESTS:BOOL=ON \
-DBUILD_DEV_PLUGINS:BOOL=${{ matrix.plugins == 'all' }} \
-DBUILD_SIZECHECK:BOOL=${{ matrix.plugins == 'all' }} \
-DBUILD_STONESENSE:BOOL=${{ matrix.plugins == 'all' }} \
-DBUILD_SUPPORTED:BOOL=1 \
-DCMAKE_INSTALL_PREFIX="$DF_FOLDER" -DCMAKE_INSTALL_PREFIX="$DF_FOLDER"
ninja -C build-ci install ninja -C build-ci install
- name: Run tests - name: Run tests
id: run_tests
run: | run: |
export TERM=dumb export TERM=dumb
mv "$DF_FOLDER"/dfhack.init-example "$DF_FOLDER"/dfhack.init mv "$DF_FOLDER"/dfhack.init-example "$DF_FOLDER"/dfhack.init
@ -84,9 +90,10 @@ jobs:
cp "$DF_FOLDER/test_status.json" "$DF_FOLDER"/*.log artifacts cp "$DF_FOLDER/test_status.json" "$DF_FOLDER"/*.log artifacts
- name: Upload test artifacts - name: Upload test artifacts
uses: actions/upload-artifact@v1 uses: actions/upload-artifact@v1
if: success() || failure() if: (success() || failure()) && steps.run_tests.outcome != 'skipped'
continue-on-error: true
with: with:
name: test-artifacts name: test-artifacts-${{ matrix.gcc }}
path: artifacts path: artifacts
- name: Clean up DF folder - name: Clean up DF folder
# prevent DFHack-generated files from ending up in the cache # prevent DFHack-generated files from ending up in the cache

@ -0,0 +1,70 @@
"#dig start(11; 12) 28 bedrooms, 3 tiles each (efficient layout)"
# see an image of this blueprint at https://i.imgur.com/XD7D4ux.png
, , , , , ,d, , , , , ,d, , , , , , , , ,#
, , , , , ,d, , , , , ,d, , , , , , , , ,#
, , , ,d, ,d, ,d, ,d, ,d, ,d, , , , , , ,#
, , , ,d, ,d, ,d, ,d, ,d, ,d, , , , , , ,#
, , , ,d,d,d,d,d, ,d,d,d, ,d, ,d,d,d, , ,#
, , , , , ,d, , , , , ,d,d, , ,d, , , , ,#
, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,#
, , , , ,d,d, , , ,d, ,d, , , ,d, , , , ,#
d,d,d,d,d,d,d,d,d,d,d,d,d, ,d, ,d,d,d, , ,#
, , , ,d, , , ,d,i,i,i,d, ,d, , , , , , ,#
, ,d,d,d, ,d,d,d,i,i,i,d,d,d, ,d,d,d, , ,#
, , , , , ,d, ,d,i,i,i,d, , , ,d, , , , ,#
, ,d,d,d, ,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,#
, , , ,d, , , ,d, ,d, , , ,d,d, , , , , ,#
d,d,d,d,d,d,d,d,d, ,d,d,d, ,d, ,d,d,d, , ,#
, , , ,d, , ,d,d, , , , , ,d, , , , , , ,#
, ,d,d,d, ,d, ,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(furniture) start(11; 11) 28x doors, beds, coffers, and cabinets"
, , , , , ,f, , , , , ,f, , , , , , , , ,#
, , , , , ,h, , , , , ,h, , , , , , , , ,#
, , , ,f, ,b, ,f, ,f, ,b, ,f, , , , , , ,#
, , , ,h, ,d, ,h, ,h, ,d, ,h, , , , , , ,#
, , , ,b,d,`,d,b, ,b,d,`, ,b, ,b,h,f, , ,#
, , , , , ,`, , , , , ,`,d, , ,d, , , , ,#
, ,f,h,b, ,`, ,f,h,b, ,`,`,`,`,`,d,b,h,f,#
, , , , ,d,`, , , ,d, ,`, , , ,d, , , , ,#
f,h,b,d,`,`,`,`,`,`,`,`,`, ,f, ,b,h,f, , ,#
, , , ,d, , , ,`,`,`,`,`, ,h, , , , , , ,#
, ,f,h,b, ,b,d,`,`,`,`,`,d,b, ,b,h,f, , ,#
, , , , , ,h, ,`,`,`,`,`, , , ,d, , , , ,#
, ,f,h,b, ,f, ,`,`,`,`,`,`,`,`,`,d,b,h,f,#
, , , ,d, , , ,`, ,d, , , ,`,d, , , , , ,#
f,h,b,d,`,`,`,`,`, ,b,h,f, ,`, ,b,h,f, , ,#
, , , ,d, , ,d,`, , , , , ,`, , , , , , ,#
, ,f,h,b, ,b, ,`,d,b, ,b,d,`,d,b, , , , ,#
, , , , , ,h, ,d, ,h, ,h, ,d, ,h, , , , ,#
, , , , , ,f, ,b, ,f, ,f, ,b, ,f, , , , ,#
, , , , , , , ,h, , , , , ,h, , , , , , ,#
, , , , , , , ,f, , , , , ,f, , , , , , ,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#query label(rooms) start(11; 11) room designations
, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , ,#
, , , , , ,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+,, , , , , ,#
, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , ,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
1 #dig start(11; 12) 28 bedrooms, 3 tiles each (efficient layout)
2 # see an image of this blueprint at https://i.imgur.com/XD7D4ux.png
3 , , , , , ,d, , , , , ,d, , , , , , , , ,#
4 , , , , , ,d, , , , , ,d, , , , , , , , ,#
5 , , , ,d, ,d, ,d, ,d, ,d, ,d, , , , , , ,#
6 , , , ,d, ,d, ,d, ,d, ,d, ,d, , , , , , ,#
7 , , , ,d,d,d,d,d, ,d,d,d, ,d, ,d,d,d, , ,#
8 , , , , , ,d, , , , , ,d,d, , ,d, , , , ,#
9 , ,d,d,d, ,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,#
10 , , , , ,d,d, , , ,d, ,d, , , ,d, , , , ,#
11 d,d,d,d,d,d,d,d,d,d,d,d,d, ,d, ,d,d,d, , ,#
12 , , , ,d, , , ,d,i,i,i,d, ,d, , , , , , ,#
13 , ,d,d,d, ,d,d,d,i,i,i,d,d,d, ,d,d,d, , ,#
14 , , , , , ,d, ,d,i,i,i,d, , , ,d, , , , ,#
15 , ,d,d,d, ,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,#
16 , , , ,d, , , ,d, ,d, , , ,d,d, , , , , ,#
17 d,d,d,d,d,d,d,d,d, ,d,d,d, ,d, ,d,d,d, , ,#
18 , , , ,d, , ,d,d, , , , , ,d, , , , , , ,#
19 , ,d,d,d, ,d, ,d,d,d, ,d,d,d,d,d, , , , ,#
20 , , , , , ,d, ,d, ,d, ,d, ,d, ,d, , , , ,#
21 , , , , , ,d, ,d, ,d, ,d, ,d, ,d, , , , ,#
22 , , , , , , , ,d, , , , , ,d, , , , , , ,#
23 , , , , , , , ,d, , , , , ,d, , , , , , ,#
24 #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
25 #build label(furniture) start(11; 11) 28x doors, beds, coffers, and cabinets
26 , , , , , ,f, , , , , ,f, , , , , , , , ,#
27 , , , , , ,h, , , , , ,h, , , , , , , , ,#
28 , , , ,f, ,b, ,f, ,f, ,b, ,f, , , , , , ,#
29 , , , ,h, ,d, ,h, ,h, ,d, ,h, , , , , , ,#
30 , , , ,b,d,`,d,b, ,b,d,`, ,b, ,b,h,f, , ,#
31 , , , , , ,`, , , , , ,`,d, , ,d, , , , ,#
32 , ,f,h,b, ,`, ,f,h,b, ,`,`,`,`,`,d,b,h,f,#
33 , , , , ,d,`, , , ,d, ,`, , , ,d, , , , ,#
34 f,h,b,d,`,`,`,`,`,`,`,`,`, ,f, ,b,h,f, , ,#
35 , , , ,d, , , ,`,`,`,`,`, ,h, , , , , , ,#
36 , ,f,h,b, ,b,d,`,`,`,`,`,d,b, ,b,h,f, , ,#
37 , , , , , ,h, ,`,`,`,`,`, , , ,d, , , , ,#
38 , ,f,h,b, ,f, ,`,`,`,`,`,`,`,`,`,d,b,h,f,#
39 , , , ,d, , , ,`, ,d, , , ,`,d, , , , , ,#
40 f,h,b,d,`,`,`,`,`, ,b,h,f, ,`, ,b,h,f, , ,#
41 , , , ,d, , ,d,`, , , , , ,`, , , , , , ,#
42 , ,f,h,b, ,b, ,`,d,b, ,b,d,`,d,b, , , , ,#
43 , , , , , ,h, ,d, ,h, ,h, ,d, ,h, , , , ,#
44 , , , , , ,f, ,b, ,f, ,f, ,b, ,f, , , , ,#
45 , , , , , , , ,h, , , , , ,h, , , , , , ,#
46 , , , , , , , ,f, , , , , ,f, , , , , , ,#
47 #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
48 #query label(rooms) start(11; 11) room designations
49 , , , , , , , , , , , , , , , , , , , , ,#
50 , , , , , , , , , , , , , , , , , , , , ,#
51 , , , , , ,r+,, , , , ,r+,, , , , , , , ,#
52 , , , , , , , , , , , , , , , , , , , , ,#
53 , , , ,r+,, , ,r+,,r+,, , ,r+,,r+,, , , ,#
54 , , , , , , , , , , , , , , , , , , , , ,#
55 , , , ,r+,, , , , ,r+,, , , , , , ,r+,, ,#
56 , , , , , , , , , , , , , , , , , , , , ,#
57 , ,r+,, , , , , , , , , , , , ,r+,, , , ,#
58 , , , , , , , , , , , , , , , , , , , , ,#
59 , , , ,r+,,r+,, , , , , , ,r+,,r+,, , , ,#
60 , , , , , , , , , , , , , , , , , , , , ,#
61 , , , ,r+,, , , , , , , , , , , , ,r+,, ,#
62 , , , , , , , , , , , , , , , , , , , , ,#
63 , ,r+,, , , , , , ,r+,, , , , ,r+,, , , ,#
64 , , , , , , , , , , , , , , , , , , , , ,#
65 , , , ,r+,,r+,, , ,r+,,r+,, , ,r+,, , , ,#
66 , , , , , , , , , , , , , , , , , , , , ,#
67 , , , , , , , ,r+,, , , , ,r+,, , , , , ,#
68 , , , , , , , , , , , , , , , , , , , , ,#
69 , , , , , , , , , , , , , , , , , , , , ,#
70 #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#

@ -0,0 +1,100 @@
"#dig start(16; 17; central 3x3 stairwell) 48 rooms, 4 tiles each (more aesthetic)"
# see an image of this blueprint at: https://i.imgur.com/3pNc0HM.png
, , , , , , , , , , , , ,d, , , ,d, , , , , , , , , , , , , ,#
, , , ,d, , , ,d, , , ,d,d,d,d,d,d,d, , , ,d, , , ,d, , , , ,#
, , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,#
,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, ,#
d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d,#
,d, , ,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d, , ,d, ,#
,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,#
,d, , ,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d, , ,d, ,#
d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d,#
,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, ,#
, , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,#
, , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , , ,#
, ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,#
,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, ,#
, ,d, , ,d,d,d, , ,d, , ,d,i,i,i,d, , ,d, , ,d,d,d, , ,d, , ,#
, ,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d, , ,#
, ,d, , ,d,d,d, , ,d, , ,d,i,i,i,d, , ,d, , ,d,d,d, , ,d, , ,#
,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, ,#
, ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,#
, , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , , ,#
, , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,#
,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, ,#
d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d,#
,d, , ,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d, , ,d, ,#
,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,#
,d, , ,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d, , ,d, ,#
d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d,#
,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, ,#
, , ,d,d,d,d,d,d,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(furniture) start(16; 16; central 3x3 stairwell) 48x doors, beds, cabinets, and coffers; 8x statues"
, , , , , , , , , , , , ,f, , , ,f, , , , , , , , , , , , , ,#
, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , , ,#
, , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,#
,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, ,#
f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f,#
,d, , , , , , , , , ,d, , , , , , , ,d, , , , , , , , , ,d, ,#
, , , , , ,s, , , , , , , , ,s, , , , , , , , ,s, , , , , , ,#
,d, , , , , , , , , ,d, , , , , , , ,d, , , , , , , , , ,d, ,#
f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f,#
,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, ,#
, , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,#
, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , , ,#
, ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,#
,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, ,#
, ,d, , , , , , , ,d, , , , , , , , , ,d, , , , , , , ,d, , ,#
, , , , , ,s, , , , , , , , , , , , , , , , , ,s, , , , , , ,#
, ,d, , , , , , , ,d, , , , , , , , , ,d, , , , , , , ,d, , ,#
,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, ,#
, ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,#
, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , , ,#
, , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,#
,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, ,#
f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f,#
,d, , , , , , , , , ,d, , , , , , , ,d, , , , , , , , , ,d, ,#
, , , , , ,s, , , , , , , , ,s, , , , , , , , ,s, , , , , , ,#
,d, , , , , , , , , ,d, , , , , , , ,d, , , , , , , , , ,d, ,#
f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f,#
,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, ,#
, , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,#
, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , , ,#
, , , , , , , , , , , , ,f, , , ,f, , , , , , , , , , , , , ,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#query label(rooms) start(16; 16; central 3x3 stairwell) room designations
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , ,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+,, , , , , , ,r+,, , , , , , , , ,r+,,#
, , ,r+,, , , , ,r+,, , , , , , , , , , ,r+,, , , , ,r+,, , ,#
, , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
1 #dig start(16; 17; central 3x3 stairwell) 48 rooms, 4 tiles each (more aesthetic)
2 # see an image of this blueprint at: https://i.imgur.com/3pNc0HM.png
3 , , , , , , , , , , , , ,d, , , ,d, , , , , , , , , , , , , ,#
4 , , , ,d, , , ,d, , , ,d,d,d,d,d,d,d, , , ,d, , , ,d, , , , ,#
5 , , ,d,d,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, ,#
7 d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d,#
8 ,d, , ,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d, , ,d, ,#
9 ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,#
10 ,d, , ,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d, , ,d, ,#
11 d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d,#
12 ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, ,#
13 , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,#
14 , , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , , ,#
15 , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,#
16 ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, ,#
17 , ,d, , ,d,d,d, , ,d, , ,d,i,i,i,d, , ,d, , ,d,d,d, , ,d, , ,#
18 , ,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d, , ,#
19 , ,d, , ,d,d,d, , ,d, , ,d,i,i,i,d, , ,d, , ,d,d,d, , ,d, , ,#
20 ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, ,#
21 , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,#
22 , , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , , ,#
23 , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,#
24 ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, ,#
25 d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d,#
26 ,d, , ,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d, , ,d, ,#
27 ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,#
28 ,d, , ,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d, , ,d, ,#
29 d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d,#
30 ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, ,#
31 , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,#
32 , , , ,d, , , ,d, , , ,d,d,d,d,d,d,d, , , ,d, , , ,d, , , , ,#
33 , , , , , , , , , , , , ,d, , , ,d, , , , , , , , , , , , , ,#
34 #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
35 #build label(furniture) start(16; 16; central 3x3 stairwell) 48x doors, beds, cabinets, and coffers; 8x statues
36 , , , , , , , , , , , , ,f, , , ,f, , , , , , , , , , , , , ,#
37 , , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , , ,#
38 , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,#
39 ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, ,#
40 f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f,#
41 ,d, , , , , , , , , ,d, , , , , , , ,d, , , , , , , , , ,d, ,#
42 , , , , , ,s, , , , , , , , ,s, , , , , , , , ,s, , , , , , ,#
43 ,d, , , , , , , , , ,d, , , , , , , ,d, , , , , , , , , ,d, ,#
44 f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f,#
45 ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, ,#
46 , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,#
47 , , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , , ,#
48 , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,#
49 ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, ,#
50 , ,d, , , , , , , ,d, , , , , , , , , ,d, , , , , , , ,d, , ,#
51 , , , , , ,s, , , , , , , , , , , , , , , , , ,s, , , , , , ,#
52 , ,d, , , , , , , ,d, , , , , , , , , ,d, , , , , , , ,d, , ,#
53 ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, ,#
54 , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,#
55 , , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , , ,#
56 , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,#
57 ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, ,#
58 f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f,#
59 ,d, , , , , , , , , ,d, , , , , , , ,d, , , , , , , , , ,d, ,#
60 , , , , , ,s, , , , , , , , ,s, , , , , , , , ,s, , , , , , ,#
61 ,d, , , , , , , , , ,d, , , , , , , ,d, , , , , , , , , ,d, ,#
62 f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f,#
63 ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, ,#
64 , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,#
65 , , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , , ,#
66 , , , , , , , , , , , , ,f, , , ,f, , , , , , , , , , , , , ,#
67 #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
68 #query label(rooms) start(16; 16; central 3x3 stairwell) room designations
69 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
70 , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , ,#
71 , , ,r+,, , , , ,r+,, , , , , , , , , , ,r+,, , , , ,r+,, , ,#
72 ,r+,, , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , ,r+,,#
73 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
74 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
75 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
76 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
77 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
78 ,r+,, , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , ,r+,,#
79 , , ,r+,, , , , ,r+,, , , , , , , , , , ,r+,, , , , ,r+,, , ,#
80 , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , ,#
81 , ,r+,, , , , , , ,r+,, , , , , , , , ,r+,, , , , , , ,r+,, ,#
82 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
83 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
84 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
85 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
86 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
87 , ,r+,, , , , , , ,r+,, , , , , , , , ,r+,, , , , , , ,r+,, ,#
88 , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , ,#
89 , , ,r+,, , , , ,r+,, , , , , , , , , , ,r+,, , , , ,r+,, , ,#
90 ,r+,, , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , ,r+,,#
91 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
92 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
93 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
94 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
95 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
96 ,r+,, , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , ,r+,,#
97 , , ,r+,, , , , ,r+,, , , , , , , , , , ,r+,, , , , ,r+,, , ,#
98 , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , ,#
99 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
100 #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#

@ -0,0 +1,232 @@
"#dig start(36;74) 97 rooms, 9 tiles each (fractal design)"
# see an image of this blueprint at: https://i.imgur.com/ENi5QLX.png
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,d, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , ,d,d,d, , ,d, , , , , , ,d, , , , , , ,d, , , , , , ,d, , , , , , ,d, , ,d,d,d, , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , ,d,d,d, , ,d, , , , , , ,d, , , , , ,d,d,d, , , , , ,d, , , , , , ,d, , ,d,d,d, , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , ,d,d,d, , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,d, , ,d,d,d, , ,d, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , ,d,d,d, ,d,d,d, ,d,d,d, , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , ,d,d,d, , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
, , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
, , , , , , , , , , , ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
, , , , , , , , , , , , ,d, , , , , , ,d,d,d, ,d, ,d,d,d, , , , , ,d,d,d, , , , , ,d,d,d, ,d, ,d,d,d, , , , , , ,d, , , , , , , , , , , , , ,#
, , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , ,#
, , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , ,#
, , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d,d,d, ,d, , , , , , ,d, , ,d,d,d, , ,d, , , , , , ,d, ,d,d,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , ,#
,d,d,d, , ,d, , , , , , ,d, , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , ,d, , , , , , ,d, , ,d,d,d, ,#
,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,#
,d,d,d, , ,d, , , , , , ,d, , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , ,d, , , , , , ,d, , ,d,d,d, ,#
, , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d,d,d, ,d, , , , , , ,d, , ,d,d,d, , ,d, , , , , , ,d, ,d,d,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , ,#
, , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , ,#
, , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , ,#
, , , , , , , , , , , , ,d, , , , , , ,d,d,d, ,d, ,d,d,d, , , , , ,d,d,d, , , , , ,d,d,d, ,d, ,d,d,d, , , , , , ,d, , , , , , , , , , , , , ,#
, , , , , , , , , , , ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
, , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
, , , , , , , , , , , ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , ,d,d,d, , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,d,d, ,d,d,d, ,d,d, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d, ,d,d,d, ,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
"#build label(furniture) start(36;73) 97 doors; 95 beds, coffers, and cabinets; 190 urns; 14 tables, chairs, weapon racks, armor stands, and statues"
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,f,`,n, ,`, ,n,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`,d,`,d,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,n, ,`, ,n,`,h, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, ,`, ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,`, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,`, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, ,r,b,t, ,`, ,r,b,t, ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, ,a,`,c, ,`, ,a,`,c, ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,h,s,f, ,`, ,h,s,f, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,`, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,h,`,f, ,f,`,n, ,`, ,n,r,a,h, ,`, ,h,a,r,n, ,`, ,n,`,f, ,h,`,f, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,d,`,b,`,s, ,`, ,s,`,b,`,d,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,n,`,n, ,h,`,n, ,`, ,n,t,c,f, ,`, ,f,c,t,n, ,`, ,n,`,h, ,n,`,n, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , ,f,`,n, , ,d, , , , , , ,`, , , , , , ,`, , , , , , ,`, , , , , , ,d, , ,n,`,f, , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , ,`,b,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,d,`,b,`, , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , ,h,`,n, , ,d, , , , , , ,`, , , , , ,`,`,`, , , , , ,`, , , , , , ,d, , ,n,`,h, , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,n,`,n, ,f,`,n, ,`, ,n,`,f, ,`,`,`, ,f,`,n, ,`, ,n,`,f, ,n,`,n, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,d,`,b,`, ,`,`,`, ,`,b,`,d,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,h,`,f, ,h,`,n, ,`, ,n,`,h, ,`,`,`, ,h,`,n, ,`, ,n,`,h, ,h,`,f, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , ,`,`,`, , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , ,h,`,f, ,n,`,n, ,f,n, ,`,`,`, ,n,f, ,n,`,n, ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`,b,`, ,b,`,d,`,`,`,d,`,b, ,`,b,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,h,`,f, ,h,n, ,`,`,`, ,n,h, ,h,`,f, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,d, , ,`,`,`, , ,d, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,f,`,n, ,`, ,n,`,f, ,n,`,n, ,`,`,`, ,n,`,n, ,f,`,n, ,`, ,n,`,f, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,`,b,`,d,`,d,`,b,`, ,h,b,f, ,`,`,`, ,h,b,f, ,`,b,`,d,`,d,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,h,`,n, ,`, ,n,`,h, , ,d, , ,`,`,`, , ,d, , ,h,`,n, ,`, ,n,`,h, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , ,`, , , , , ,n,`,n, ,`,`,`, ,n,`,n, , , , , ,`, , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,h,`,f, ,`, ,h,`,f, ,`,b,`, ,`,`,`, ,`,b,`, ,h,`,f, ,`, ,h,`,f, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,`,b,`, ,`, ,`,b,`, ,h,`,f, ,`,`,`, ,h,`,f, ,`,b,`, ,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,n,`,n, ,`, ,n,`,n, , , , , ,`,`,`, , , , , ,n,`,n, ,`, ,n,`,n, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , ,h,`,f, ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, ,`,`,`, ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, ,h,`,f, , , , , , , , , , , , ,#
, , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, ,`,`,`, ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , ,#
, , , , , , , , , , , ,n,`,n, ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, ,`,`,`, ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, ,n,`,n, , , , , , , , , , , , ,#
, , , , , , , , , , , , ,d, , , , , , ,n,`,n, ,`, ,n,`,n, , , , , ,`,`,`, , , , , ,n,`,n, ,`, ,n,`,n, , , , , , ,d, , , , , , , , , , , , , ,#
, , , , ,h,`,f, ,f,`,n, ,`, ,n,r,a,h, ,r,b,t, ,`, ,`,b,`, ,h,b,f, ,`,`,`, ,h,b,f, ,`,b,`, ,`, ,r,b,t, ,h,a,r,n, ,`, ,n,`,f, ,h,`,f, , , , , ,#
, , , , ,`,b,`, ,`,b,`,d,`,d,`,b,`,s, ,a,`,c, ,`, ,h,`,f, ,n,`,n, ,`,`,`, ,n,`,n, ,h,`,f, ,`, ,a,`,c, ,s,`,b,`,d,`,d,`,b,`, ,`,b,`, , , , , ,#
, , , , ,n,`,n, ,h,`,n, ,`, ,n,t,c,f, ,h,s,f, ,`, , , , , , ,d, , ,`,`,`, , ,d, , , , , , ,`, ,h,s,f, ,f,c,t,n, ,`, ,n,`,h, ,n,`,n, , , , , ,#
,f,`,n, , ,d, , , , , , ,`, , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , ,`, , , , , , ,d, , ,n,`,f, ,#
,`,b,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,d,`,b,`, ,#
,h,`,n, , ,d, , , , , , ,`, , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , ,`, , , , , , ,d, , ,n,`,h, ,#
, , , , ,n,`,n, ,f,`,n, ,`, ,n,r,a,h, ,h,s,f, ,`, , , , , , ,d, , ,`,`,`, , ,d, , , , , , ,`, ,h,s,f, ,h,a,r,n, ,`, ,n,`,f, ,n,`,n, , , , , ,#
, , , , ,`,b,`, ,`,b,`,d,`,d,`,b,`,s, ,a,`,c, ,`, ,h,`,f, ,n,`,n, ,`,`,`, ,n,`,n, ,h,`,f, ,`, ,a,`,c, ,s,`,b,`,d,`,d,`,b,`, ,`,b,`, , , , , ,#
, , , , ,h,`,f, ,h,`,n, ,`, ,n,t,c,f, ,r,b,t, ,`, ,`,b,`, ,h,b,f, ,`,`,`, ,h,b,f, ,`,b,`, ,`, ,r,b,t, ,f,c,t,n, ,`, ,n,`,h, ,h,`,f, , , , , ,#
, , , , , , , , , , , , ,d, , , , , , ,n,`,n, ,`, ,n,`,n, , , , , ,`,`,`, , , , , ,n,`,n, ,`, ,n,`,n, , , , , , ,d, , , , , , , , , , , , , ,#
, , , , , , , , , , , ,n,`,n, ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, ,`,`,`, ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, ,n,`,n, , , , , , , , , , , , ,#
, , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, ,`,`,`, ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , ,#
, , , , , , , , , , , ,h,`,f, ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, ,`,`,`, ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, ,h,`,f, , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,n,`,n, ,`, ,n,`,n, , , , , ,`,`,`, , , , , ,n,`,n, ,`, ,n,`,n, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,`,b,`, ,`, ,`,b,`, ,h,s,f, ,`,`,`, ,h,s,f, ,`,b,`, ,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,h,`,f, ,`, ,h,`,f, ,a,`,c, ,`,`,`, ,a,`,c, ,h,`,f, ,`, ,h,`,f, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , ,`, , , , , ,r,b,t,d,`,`,`,d,r,b,t, , , , , ,`, , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,f,`,n, ,`, ,n,`,f, ,n,`,n, ,`,`,`, ,n,`,n, ,f,`,n, ,`, ,n,`,f, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,`,b,`,d,`,d,`,b,`, , ,d, , ,`,`,`, , ,d, , ,`,b,`,d,`,d,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , ,h,`,n, ,`, ,n,`,h, ,`,`,`, ,`,`,`, ,`,`,`, ,h,`,n, ,`, ,n,`,h, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,`,`, ,`,`,`, ,`,`, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,f,`,n, ,`,`, ,`,`,`, ,`,`, ,n,`,f, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,`, ,`,`,`, ,`,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , ,h,`,f, ,h,`,n, ,`,`, ,`,`,`, ,`,`, ,n,`,h, ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,`,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#query label(rooms) start(36;73) message(use burial script to mark urns as usable) room designations
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,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+,, , , , ,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+,, , ,r+,, , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,~,~,~, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,~,~,~, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,~,~,~, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
1 #dig start(36;74) 97 rooms, 9 tiles each (fractal design)
2 # see an image of this blueprint at: https://i.imgur.com/ENi5QLX.png
3 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
4 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
5 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
6 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
7 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
8 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
9 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
10 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
11 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
12 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
13 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
14 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
15 , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
16 , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
17 , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
18 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
19 , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
20 , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
21 , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
22 , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,d, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
23 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
24 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
25 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
26 , , , , , , , , , , , , , , , ,d,d,d, , ,d, , , , , , ,d, , , , , , ,d, , , , , , ,d, , , , , , ,d, , ,d,d,d, , , , , , , , , , , , , , , , ,#
27 , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , ,#
28 , , , , , , , , , , , , , , , ,d,d,d, , ,d, , , , , , ,d, , , , , ,d,d,d, , , , , ,d, , , , , , ,d, , ,d,d,d, , , , , , , , , , , , , , , , ,#
29 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
30 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
31 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
32 , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , ,d,d,d, , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
33 , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
34 , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
35 , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
36 , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,d, , ,d,d,d, , ,d, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
37 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
38 , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
39 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
40 , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , ,d,d,d, ,d,d,d, ,d,d,d, , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
41 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
42 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
43 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , ,d,d,d, , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
44 , , , , , , , , , , , ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
45 , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
46 , , , , , , , , , , , ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
47 , , , , , , , , , , , , ,d, , , , , , ,d,d,d, ,d, ,d,d,d, , , , , ,d,d,d, , , , , ,d,d,d, ,d, ,d,d,d, , , , , , ,d, , , , , , , , , , , , , ,#
48 , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , ,#
49 , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , ,#
50 , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d,d,d, ,d, , , , , , ,d, , ,d,d,d, , ,d, , , , , , ,d, ,d,d,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , ,#
51 ,d,d,d, , ,d, , , , , , ,d, , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , ,d, , , , , , ,d, , ,d,d,d, ,#
52 ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,#
53 ,d,d,d, , ,d, , , , , , ,d, , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , ,d, , , , , , ,d, , ,d,d,d, ,#
54 , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d,d,d, ,d, , , , , , ,d, , ,d,d,d, , ,d, , , , , , ,d, ,d,d,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , ,#
55 , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , ,#
56 , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , ,#
57 , , , , , , , , , , , , ,d, , , , , , ,d,d,d, ,d, ,d,d,d, , , , , ,d,d,d, , , , , ,d,d,d, ,d, ,d,d,d, , , , , , ,d, , , , , , , , , , , , , ,#
58 , , , , , , , , , , , ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
59 , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
60 , , , , , , , , , , , ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
61 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , ,d,d,d, , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
62 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
63 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
64 , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
65 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
66 , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
67 , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
68 , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,d,d, ,d,d,d, ,d,d, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
69 , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
70 , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d, ,d,d,d, ,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
71 , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
72 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
73 , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , ,#
74 , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , ,#
75 , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , ,#
76 , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , ,#
77 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
78 #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
79 #build label(furniture) start(36;73) 97 doors; 95 beds, coffers, and cabinets; 190 urns; 14 tables, chairs, weapon racks, armor stands, and statues
80 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
81 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
82 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
83 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
84 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
85 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,f,`,n, ,`, ,n,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
86 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`,d,`,d,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
87 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,n, ,`, ,n,`,h, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
88 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
89 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, ,`, ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
90 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
91 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,`, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
92 , , , , , , , , , , , , , , , , , , , , , , , , , , ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
93 , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
94 , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
95 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,`, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
96 , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, ,r,b,t, ,`, ,r,b,t, ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
97 , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, ,a,`,c, ,`, ,a,`,c, ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
98 , , , , , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,h,s,f, ,`, ,h,s,f, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
99 , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,`, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
100 , , , , , , , , , , , , , , , , , , , ,h,`,f, ,f,`,n, ,`, ,n,r,a,h, ,`, ,h,a,r,n, ,`, ,n,`,f, ,h,`,f, , , , , , , , , , , , , , , , , , , , ,#
101 , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,d,`,b,`,s, ,`, ,s,`,b,`,d,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
102 , , , , , , , , , , , , , , , , , , , ,n,`,n, ,h,`,n, ,`, ,n,t,c,f, ,`, ,f,c,t,n, ,`, ,n,`,h, ,n,`,n, , , , , , , , , , , , , , , , , , , , ,#
103 , , , , , , , , , , , , , , , ,f,`,n, , ,d, , , , , , ,`, , , , , , ,`, , , , , , ,`, , , , , , ,d, , ,n,`,f, , , , , , , , , , , , , , , , ,#
104 , , , , , , , , , , , , , , , ,`,b,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,d,`,b,`, , , , , , , , , , , , , , , , ,#
105 , , , , , , , , , , , , , , , ,h,`,n, , ,d, , , , , , ,`, , , , , ,`,`,`, , , , , ,`, , , , , , ,d, , ,n,`,h, , , , , , , , , , , , , , , , ,#
106 , , , , , , , , , , , , , , , , , , , ,n,`,n, ,f,`,n, ,`, ,n,`,f, ,`,`,`, ,f,`,n, ,`, ,n,`,f, ,n,`,n, , , , , , , , , , , , , , , , , , , , ,#
107 , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,d,`,b,`, ,`,`,`, ,`,b,`,d,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
108 , , , , , , , , , , , , , , , , , , , ,h,`,f, ,h,`,n, ,`, ,n,`,h, ,`,`,`, ,h,`,n, ,`, ,n,`,h, ,h,`,f, , , , , , , , , , , , , , , , , , , , ,#
109 , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , ,`,`,`, , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
110 , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, ,n,`,n, ,f,n, ,`,`,`, ,n,f, ,n,`,n, ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , ,#
111 , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`,b,`, ,b,`,d,`,`,`,d,`,b, ,`,b,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , ,#
112 , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,h,`,f, ,h,n, ,`,`,`, ,n,h, ,h,`,f, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , ,#
113 , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,d, , ,`,`,`, , ,d, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
114 , , , , , , , , , , , , , , , , , , , ,f,`,n, ,`, ,n,`,f, ,n,`,n, ,`,`,`, ,n,`,n, ,f,`,n, ,`, ,n,`,f, , , , , , , , , , , , , , , , , , , , ,#
115 , , , , , , , , , , , , , , , , , , , ,`,b,`,d,`,d,`,b,`, ,h,b,f, ,`,`,`, ,h,b,f, ,`,b,`,d,`,d,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
116 , , , , , , , , , , , , , , , , , , , ,h,`,n, ,`, ,n,`,h, , ,d, , ,`,`,`, , ,d, , ,h,`,n, ,`, ,n,`,h, , , , , , , , , , , , , , , , , , , , ,#
117 , , , , , , , , , , , , , , , , , , , , , , , ,`, , , , , ,n,`,n, ,`,`,`, ,n,`,n, , , , , ,`, , , , , , , , , , , , , , , , , , , , , , , , ,#
118 , , , , , , , , , , , , , , , , , , , ,h,`,f, ,`, ,h,`,f, ,`,b,`, ,`,`,`, ,`,b,`, ,h,`,f, ,`, ,h,`,f, , , , , , , , , , , , , , , , , , , , ,#
119 , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`, ,`,b,`, ,h,`,f, ,`,`,`, ,h,`,f, ,`,b,`, ,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
120 , , , , , , , , , , , , , , , , , , , ,n,`,n, ,`, ,n,`,n, , , , , ,`,`,`, , , , , ,n,`,n, ,`, ,n,`,n, , , , , , , , , , , , , , , , , , , , ,#
121 , , , , , , , , , , , ,h,`,f, ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, ,`,`,`, ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, ,h,`,f, , , , , , , , , , , , ,#
122 , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, ,`,`,`, ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , ,#
123 , , , , , , , , , , , ,n,`,n, ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, ,`,`,`, ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, ,n,`,n, , , , , , , , , , , , ,#
124 , , , , , , , , , , , , ,d, , , , , , ,n,`,n, ,`, ,n,`,n, , , , , ,`,`,`, , , , , ,n,`,n, ,`, ,n,`,n, , , , , , ,d, , , , , , , , , , , , , ,#
125 , , , , ,h,`,f, ,f,`,n, ,`, ,n,r,a,h, ,r,b,t, ,`, ,`,b,`, ,h,b,f, ,`,`,`, ,h,b,f, ,`,b,`, ,`, ,r,b,t, ,h,a,r,n, ,`, ,n,`,f, ,h,`,f, , , , , ,#
126 , , , , ,`,b,`, ,`,b,`,d,`,d,`,b,`,s, ,a,`,c, ,`, ,h,`,f, ,n,`,n, ,`,`,`, ,n,`,n, ,h,`,f, ,`, ,a,`,c, ,s,`,b,`,d,`,d,`,b,`, ,`,b,`, , , , , ,#
127 , , , , ,n,`,n, ,h,`,n, ,`, ,n,t,c,f, ,h,s,f, ,`, , , , , , ,d, , ,`,`,`, , ,d, , , , , , ,`, ,h,s,f, ,f,c,t,n, ,`, ,n,`,h, ,n,`,n, , , , , ,#
128 ,f,`,n, , ,d, , , , , , ,`, , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , ,`, , , , , , ,d, , ,n,`,f, ,#
129 ,`,b,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,d,`,b,`, ,#
130 ,h,`,n, , ,d, , , , , , ,`, , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , ,`, , , , , , ,d, , ,n,`,h, ,#
131 , , , , ,n,`,n, ,f,`,n, ,`, ,n,r,a,h, ,h,s,f, ,`, , , , , , ,d, , ,`,`,`, , ,d, , , , , , ,`, ,h,s,f, ,h,a,r,n, ,`, ,n,`,f, ,n,`,n, , , , , ,#
132 , , , , ,`,b,`, ,`,b,`,d,`,d,`,b,`,s, ,a,`,c, ,`, ,h,`,f, ,n,`,n, ,`,`,`, ,n,`,n, ,h,`,f, ,`, ,a,`,c, ,s,`,b,`,d,`,d,`,b,`, ,`,b,`, , , , , ,#
133 , , , , ,h,`,f, ,h,`,n, ,`, ,n,t,c,f, ,r,b,t, ,`, ,`,b,`, ,h,b,f, ,`,`,`, ,h,b,f, ,`,b,`, ,`, ,r,b,t, ,f,c,t,n, ,`, ,n,`,h, ,h,`,f, , , , , ,#
134 , , , , , , , , , , , , ,d, , , , , , ,n,`,n, ,`, ,n,`,n, , , , , ,`,`,`, , , , , ,n,`,n, ,`, ,n,`,n, , , , , , ,d, , , , , , , , , , , , , ,#
135 , , , , , , , , , , , ,n,`,n, ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, ,`,`,`, ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, ,n,`,n, , , , , , , , , , , , ,#
136 , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, ,`,`,`, ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , ,#
137 , , , , , , , , , , , ,h,`,f, ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, ,`,`,`, ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, ,h,`,f, , , , , , , , , , , , ,#
138 , , , , , , , , , , , , , , , , , , , ,n,`,n, ,`, ,n,`,n, , , , , ,`,`,`, , , , , ,n,`,n, ,`, ,n,`,n, , , , , , , , , , , , , , , , , , , , ,#
139 , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`, ,`,b,`, ,h,s,f, ,`,`,`, ,h,s,f, ,`,b,`, ,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
140 , , , , , , , , , , , , , , , , , , , ,h,`,f, ,`, ,h,`,f, ,a,`,c, ,`,`,`, ,a,`,c, ,h,`,f, ,`, ,h,`,f, , , , , , , , , , , , , , , , , , , , ,#
141 , , , , , , , , , , , , , , , , , , , , , , , ,`, , , , , ,r,b,t,d,`,`,`,d,r,b,t, , , , , ,`, , , , , , , , , , , , , , , , , , , , , , , , ,#
142 , , , , , , , , , , , , , , , , , , , ,f,`,n, ,`, ,n,`,f, ,n,`,n, ,`,`,`, ,n,`,n, ,f,`,n, ,`, ,n,`,f, , , , , , , , , , , , , , , , , , , , ,#
143 , , , , , , , , , , , , , , , , , , , ,`,b,`,d,`,d,`,b,`, , ,d, , ,`,`,`, , ,d, , ,`,b,`,d,`,d,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
144 , , , , , , , , , , , , , , , , , , , ,h,`,n, ,`, ,n,`,h, ,`,`,`, ,`,`,`, ,`,`,`, ,h,`,n, ,`, ,n,`,h, , , , , , , , , , , , , , , , , , , , ,#
145 , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,`,`, ,`,`,`, ,`,`, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
146 , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,f,`,n, ,`,`, ,`,`,`, ,`,`, ,n,`,f, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , ,#
147 , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,`, ,`,`,`, ,`,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , ,#
148 , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, ,h,`,n, ,`,`, ,`,`,`, ,`,`, ,n,`,h, ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , ,#
149 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,`,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
150 , , , , , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , , , , , ,#
151 , , , , , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , , , , , ,#
152 , , , , , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , , , , , ,#
153 , , , , , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , , , , , ,#
154 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
155 #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
156 #query label(rooms) start(36;73) message(use burial script to mark urns as usable) room designations
157 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
158 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
159 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
160 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
161 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
162 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
163 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
164 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
165 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
166 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
167 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
168 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
169 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
170 , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , , , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
171 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
172 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
173 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
174 , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , , , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
175 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
176 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
177 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
178 , , , , , , , , , , , , , , , , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
179 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
180 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
181 , , , , , , , , , , , , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , , , , , , , , , , , ,#
182 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
183 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
184 , , , , , , , , , , , , , , , , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
185 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
186 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
187 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
188 , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , ,r+,, ,r+,, , , , , , ,r+,, ,r+,, , ,r+,, , , , , , , , , , , , , , , , , , , , , , , ,#
189 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
190 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
191 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
192 , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
193 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
194 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
195 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
196 , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
197 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
198 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
199 , , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , ,#
200 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
201 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
202 , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
203 , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , ,#
204 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
205 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
206 , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, ,#
207 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
208 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
209 , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , ,#
210 , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
211 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
212 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
213 , , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , ,#
214 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
215 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
216 , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
217 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
218 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
219 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
220 , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
221 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
222 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
223 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
224 , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , , , , , , , , , , , , ,#
225 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
226 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
227 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
228 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,~,~,~, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
229 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,~,~,~, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
230 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,~,~,~, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
231 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
232 #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#

@ -1,67 +1,86 @@
#notes label(help) run me for the dreamfort walkthrough #notes label(help) run me for the dreamfort walkthrough
Welcome to the Dreamfort Walkthrough! Welcome to the Dreamfort Walkthrough!
It can be difficult applying a set of blueprints that you did not write yourself. This walkthrough will guide you through the high-level steps of building Dreamfort. It can be difficult applying a set of blueprints that you did not write yourself. This walkthrough will guide you through the high-level steps of building Dreamfort. Each level also has its own mini-walkthrough with specific steps for that level.
"" ""
"The final fort will have a walled-in area on the surface for livestock, trading, and military. Be sure to bring some blocks with you for the initial set of workshops! One z-level down is the farming level, with related workshops and vents up to the surface for miasma control. The farming level also has a miniature dining hall and dormitory for use until you get the services and apartment levels set up." "The final fort will have a walled-in area on the surface for livestock, trading, and military. One z-level down is the farming level, with related workshops and vents up to the surface for miasma control. 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:" "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 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, and justice services, including a well system. This level is 4 z-levels deep." "- The services level has dining, hospital, and justice services, including a well system. This level is 4 z-levels deep."
"- The guildhall level has many rooms for building libraries, temples, and guildhalls" "- The guildhall level has many empty rooms for building libraries, temples, and guildhalls."
- The suites level has fancy rooms for your nobles - The suites level has fancy rooms for your nobles.
- The apartments level(s) has small but well-furnished bedrooms for your other dwarves - The apartments level(s) has small but well-furnished bedrooms for your other dwarves.
"" ""
"Dreamfort has a central staircase-based design. Choose a tile for your staircase on the surface in a nice, flat area. For all blueprints, the cursor will start on this tile on the z-level where you want to apply the blueprint." "Run each level's ""help"" blueprint (e.g. /surface_help) for more details."
"" ""
"Blueprints that require manual steps (like 'assign animals to pasture') will leave a message telling you so after you apply them. Blueprints will also leave messages with hints when you might want to run ""quickfort orders"" on specific blueprints to start manufacturing needed items." "Dreamfort has a central staircase-based design. For all Dreamfort levels, place the cursor on the center staircase tile when you apply the blueprints. The first surface blueprint will designate a column of staircases that you can use as a guide."
"" ""
"Directly after embark, apply /surface1 on a flat area on the surface and /industry1 somewhere underground (but not immediately below the surface -- that will be for the farming level). Work your way through the steps for those levels: apply /surface2 when /surface1 is done, /industry2 when /industry1 is done, etc. Once you channel out parts of the surface with /surface3, you can start the farming sequence with /farming1. You can start the services, guildhall, suites, and apartments sequences as your fort needs those levels." "Dreamfort blueprints take care of everything to get the fort up and running. You don't need to clear any trees or create any extra buildings or stockpiles (though of course you are free to do so). Blueprints that do require manual steps (like 'assign minecart to hauling route') will leave a message telling you so when you run them. Blueprints will also leave messages with hints when you might want to run ""quickfort orders"" to start manufacturing needed items."
"" ""
"This .csv file is generated from source .xlsx files. If you want to look at how these blueprints are put together, including full lists of their features, it will be easier to look at the .xlsx files than this giant .csv. You can view them online at: https://drive.google.com/drive/folders/1iS90EEVqUkxTeZiiukVj1pLloZqabKuP" "Dreamfort works best at an embark site that is flat and has at least one soil layer. New players should also avoid aquifers if they are not prepared to deal with them. Bring picks for mining, an axe for woodcutting, and an anvil for a forge."
You are welcome to copy those files and make your own modifications! ""
"Directly after embark, apply /surface1 on the surface (see /surface_help for how to select a good spot) and /industry1 on a level least two z-levels underground (the z-level immediately below the surface is reserved for the farming level). The walkthroughs for those levels will guide you. Once you channel out parts of the surface with /surface3, you can start the farming sequence on the z-level below the surface with /farming1. You can start the services, guildhall, suites, and apartments sequences as your fort needs those levels."
""
"This .csv file is generated from source .xlsx files. If you want to look at how these blueprints are put together, it will be easier to look at the online spreadsheets than this giant .csv. You can view them at: https://drive.google.com/drive/folders/1iS90EEVqUkxTeZiiukVj1pLloZqabKuP"
You are welcome to copy those spreadsheets and make your own modifications!
"#dreamfort.csv is generated with the following command: "#dreamfort.csv is generated with the following command:
for fname in dreamfort*.xlsx; do xlsx2csv -a -p '' $fname; done | sed 's/,*$//'" for fname in dreamfort*.xlsx; do xlsx2csv -a -p '' $fname; done | sed 's/,*$//'"
#notes label(surface_readme) #notes label(surface_help)
"Sets up a large, protected entrance to your fort in a flat area on the surface." "Sets up a large, protected entrance to your fort in a flat area on the surface."
"" ""
Features: Features:
A starting set of workshops and stockpiles (which you can later remove once you establish your permanent workshops and storage) - A starting set of workshops and stockpiles (which you can later remove once you establish your permanent workshops and storage)
Walls and lever-controlled gates for security - Trade depot area
Trap-filled hallways for invaders "- Walls, roof, and lever-controlled gates for security"
Livestock grazing area with nestbox zones and beehives - Trap-filled hallways for invaders
A grid of 1x1 farm plots (meant to be managed with DFHack autofarm) - Livestock grazing area with nestbox zones and beehives
An extra room near the entrance for a barracks (once you get your military going) - A grid of 1x1 farm plots (meant to be managed with DFHack autofarm)
Miasma vents for the farming level that is intended to be built in the layer directly beneath the surface - An extra room near the entrance for a barracks (once you get your military going)
- Miasma vents for the farming level that is intended to be built in the layer directly beneath the surface
"" ""
Manual steps you have to take: Manual steps you have to take:
Assign grazing livestock to the large pasture and dogs to the pasture over the stairwell (DFHack's autonestbox will manage the nestbox zones) - Assign grazing livestock to the large pasture and dogs to the pasture over the stairwell (DFHack's autonestbox can manage the nestbox zones)
Connect levers to the gates - Connect levers to the gates
""
"All blueprints are managed by the meta blueprints in the ""meta"" sheet. Each stage is meant to be applied after the previous stage is completely finished. For example, you can't build furniture until all the flooring has been constructed."
"" ""
Be sure to choose an embark site that has an area flat enough to use these blueprints! Be sure to choose an embark site that has an area flat enough to use these blueprints!
""
Surface Walkthrough:
"1) Choose a tile for your central staircase. 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 /surface4"". 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 /surface4"" to clean up."
""
"2) With the cursor on the chosen tile, run /surface1 to clear surrounding trees and set up your pastures. Remember to assign your dogs to the pasture around the staircase and your grazing animals to the large pasture. You can let your cats roam free."
""
"3) Once the trees have been cleared, run /surface2 to set up starting workshops/stockpiles and clear trees from a larger area. Run ""quickfort orders"" for /surface4, /surface5, and /surface6 to get a head start manufacturing items for those blueprints. If you want a consistent color for your walls and floors, remember to set the rock material in the buildingplan UI and in the manager orders for the blocks."
""
"4) Once the trees have been cleared from the larger area, run /surface3 to channel out the miasma vents for the farming level."
""
"5) When the channels have been dug, run /surface4 to build the protective walls and flooring. You can also start digging out the sub-surface farming level (/farming1) at this point. Although the vents will be covered with flooring, they will still work to prevent miasma."
""
"6) Once all the constructions are built, run /surface5 build gates, furniture, the trade depot, and traps."
""
"7) When at least the beehives are in place, run /surface6 to configure the hives and construct a roof."
"#meta label(surface1) start(staircase center) "#meta label(surface1) start(staircase center)
message(This would be a good time to start digging the industry level. message(Once the stairwell is mined out, you should start digging the industry level in a non-aquifer rock layer.
Once the area is clear, continue with /surface2.) clear an area and set up pastures" Once the area is clear of trees, continue with /surface2.) clear trees and set up pastures"
stair_guide/surface_stair_guide
clear_small/surface_clear_small clear_small/surface_clear_small
zones/surface_zones zones/surface_zones
"" ""
"#meta label(surface2) start(staircase center) message(This would be a good time to queue manager orders for /surface4, /surface5, and /surface6. If you want a consistent color for your walls, remember to set the rock material for the manager orders for blocks. "#meta label(surface2) start(staircase center) message(This would be a good time to queue manager orders for /surface4, /surface5, and /surface6. If you want a consistent color for your walls, remember to set the rock material in the buildingplan UI and in the manager orders for blocks.
Once the whole area is clear, continue with /surface3.) set up starting workshops/stockpiles and clear a larger area. if you didn't bring blocks, temporarily turn off the buildings_use_blocks setting so you can use wood or boulders" Once the whole area is clear of trees, continue with /surface3.) set up starting workshops/stockpiles and clear a larger area"
build_start/surface_build_start build_start/surface_build_start
place_start/surface_place_start place_start/surface_place_start
query_start/surface_query_start query_start/surface_query_start
clear/surface_clear clear/surface_clear
pick/surface_pick pick/surface_pick
"" ""
"#meta label(surface3) start(staircase center) message(Once the channels are dug out and you have around 650 blocks, continue with /surface4. You can also start digging out the sub-surface farming level once the channels are done.) channel to prevent miasma in the sub-surface farming level" "#meta label(surface3) start(staircase center) message(Once the channels are dug out, continue with /surface4. You can also start digging out the sub-surface farming level once the channels are done.) channel to prevent miasma in the sub-surface farming level"
dig/surface_channel dig/surface_channel
"" ""
"#meta label(surface4) start(staircase center) message(Once floors and walls are built and you have completed the manager orders for /surface5, continue with /surface5.) cover up the holes with flooring and build walls" "#meta label(surface4) start(staircase center) message(Once floors and walls are built, continue with /surface5.) cover up the holes with flooring and build walls"
build_floors/surface_floors build_floors/surface_floors
build_walls/surface_walls build_walls/surface_walls
"" ""
"#meta label(surface5) start(staircase center) message(Once you have around 1,050 blocks, continue with /surface6) build gates, furniture, the trade depot, and traps" "#meta label(surface5) start(staircase center) message(Once buildings have been constructed, continue with /surface6) build gates, furniture, the trade depot, and traps"
build_bridges/surface_gates build_bridges/surface_gates
build_buildings/surface_buildings build_buildings/surface_buildings
"" ""
@ -70,6 +89,36 @@ query_buildings/surface_query_buildings
build_scaffolding/surface_scaffolding build_scaffolding/surface_scaffolding
#< #<
build_roof/surface_roof build_roof/surface_roof
#dig label(surface_stair_guide) hidden() use the meta blueprints for normal application
j
#>
i
#>
i
#>
i
#>
i
#>
i
#>
i
#>
i
#>
i
#>
i
#>
i
#>
i
#>
i
#>
i
#>
i
#dig label(surface_clear_small) start(23; 25) hidden() use the meta blueprints for normal application #dig label(surface_clear_small) start(23; 25) hidden() use the meta blueprints for normal application
@ -119,7 +168,6 @@ build_roof/surface_roof
,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
#zone label(surface_zones) start(23; 25) hidden() message(remember to assign your dogs to the staircase pasture and your grazing animals to the large pasture) use the meta blueprints for normal application #zone label(surface_zones) start(23; 25) hidden() message(remember to assign your dogs to the staircase pasture and your grazing animals to the large pasture) use the meta blueprints for normal application
@ -820,31 +868,40 @@ p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,
#notes label(farming_readme) #notes label(farming_help)
"Sets up farming, food storage, and related industries. Also provides post-embark necessities that can later be disassembed." "Sets up farming, food storage, and related industries. Also provides post-embark necessities that can later be disassembed."
"" ""
Features: Features:
Pairs with the surface blueprints to provide miasma vents - Pairs with the surface blueprints to provide miasma vents
Farm plots (intended to be managed by DFHack autofarm) - Farm plots (intended to be managed by DFHack autofarm)
Plentiful food storage - Plentiful food storage
Refuse stockpile and quantum dump for useless body parts - Refuse stockpile and quantum dump for useless body parts
Small dormitory and dining room for post-embark needs - Small dormitory and dining room for post-embark needs
Small office for your manager - Small office for your manager
"" ""
Workshops: Workshops:
Kitchen - Kitchen
Brewery - Brewery
Butcher - Butcher
Fishery - Fishery
Tannery - Tannery
Farmer's Workshop - Farmer's Workshop
Quern - Quern
Screw Press - Screw Press
"" ""
Manual steps you have to take: Manual steps you have to take:
Assign the office to your manager - Assign the office to your manager
Assign a minecart to your quantum garbage stockpile hauling route - Assign a minecart to your quantum garbage stockpile hauling route
"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" "- 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"
""
Farming Walkthough:
"1) Wait until you have completed /surface3 before digging out the farming level on the z-level below the surface, otherwise you will likely get caveins as your miners channel out the miasma vents over empty space."
""
"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 and build and configure stockpiles. Remember to assign a minecart to the newly-designated quantum garbage dump. There are also jugs, pots, and bags stockpiles on this level that should be configured to ""take"" from the industry level stockpiles once we get the industry level built."
""
"4) When the furniture is in place, run /farming3 to designate your temporary dining room and dormitory. The blueprint also attempts to assign the office to your manager, but double-check this assignment in case your dwarves are in an unexpected order."
"#dig label(farming1) start(23; 25; staircase center) message(This would be a good time to queue up manager orders for /farming2. Once the area is dug out, continue with /farming2.)" "#dig label(farming1) start(23; 25; staircase center) message(This would be a good time to queue up manager orders for /farming2. Once the area is dug out, continue with /farming2.)"
@ -985,13 +1042,13 @@ query_stockpiles/farming_query_stockpiles
#place label(farming_place) start(23; 25) hidden() use the meta blueprints for normal application #place label(farming_place) start(23; 25) hidden() use the meta blueprints for normal application
,,,,,,,,,`,`,`,`,`,`,`,`,f(3x6),`,`,,`,,`,,f(14x16),`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,`,`,`,`,`,`,`,`,f(3x6),,,,`,,`,,f(14x16),,,,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,f(8x1),`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,f(8x1),,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,b(8x1),`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,b(8x1),,,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,,,`,,,`,,,`,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,`,,,`,,,`,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,f(14x10),`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,f(14x10),,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
@ -1002,7 +1059,7 @@ query_stockpiles/farming_query_stockpiles
,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,`,,,,`,,,,`,,,,`,`,`,,,`,,,,` ,,,,,,,,,`,,,,`,,,,`,,,,`,`,`,,,`,,,,`
,,,,,,,,u,u,u,u,`,`,`,u(5x3),`,`,`,`,,`,`,`,,`,`,`,,`,`,` ,,,,,,,,u,u,u,u,`,`,`,u(5x3),,,`,`,,`,`,`,,`,`,`,,`,`,`
,,,,,,,,g,`,`,u,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,g,`,`,u,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,g,g,g,g,`,`,`,`,`,`,`,`,,`,,`,,`,`,`,,`,`,` ,,,,,,,,g,g,g,g,`,`,`,`,`,`,`,`,,`,,`,,`,`,`,,`,`,`
,,,,,,,,,`,,,,`,,,,`,,,,`,`,`,,,`,,,,` ,,,,,,,,,`,,,,`,,,,`,,,,`,`,`,,,`,,,,`
@ -1010,20 +1067,20 @@ query_stockpiles/farming_query_stockpiles
,,,,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,` ,,,,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`
,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,,,,,,,,,,,,,`,`,`,,,,,`,,,,,` ,,,,,,,,,,,,,,,,,,,,,`,`,`,,,,,`,,,,,`
,,,,,,,,,`,`,`,,f(7x2),`,`,`,`,`,`,,`,,`,,r(2x3),`,`,`,`,,f(1x3),`,`,` ,,,,,,,,,`,`,`,,f(7x2),,,`,`,`,`,,`,,`,,r(2x3),,,`,`,,f(1x3),,,`
,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,` ,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`
,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,,,,`,,,,,` ,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,,,,`,,,,,`
,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,ry(14x10),`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,ry(14x10),,,,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,`,`,`,,f(7x2),`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,`,`,`,,f(7x2),,,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,,,,,,,,,,,,,ry(3x3),`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,,,ry(3x3),,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,,,,,,,,,,,,,,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,,,,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,,,,,,,,,,,,,,ry(1x1),,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,,,,ry,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
"#query label(farming_query_stockpiles) start(23; 25) hidden() message(remember to: "#query label(farming_query_stockpiles) start(23; 25) hidden() message(remember to:
@ -1068,7 +1125,7 @@ query_stockpiles/farming_query_stockpiles
,,,,,,,,,,,,,,,,,,,,,bodyparts,linksonly,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,,,bodyparts,linksonly,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,,,,,,,,,,,,,`,`,`,`,give2left,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,,,`,`,`,`,give2left,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,,,,,,,,,,,,,,{quantumstopfromnorth}{namelastrouteprefix}Trash Dumper{namelastroutesuffix},,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,,,,"{quantumstopfromnorth name=""Trash Dumper""}",,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,,,,,,,,,,,,,,,,,,,quantum,,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,,,,quantum,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
@ -1116,42 +1173,54 @@ query_stockpiles/farming_query_stockpiles
,,,,,,,,,,,,,,,,,,,,,,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,,,,,,,,,,,,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
#notes label(industry_readme) #notes label(industry_help)
Sets up workshops for all non-farming industries Sets up workshops for all non-farming industries
"" ""
Features: Features:
Quantum stockpiles - Quantum stockpiles
Space-efficient layout for all workshops - Space-efficient layout for all workshops
with separate stockpiles for: with separate stockpiles for:
A reserve of uncut gems for strange moods that the jeweler's workshop cannot take from - A reserve of uncut gems for strange moods that the jeweler's workshop cannot take from
Steel bars and coal so you can see at a glance if you're low on either - Steel bars and coal so you can see at a glance if you're low on either
Liquids that cannot be quantum stockpiled (e.g. lye) - Liquids that cannot be quantum stockpiled (e.g. lye)
Meltable weapons and armor - Meltable weapons and armor
"" ""
Workshops: Workshops:
3x Mason - 3x Mason
4x Craftsdwarf - 4x Craftsdwarf
1x Jeweler - 1x Jeweler
1x Mechanic - 1x Mechanic
4x Smelter - 4x Smelter
1x Forge - 1x Forge
1x Glassmaker - 1x Glassmaker
1x Kiln - 1x Kiln
4x Wood furnace - 4x Wood furnace
1x Ashery - 1x Ashery
1x Soap maker - 1x Soap maker
1x Carpenter - 1x Carpenter
1x Siege workshop - 1x Siege workshop
1x Bowyer - 1x Bowyer
1x Dyer - 1x Dyer
1x Loom - 1x Loom
1x Clothier - 1x Clothier
"" ""
"" ""
Manual steps you have to take: Manual steps you have to take:
Assign minecarts to your quantum stockpile hauling routes - 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" "- Give from the ""Goods"" quantum stockpile to the jugs, pots, and bags stockpiles on the farming level"
"If desired, set the stockpiles in the bottom right to auto-melt. This results in melting all weapons and armor that are not masterwork steel. This is great for your military, but it takes a *lot* of fuel. If you enable this, be sure you're in a heavily forested area, enable auto-chop, and set up manager orders to keep your coal stocks high." "- If desired, set the stockpiles in the bottom right to auto-melt. This results in melting all weapons and armor that are not masterwork steel. This is great for your military, but it takes a *lot* of fuel. If you enable this, be sure you're in a heavily forested area, enable auto-chop, and set up manager orders to keep your coal stocks high."
- Download automation.json from https://drive.google.com/file/d/17WcN5mK-rnADOm2B_JFpPnByYgkYjxhb/view and put it in your dfhack-config/orders/ directory.
""
Industry Walkthrough:
1) You can start digging out /industry1 immediately after embark. It is best to choose a stone layer at least two layers underground so the boulders can be used by your starting workshops to manufacture needed items.
""
"2) Queue up manufacturing by running ""quickfort orders"" on /industry2."
""
"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 to the jugs, pots, and bags stockpiles on the farming level."
""
"4) If you want to automatically melt goblinite and other low-quality weapons and armor, mark the south-east stockpiles for auto-melt."
""
"5) Run ""orders import automation"" to use the provided automation.json to take care of your fort's basic needs."
"#dig label(industry1) start(18; 18; staircase center) message(This would be a good time to queue manager orders for /industry2. Once the area is dug out, continue with /industry2.)" "#dig label(industry1) start(18; 18; staircase center) message(This would be a good time to queue manager orders for /industry2. Once the area is dug out, continue with /industry2.)"
@ -1267,7 +1336,8 @@ query/industry_query
"#query label(industry_query) start(18; 18) hidden() message(remember to: "#query label(industry_query) start(18; 18) hidden() message(remember to:
- assign minecarts to to your quantum stockpile hauling routes - assign minecarts to to your quantum stockpile hauling routes
- 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 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) use the meta blueprints for normal application" - if you want to automatically melt goblinite and other low-quality weapons and armor, mark the south-east stockpiles for auto-melt) use the meta blueprints for normal application
- now that your industry is set up, run ""orders import automation"" to automate your fort's basic needs (download automation.json from https://drive.google.com/file/d/17WcN5mK-rnADOm2B_JFpPnByYgkYjxhb/view?usp=sharing and put it in your dfhack-config/orders/ directory)"
,,,,,,,,,,,roughgems,nocontainers,`,`,`,`,t{Down 6}&,`,`,`,`,`,` ,,,,,,,,,,,roughgems,nocontainers,`,`,`,`,t{Down 6}&,`,`,`,`,`,`
@ -1277,7 +1347,7 @@ query/industry_query
,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,{quantum}g{Up}{Left 5}&,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,{quantum}g{Up}{Left 5}&,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,{quantumstopfromsouth}{namelastrouteprefix}Stoneworker quantum{namelastroutesuffix},`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,"{quantumstopfromsouth name=""Stoneworker quantum""}",`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,`,`,`,`,`,`,`,`,`,`,`,`,otherstone,,,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,otherstone,,,`,`,`,`,`,`,`,`,`,`,`,`
,,miscliquid,`,`,`,`,`,`,`,`,`,`,`,`,`,~,nocontainers,~,`,`,`,`,`,`,`,`,`,`,`,`,`,steelbars ,,miscliquid,`,`,`,`,`,`,`,`,`,`,`,`,`,~,nocontainers,~,`,`,`,`,`,`,`,`,`,`,`,`,`,steelbars
,,nocontainers,`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,nocontainers,`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,`
@ -1285,7 +1355,7 @@ query/industry_query
,,`,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,`
,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`
,,`,`,`,`,`,`,`,`,{cages}{permittraps},,,`,`,`,,,,`,`,`,forbidotherstone,,,`,`,`,`,`,`,`,t{Left 6}{Down}& ,,`,`,`,`,`,`,`,`,{cages}{permittraps},,,`,`,`,,,,`,`,`,forbidotherstone,,,`,`,`,`,`,`,`,t{Left 6}{Down}&
,,`,`,`,`,`,`,{quantum}g{Up 10}{Right 4}&,{quantumstopfromeast}{namelastrouteprefix}Goods/Wood quantum{namelastroutesuffix},~,nocontainers,~,`,,`,,`,,`,,`,~,nocontainers,~,{quantumstopfromwest}{namelastrouteprefix}Metalworker quantum{namelastroutesuffix},quantum,`,`,`,`,`,` ,,`,`,`,`,`,`,{quantum}g{Up 10}{Right 4}&,"{quantumstopfromeast name=""Goods/Wood quantum""}",~,nocontainers,~,`,,`,,`,,`,,`,~,nocontainers,~,"{quantumstopfromwest name=""Metalworker quantum""}",quantum,`,`,`,`,`,`
,,`,`,`,`,`,`,`,`,{tallow}{permitdye},,,`,`,`,,,,`,`,`,forbidpotash,,,`,`,`,`,`,`,`,t{Left 6}{Up}& ,,`,`,`,`,`,`,`,`,{tallow}{permitdye},,,`,`,`,,,,`,`,`,forbidpotash,,,`,`,`,`,`,`,`,t{Left 6}{Up}&
,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`
,,`,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,`
@ -1293,7 +1363,7 @@ query/industry_query
,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,craftrefuse,,,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,craftrefuse,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,~,nocontainers,~,`,`,`,`,`,`,`,`,`,`,`,`,`,coal ,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,~,nocontainers,~,`,`,`,`,`,`,`,`,`,`,`,`,`,coal
,,,,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,nocontainers,`,t{Up 7}&,~,~,~,~ ,,,,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,nocontainers,`,t{Up 7}&,~,~,~,~
,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,{quantumstopfromnorth}{namelastrouteprefix}Clothier/Bones quantum{namelastroutesuffix},`,`,`,`,`,`,{ironweapons}{permitsteelweapons}{forbidmasterworkweapons}{forbidartifactweapons} ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,"{quantumstopfromnorth name=""Clothier/Bones quantum""}",`,`,`,`,`,`,{ironweapons}{permitsteelweapons}{forbidmasterworkweapons}{forbidartifactweapons}
,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,quantum,`,`,`,`,`,`,{ironarmor}{permitsteelarmor},forbidmasterworkarmor,forbidartifactarmor,~,~,~,~ ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,quantum,`,`,`,`,`,`,{ironarmor}{permitsteelarmor},forbidmasterworkarmor,forbidartifactarmor,~,~,~,~
,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,nocontainers,give2up,t{Up 11}&,~,~,~,~ ,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,nocontainers,give2up,t{Up 11}&,~,~,~,~
@ -1303,23 +1373,34 @@ query/industry_query
,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,` ,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
#notes label(services_readme) #notes label(services_help)
"Sets up public services (dining, hospital, etc.)" "Sets up public services (dining, hospital, etc.)"
"" ""
Features: Features:
Spacious dining room (can be declared a tavern) - Spacious dining room (also usable as a tavern)
Food and drink stockpiles - Prepared food and drink stockpiles
Well system (bring your own water) - Well system (bring your own water)
Public baths with soap stockpiles - Public baths with soap stockpiles
Three well-appointed jail cells - Three well-appointed jail cells
Hospital with beds and storage - Hospital with beds and storage
Garbage dump - Garbage dump
"" ""
Manual steps you have to take: Manual steps you have to take:
"If you want to declare the dining room as a tavern, the bedrooms at the top can be assigned to the tavern as rented rooms." "- If you want to declare the dining room as a tavern, the bedrooms at the top can be assigned to the tavern as rented rooms."
"Configure the soap stockpiles to take from the industry level ""Metalworker"" quantum stockpile (which holds all the bars)" "- Configure the soap stockpiles to take from the industry level ""Metalworker"" quantum stockpile (which holds all the bars)"
"Convert the bath pit zones to pond zones when you are ready to fill them with 3-depth water. This is the only really fiddly bit, since you have to carefully disable the pond zone again when the final bucket to bring the water to an even 3-depth is on the way." "- Activate the bath pond zones when you are ready to fill them with 3-depth water. This is the only really fiddly bit, since you have to carefully disable the pond zone again when the final bucket to bring the water to an even 3-depth is on the way."
"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. If you want to fill with buckets, designate a pond zone on the level below the main floor. If you feel adventurous and are experience with water pressure, you can instead route (depressurized!) water to the second-to-bottom level (the one above the up staircases)." "- 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)."
""
Services Walkthough:
1) Start this level before your fort grows beyond around 50 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 well plumbing. Start manufacturing with ""quickfort orders"" on /services2."
""
"3) Once the area is dug out, set up the furniture, stockpiles, and hospital and garbage dump zones with /services2. Fill your soap stockpiles around the bath channels by configuring them to take from the bar quantum stockpile (the one on the right near the forge) on the industry level."
""
"4) When all furniture is placed, run /services3 to configure your dining room and jail."
""
5) Fill the bath and wells with either a bucket brigade or by carefully routing flowing water to them.
"#dig label(services1) start(23; 22; staircase center) message(This would be a good time to queue manager orders for /services2. Once the area is dug out, continue with /services2.)" "#dig label(services1) start(23; 22; staircase center) message(This would be a good time to queue manager orders for /services2. Once the area is dug out, continue with /services2.)"
@ -1531,7 +1612,7 @@ query_stockpiles/services_query_stockpiles
,,`,`,`,`,`,`,,`,`,`,`,`,` ,,`,`,`,`,`,`,,`,`,`,`,`,`
#zone label(services_zone) start(23; 22) hidden() use the meta blueprints for normal application #zone label(services_zone) start(23; 22) hidden() message(activate the bath pond zones when you are ready to fill them with 3-depth water) use the meta blueprints for normal application
,,`,`,`,,,`,`,`,,,`,`,` ,,`,`,`,,,`,`,`,,,`,`,`
@ -1552,9 +1633,9 @@ query_stockpiles/services_query_stockpiles
,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`
,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,,,,,,,,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,,,,,,,,`,`,`,`,`,`,`,`,`
,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`
,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,pa,`,`,`,`,`,`,`,`,`,pa,`,`,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,apPf(1x3),`,`,`,`,`,`,`,`,`,apPf(1x3),`,`,`,`,`,`,`,`,`,`,`
,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,pa,`,,`,`,`,`,`,,`,pa,`,,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,~,`,,`,`,`,`,`,,`,~,`,,`,`,`,`,`,`,`,`,`
,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,pa,`,`,`,`,`,`,`,`,`,pa,`,`,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,`,`,`,`
,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`
,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,d,,,,,,,,`,`,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,d,,,,,,,,`,`,`,`,`,`,`,`,`
,,,,,,`,`,,`,`,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,` ,,,,,,`,`,,`,`,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
@ -1633,11 +1714,18 @@ query_stockpiles/services_query_stockpiles
,,`,`,`,`,`,`,,`,`,`,`,`,` ,,`,`,`,`,`,`,,`,`,`,`,`,`
#notes label(guildhall_readme) #notes label(guildhall_help)
"Multiple 7x7 rooms for guildhalls, temples, libraries, etc." "Multiple 7x7 rooms for guildhalls, temples, libraries, etc."
"" ""
Features: Features:
"Big empty rooms. Double-thick walls to ensure engravings are on the ""correct"" side. Fill with furniture and assign as needed." "- Big empty rooms. Double-thick walls to ensure engravings add value to the ""correct"" side. Fill with furniture and assign as needed."
""
Guildhall Walkthrough:
"1) Dig out the rooms with /guildhall1 and queue up manufacturing by running ""quickfort orders"" on /guildhall2."
""
"2) Once the area is dug out, add in generic furniture with /guildhall2."
""
"3) Furnish individual rooms as you need specific guildhalls, libraries, and temples."
"#dig label(guildhall1) start(25; 25; staircase center) message(This would be a good time to queue manager orders for /guildhall2. Once the area is dug out, continue with /guildhall2.)" "#dig label(guildhall1) start(25; 25; staircase center) message(This would be a good time to queue manager orders for /guildhall2. Once the area is dug out, continue with /guildhall2.)"
@ -1738,13 +1826,25 @@ Features:
,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,` ,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`
#notes label(beds_readme) #notes label(beds_help)
Suites for nobles and apartments for the teeming masses Suites for nobles and apartments for the teeming masses
"" ""
Features: Features:
Well-appointed suites to satisfy most nobles - Well-appointed suites to satisfy most nobles
Apartments with beds and storage to keep dwarves happy - Apartments with beds and storage to keep dwarves happy
Meta blueprint included for designating 6 levels of apartments for a full 200+ dwarves - Meta blueprint included for designating 6 levels of apartments for a full 200+ dwarves
""
Suites Walkthrough:
"1) Dig out the suites layer with /suites1 and queue up manufacturing by running ""quickfort orders"" on /suites2."
""
"2) Once the area is dug out, furnish the suites with /suites2. The rooms are left unconfigured so you can set them up as needed room types and assign them to specific nobles. Each room can serve as a bedroom, a dining hall, an office, or a tomb."
""
Apartments Walkthrough:
"1) Dig out one layer of apartments with /apartments1, or 6 layers at once (enough for 200 dwarves) with /apartments1_stack. Run ""quickfort orders"" for /apartments2 once for every apartments layer that you are digging."
""
"2) Once a layer is dug out, furnish it with /apartments2."
""
"3) Once the beds are in place (the other furniture can still be unbuilt), configure the rooms with /apartments3. Once the urns are all in place, run ""burial -pets"" to set them all to accept burials."
"#dig label(suites1) start(18; 18; staircase center) message(This would be a good time to queue manager orders for /suites2. Once the area is dug out, continue with /suites2) noble suites" "#dig label(suites1) start(18; 18; staircase center) message(This would be a good time to queue manager orders for /suites2. Once the area is dug out, continue with /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

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

@ -1,10 +1,9 @@
#build start(8;2;center of wagon) basic post embark workshops #build label(workshops) start(8;2;center of wagon) basic post embark workshops
~,~ ,~,~,~ ,~,`,`,`,~,~ ,~,~,~ ,~,# `,` ,`,`,` ,`,~,~,~,`,` ,`,`,` ,`,#
~,wc,~,~,wt,~,`,`,`,~,wm,~,~,wr,~,# `,wc,`,`,wt,`,~,~,~,`,wm,`,`,wr,`,#
~,~ ,~,~,~ ,~,`,`,`,~,~ ,~,~,~ ,~,# `,` ,`,`,` ,`,~,~,~,`,` ,`,`,` ,`,#
#,# ,#,#,# ,#,#,#,#,#,# ,#,#,# ,#,# #,# ,#,#,# ,#,#,#,#,#,# ,#,#,# ,#,#
#place label(stockpiles) basic post embark stockpiles
#place basic post embark stockpiles
w(5x10), , , , ,s(5x1) , , , , ,p(5x1), , , , ,# w(5x10), , , , ,s(5x1) , , , , ,p(5x1), , , , ,#
, , , , ,g(5x4) , , , , ,d(5x1), , , , ,# , , , , ,g(5x4) , , , , ,d(5x1), , , , ,#
, , , , , , , , , ,f(5x3), , , , ,# , , , , , , , , , ,f(5x3), , , , ,#

1 #build start(8;2;center of wagon) basic post embark workshops #build label(workshops) start(8;2;center of wagon) basic post embark workshops
2 ~,~ ,~,~,~ ,~,`,`,`,~,~ ,~,~,~ ,~,# `,` ,`,`,` ,`,~,~,~,`,` ,`,`,` ,`,#
3 ~,wc,~,~,wt,~,`,`,`,~,wm,~,~,wr,~,# `,wc,`,`,wt,`,~,~,~,`,wm,`,`,wr,`,#
4 ~,~ ,~,~,~ ,~,`,`,`,~,~ ,~,~,~ ,~,# `,` ,`,`,` ,`,~,~,~,`,` ,`,`,` ,`,#
5 #,# ,#,#,# ,#,#,#,#,#,# ,#,#,# ,#,# #,# ,#,#,# ,#,#,#,#,#,# ,#,#,# ,#,#
6 #place basic post embark stockpiles #place label(stockpiles) basic post embark stockpiles
w(5x10), , , , ,s(5x1) , , , , ,p(5x1), , , , ,#
7 , , , , ,g(5x4) , , , , ,d(5x1), , , , ,# w(5x10), , , , ,s(5x1) , , , , ,p(5x1), , , , ,#
8 , , , , , , , , , ,f(5x3), , , , ,# , , , , ,g(5x4) , , , , ,d(5x1), , , , ,#
9 , , , , , , , , , , , , , , ,# , , , , , , , , , ,f(5x3), , , , ,#

@ -0,0 +1,768 @@
#notes label(help)
"This is Buketgeshud, or translated from Dwarvish, The Quick Fortress. It is a set of basic blueprints for quickfort, demonstrating its use in assembling an entire basic (if incomplete) fort."
""
Buketgeshud is designed around a 30x20 footprint with a common 2x2 central staircase. Blueprints can be repeated in any direction to connect in a modular fashion with adjacent 30x20 areas. A fortresswide example recirculating waterfall/plumbing system is included as an overlay if you're feeling hardcore.
""
Walkthrough:
1) Embark!
""
2) Clear a 30 wide x 20 high region of trees on the surface. This should be uninterrupted flat ground with soil (so that we can place farms below). Deconstruct your wagon.
""
"3) Run /surface1. You'll want to put the cursor in the middle of the 30x20 cleared area (14 right, 8 down from the top left corner). This digs out stairs on the surface, a farm/depot/workshop level below, as well as the beginnings of an entrance moat. The beginnings of a 3rd z-level are also dug out; don't build anything here if you'd like to put waterfall plumbing in later."
""
"4) After /surface1 is dug out, run /surface2 (beginning from the same starting position as you used for /surface1). This puts down a basic set of workshops commonly needed soon after embark, a couple farm plots, and a depot. It also places and configures starting stockpiles."
""
"5) If your embark site is near any enemies, run /surface3 to build walls and traps on the surface to protect against invaders."
""
"6) Dig out the central shaft and tunnels for several z-levels below our surface/depot level. Place the cursor THREE Z-levels below the surface, where no digging has occurred yet, and run /basic1 for 6 z-levels down starting from that level."
""
"7) Optionally run /basic2 to designate booze-only stockpiles around the central stairs on every z-level below the farming level. The stockpiles are configured to take booze from the level above, so be sure to apply /basic2 on the top level first and work your way down."
""
"8) Run workshops, bedrooms, and storeroom blueprints on any desired Z-level along our central shaft."
""
"9) If desired, add a fortresswide waterfall system, bathing your dwarves in tile after tile of lovely waterfall mist as they go about their day. Run /waterfall1 on the z-level immediately below your farm/depot level (you left that space empty, didn't you?) and run /plumbing1 on z-levels below that, down to the bottom of your fort. Each application of /plumbing1 will dig out two floors. On the bottommost level, the screw pumps that will be placed there require 2 floor tiles to sit on, so remove or refloor the 2 northern channel designations in the lower right corner on that z-level. You'll also need a reservior in the z-level below that (not included)."
""
"10) After all levels are dug out, apply /plumbing2 on the *bottommost* level, just above the reservior. The blueprint will build screw pumps on that level and the level above. Repeat on every alternate level up to the level below where you applied /waterfall1."
""
"11) Finally, apply /waterfall2 on the z-level where you applied /waterfall1. Route flowing water to the 2 tiles in lower right."
"#dig label(surface1) start(15;10; top left corner of central stairs) message(The 3rd z-level just digs stairs; if you want to install the waterfall plumbing system later, leave this 3rd level EMPTY for now and start the base proper below that; use /basic1 to dig out areas for future use below.) Surface and farm/depot levels"
`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,h,,,,,~,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,h,,h,h,,~,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,h,,,h,,~,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,h,h,,h,`,`,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,h,,,h,h,h,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,h,,h,h,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,h,,,,h,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,h,h,h,h,h,,`,#
`,,,,j,,,,,,,,,,j,j,,,,,,,`,h,,,,,,`,#
`,,,,j,,,,,,,,,,j,j,,,,,,,`,h,,h,h,h,h,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,h,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,h,h,h,h,h,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,h,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,h,,h,h,h,h,`,#
`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,h,,,,,,`,#
`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,h,h,h,h,,`,#
`,,,,,,,,,,,,`,,,,,`,,,,,~,~,,,,,,`,#
`,,,,,,,,,,,,`,,,,,`,,,,,`,`,h,h,h,h,h,`,#
`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
d,d,d,d,j,d,d,d,d,d,d,d,d,d,j,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,d,d,d,`,,,,,,,`,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,,,,d,d,d,d,d,`,,,,,,,`,#
`,,,,d,,,,,,,,d,,d,d,,d,,,,,`,,,,,,,`,#
d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,`,,,,,,,`,#
d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,`,,,,,,,`,#
`,,,,d,,,,d,d,d,d,,d,d,d,d,,d,d,d,d,`,,,,,,,`,#
d,d,d,d,d,d,d,,d,d,d,d,,d,d,d,d,,d,d,d,d,`,,,,,,,`,#
d,d,d,d,d,d,d,,,,d,d,,,d,d,,,,,,,`,,,,,,,`,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,`,,,,,,,`,#
d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,`,,,,,,,`,#
d,d,d,d,d,d,d,,d,d,d,d,,d,d,d,d,d,d,d,d,d,`,,,,,,,`,#
d,d,d,d,d,d,d,,d,d,d,d,,r,r,r,r,d,d,d,d,d,`,,,,,,,`,#
d,d,d,d,d,d,d,d,d,d,d,d,,~,~,~,~,d,d,d,d,d,`,,,,,,,`,#
`,`,`,`,j,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
d,,,,i,,,,,,,,,,i,i,,,,,,,,,,j,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,d,d,,,,,,,,,,,,,,,#
,,,,i,,,,,,,,,d,i,i,d,,,,,,,,,j,,,,,#
,,,,i,,,,,,,,,d,i,i,d,,,,,,,,,j,,,,,#
,,,,,,,,,,,,,,d,d,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,i,,,,,,,,,,j,j,,,,,,,,,,j,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#meta label(surface2) Build basic workshops and stockpiles
/surface2_build
/surface2_place
/surface2_query
/surface2_doors
"#build label(surface2_build) hidden() start(15;10; top left corner of central stairs) Populates the surface and farm/depot levels with farm plots, workshops and a depot"
`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,~,#
`,,,,,,,,wu,,,wr,,,,,,,,,,,`,,,,,,,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
`,,,,,,,,wn,,,,,,,,,,,,,,`,,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,,,,,,,`,#
`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,,,,,,,`,#
`,,,,,,,,,,,,`,,,,,`,,,,,~,,,,,,,`,#
`,,,,,,,,,,,,`,,,,,`,,,,,`,,,,,,,`,#
`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
,,,,`,,,,p(6x7),,,,,,`,`,p(6x7),,,,,,`,`,`,`,`,`,`,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,wl,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
`,`,`,`,,`,`,`,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,`,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,`,`,`,,,`,`,,,`,`,`,`,`,`,`,,,,,,,`,#
,wc,,,,wm,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,`,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,`,,,,,`,,,,,,,D,,,`,,,,,,,`,#
,wt,,,,wr,,`,,,,,`,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,`,,,,,,,,,,`,,,,,,,`,#
,,,,`,,,`,,,,,`,`,`,`,`,,,,,,`,`,`,`,`,`,`,`,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#place label(surface2_place) hidden() start(15;10; top left corner of central stairs) Lay stockpiles on surface and depot/farm levels
`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
`,r(6x6),,,,,~,,,,,,,r(3x6),,,r(5x6),,,,,z(1x6),`,`,,,,,~,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,`,`,,~,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,,`,,~,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,,`,`,`,`,#
`,~,,,,,~,,,,,,,~,,,~,,,,,~,`,`,,`,`,,,`,#
`,,,,,,,,,,,,,,,,,,w(4x8),,,,`,`,,,,`,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,`,`,`,`,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,`,`,`,`,`,#
`,u(11x3),,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,,,,,,`,#
`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,`,`,`,`,,`,#
`,,,,,,,,,,,,`,,,,,`,y(4x2),,,,~,~,,,,,,`,#
`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,`,`,`,`,`,`,#
`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
f,f,f,f,,f,f,f,,,,,,,`,`,,,,,,,`,`,`,`,`,`,`,`,#
f,f,f,f,f,f,f,f,,,,,,,f(2x6),,,,,,,,`,,,,,,,`,#
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(2x1),,,`,,,,,`,,,,,,,`,#
w(4x2),,,,,f(9x2),,,,,,,,,`,`,f(1x2),,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,`,`,,,,,,,`,,,,,,,`,#
,,,,`,,,,g(4x2),,,,,,f(2x1),,,,,,,,`,,,,,,,`,#
,,,s(1x8),,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,`,`,,,,,,,`,,,,,,,`,#
,,,,,,,,g(4x5),,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,`,,,,,,,,,`,`,`,`,,,,,,`,`,`,`,`,`,`,`,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#query label(surface2_query) hidden() start(15;10; top left corner of central stairs) message(remember to set the farm plots to grow plump helmets) Adjust surface/depot level stockpiles
`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
`,bodyparts,,,,,~,,,,,,,rawhides,,,craftrefuse,,,,,,`,`,,,,,~,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,`,`,,~,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,,`,,~,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,,`,`,`,`,#
`,~,,,,,~,,,,,,,~,,,~,,,,,~,`,`,,`,`,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,`,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,`,`,`,`,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,,,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,,`,`,`,`,`,#
`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,,,,,,`,#
`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,`,`,`,`,,`,#
`,,,,,,,,,,,,`,,,,,`,,,,,~,~,,,,,,`,#
`,,,,,,,,,,,,`,,,,,`,,,,,`,`,`,`,`,`,`,`,#
`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
noseeds,,,,,,,,,,,,,,`,`,,,,,,,`,`,`,`,`,`,`,`,#
,,,,,,,,,,,,,,seeds,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,`,,,,,,`,`,`,`,,,,,,`,,,,,,,`,#
,,,,`,,,,,,,,`,,booze,t{Down}{Left 2}&,,`,,,,,`,,,,,,,`,#
,,,,,booze,,,,,,,,,`,`,booze,,,,,,`,,,,,,,`,#
,,,,,t{Up 5}&,,,,,,,,,`,`,t{Left 3}&,,,,,,`,,,,,,,`,#
,,,,`,,,,,,,,,,booze,t{Up}{Left 2}&,,,,,,,`,,,,,,,`,#
,,,otherstone,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,`,`,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,~,~,~,~,,,,,,`,,,,,,,`,#
,,,,`,,,,,,,,,`,`,`,`,,,,,,`,`,`,`,`,`,`,`,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#build label(surface2_doors) hidden() start(15;10; top left corner of central stairs) Just builds doors on the depot level (just below the surface)
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
`,,,,d,,,,,,,,d,,,,,d,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,`,`,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,`,`,,,,,,,`,,,,,,,`,#
`,,,,d,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,d,d,,,d,d,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,d,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,d,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,`,`,`,`,,,,,,`,,,,,,,`,#
,,,,,,,,,,,,,~,~,~,~,,,,,,`,,,,,,,`,#
`,`,`,`,~,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#meta label(surface3) Build walls and traps to protect against invaders
/surface3_walls
/surface3_traps
#build label(surface3_walls) hidden() start(15;10; top left corner of central stairs) Builds walls and bridges on the surface level. Note that the entrance on the southern wall juts out from the 30x20 footprint by 3 tiles; the southern bridge extends beyond the edge of the blueprint itself.\n\nYou'll need to add and connect levers yourself.
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,,,,,,gd(2x3),,#
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,#
Cw,,,,,,,,,,,,Cw,gw(4x2),,,,Cw,,,,,Cw,,,,,,,Cw,#
Cw,,,,,,,,,,,,Cw,,,,,Cw,,,,,Cw,Cw,,,,,,Cw,#
Cw,,,,,,,,,,,,Cw,,,,,Cw,,,,,ga(2x1),,,,,,,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,gw(4x2),,,,Cw,,,,,,,,,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#build label(surface3_traps) hidden() start(15;10; top left corner of central stairs) Put some stone-fall traps down.
`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,Ts,,~,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,`,`,,~,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,`,,~,~,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,`,Ts,`,`,`,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,`,`,`,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,`,`,Ts,Ts,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,Ts,`,Ts,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,Ts,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,Ts,Ts,Ts,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,`,`,`,`,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,Ts,Ts,Ts,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,Ts,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,Ts,Ts,Ts,`,#
`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,`,`,`,`,`,#
`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,Ts,Ts,Ts,Ts,Ts,`,#
`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,`,`,`,`,Ts,`,#
`,,,,,,,,,,,,`,,,,,`,,,,,~,~,Ts,Ts,Ts,Ts,Ts,`,#
`,,,,,,,,,,,,`,,,,,`,,,,,`,`,`,`,`,`,`,`,#
`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#dig label(basic1) start(15;10; top left corner of central stairs) Common stair/shaft digging for all floors below surface/depot levels
,,,,i,,,,,,,,,,i,i,,,,,,,,,,i,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
,,,,i,,,,,,,,,,i,i,,,,,,,,,,i,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#meta label(basic2) Place and configure food/booze stockpiles around the central staircase
/basic2_place
/basic2_query
#place label(basic2_place) hidden() start(15;10; top left corner of central stairs) Places food stockpiles around the central staircase
,,,,`,,,,,,,,,,`,`,,,,,,,,,,`,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,f(2x1),,,,,,,,,,,,,,,,#
,,,,`,,,,,,,,,f(1x2),`,`,f(1x2),,,,,,,,,`,,,,,#
,,,,`,,,,,,,,,,`,`,,,,,,,,,,`,,,,,#
,,,,,,,,,,,,,,f(2x1),,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,`,,,,,,,,,,`,`,,,,,,,,,,`,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
"#query label(basic2_query) hidden() start(15;10; top left corner of central stairs) configures booze stockpiles around stairway, taking from the stockpile on the level above"
,,,,`,,,,,,,,,,`,`,,,,,,,,,,`,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,booze,t<&,,,,,,,,,,,,,,,#
,,,,`,,,,,,,,,booze,`,`,booze,,,,,,,,,`,,,,,#
,,,,`,,,,,,,,,t<&,`,`,t<&,,,,,,,,,`,,,,,#
,,,,,,,,,,,,,,booze,t<&,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,`,,,,,,,,,,`,`,,,,,,,,,,`,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
"#dig label(workshops1) start(15;10; top left corner of central stairs) Just four big rooms, suitable for workshops"
d,d,d,d,i,d,d,d,d,d,d,d,d,,i,i,,d,d,d,d,d,d,d,d,i,d,d,d,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,#
,d,,,d,,,,,,,,d,,d,d,,d,,,,,,,,d,,,,,#
d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
,d,,,d,,,,,,,,d,,d,d,,d,,,,,,,,d,,,,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,`,`,`,`,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,`,,,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,`,,,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,`,,,,#
,,,,i,,,,,,,,,,i,i,,,,,,,,,,i,`,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#meta label(workshops2) Build commonly needed workshops and associated stockpiles
/workshops2_build
/workshops2_place
/workshops2_doors
#build label(workshops2_build) hidden() start(15;10; top left corner of central stairs) Sufficient workshops for basic non-food needs
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
,,,wj,,,,we,,,,we,,,`,`,,,es,,,,ew,,,,ek,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
,,,wj,,,,we,,,,we,,,`,`,,,es,,,,eg,,,,wf,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
`,`,`,`,~,`,`,`,`,`,`,`,`,`,~,~,`,`,`,`,`,`,`,`,`,~,`,`,`,`,#
`,`,`,`,~,`,`,`,`,`,`,`,`,`,~,~,`,`,`,`,`,`,`,`,`,~,`,`,`,`,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
,,,wr,,,,wr,,,,wm,,,`,`,,,wc,,,,wc,,,,wb,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
`,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
`,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
`,,,wt,,,,wt,,,,wm,,,`,`,,,wc,,,,wc,,,,,,,,#
`,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
`,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#place label(workshops2_place) hidden() start(15;10; top left corner of central stairs) Workshop source material piles placed around the workshops.
e,e,e,e,,l,l,l,l,l,l,l,l,,`,`,,b,b,b,b,b,b,b,b,,b,b,b,,#
e,e,e,e,e,l,l,l,l,l,l,l,l,,`,`,,b,b,b,b,b,b,b,b,b,b,b,b,,#
e,e,,,,l,,,,l,,,,,`,`,,,,,b,,,,b,,,,b,,#
e,e,,,,l,,,,l,,,,,`,`,,,,,b,,,,b,,,,b,,#
e,e,,,,l,,,,l,,,,,`,`,,,,,b,,,,b,,,,b,,#
,,,,,l,,,,l,,,,,`,`,,,,,b,,,,b,,,,b,,#
,,,,,l,,,,l,,,,,`,`,,,,,b,,,,b,,,,b,,#
,,,,,l,,,,l,,,,,`,`,,,,,b,,,,b,,,,b,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
`,`,`,`,~,`,`,`,`,`,`,`,`,`,~,~,`,`,`,`,`,`,`,`,`,~,`,`,`,`,#
`,`,`,`,~,`,`,`,`,`,`,`,`,`,~,~,`,`,`,`,`,`,`,`,`,~,`,`,`,`,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,w,,,,w,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,w,,,,w,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,w,,,,w,,,,,,#
,,,s(10x1),,,,,,,,,,,`,`,,w,w,w,w,w,w,w,w,w,,,,,#
,,,,,,,,,,,,,,`,`,,,,,w,,,,w,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,w,,,,w,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,w,,,,w,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#build label(workshops2_doors) hidden() start(15;10; top left corner of central stairs) Fill in doors to the workrooms.
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
,d,,,d,,,,,,,,d,,,,,d,,,,,,,,d,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,d,,,d,,,,,,,,d,,,,,d,,,,,,,,d,,,,,#
,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
"#dig label(storeroom1) start(15;10; Top left corner of central stairs) Just four big rooms, suitable for storerooms"
d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
,,,,d,,,,,,,,d,,d,d,,d,,,,,,,,d,,,,,#
d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
,,,,d,,,,,,,,d,,d,d,,d,,,,,,,,d,,,,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,,,,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,,,,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,,,,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,,,,,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,d,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#meta label(storeroom2a) General stockpiles
/storeroom2a_place
/storeroom2_doors
"#meta label(storeroom2b) Extra storage for wood, food and furniture"
/storeroom2b_place
/storeroom2_doors
#place label(storeroom2a_place) hidden() start(15;10; top left corner of central stairs) General stockpiles
g(6x8),,,,x(1x1),,l(7x8),,,,,,,,,,,d(7x5),,,,,,,p(6x5),x(1x1),,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,b(7x3),,,,,,,z(6x3),,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
`,`,`,`,,`,`,`,`,`,`,`,,`,,,`,,`,`,`,`,`,`,`,,`,`,`,`,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
`,`,`,`,,`,`,`,`,`,`,`,,`,,,`,,`,`,`,`,`,`,`,,`,`,`,`,#
u(13x8),,,,,,,,,,,,,,,,,u(7x8),,,,,,,w(6x8),,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,x(4x5),,,`,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,`,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,`,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,`,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,`,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
"#place label(storeroom2b_place) hidden() start(15;10; top left corner of central stairs) Extra storage for wood, food and furniture"
w(13x8),,,,x(1x1),,,,,,,,,,,,,f(13x8),,,,,,,,x(1x1),,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
`,`,`,`,,`,`,`,`,`,`,`,,`,,,`,,`,`,`,`,`,`,`,,`,`,`,`,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
`,`,`,`,,`,`,`,`,`,`,`,,`,,,`,,`,`,`,`,`,`,`,,`,`,`,`,#
u(13x8),,,,,,,,,,,,,,,,,u(13x8),,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,x(4x5),,,`,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,`,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,`,,,,#
,,,,,,,,,,,,,`,,,`,,,,,,,,,,`,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,`,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#build label(storeroom2_doors) hidden() start(15;10; top left corner of central stairs) Build storeroom doors
,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
,,,,d,,,,,,,,d,,,,,d,,,,,,,,d,,,,d,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,d,,,,,,,,d,,,,,d,,,,,,,,d,,,,d,#
,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#dig label(bedrooms1) start(15;10; top left corner of central stairs) Bedroom complex
d,d,d,,i,,d,d,d,,d,d,d,,i,i,,d,d,d,,d,d,d,,i,,,,,#
d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,,d,d,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,d,d,,#
d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
d,,d,,d,,d,,d,,d,d,d,d,d,d,d,d,d,d,,d,,d,,d,,d,d,,#
d,,d,,d,,d,,d,,,,,,d,d,,,,,,d,,d,,d,,d,d,,#
d,,d,,d,,d,,d,,,d,d,d,d,d,d,d,d,,,d,,d,,d,d,d,d,,#
d,,d,,d,,d,,d,,d,d,d,d,d,d,d,d,d,d,,d,,d,,d,,,,,#
d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
d,,d,,d,,d,,d,,d,d,d,d,d,d,d,d,d,d,,d,,d,,d,,,,,#
d,,d,,d,,d,,d,,,d,d,d,d,d,d,d,d,,,d,,d,,d,d,d,d,,#
d,,d,,d,,d,,d,,,,,,d,d,,,,,,d,,d,,d,,d,d,,#
d,,d,,d,,d,,d,,d,d,d,d,d,d,d,d,d,d,,d,,d,,d,,d,d,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,,,,,#
,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,,,,,#
,,,,i,,,,,,,,,,i,i,,,,,,,,,,i,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#build label(bedrooms2) start(15;10; top left corner of central stairs) Bedroom furniture
f,h,h,,,,h,h,f,,f,h,h,,,,,h,h,f,,f,h,h,,,,,,,#
b,,,d,,d,,,b,,b,,,d,,,d,,,b,,b,,,d,,,f,h,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,h,,#
b,f,h,d,,d,h,f,b,,b,f,h,d,,,d,h,f,b,,b,f,h,d,,d,,b,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
b,,b,,,,b,,b,,b,f,h,d,,,d,h,f,b,,b,,b,,,,f,h,,#
f,,f,,,,f,,f,,,,,,,,,,,,,f,,f,,,,,h,,#
h,,h,,,,h,,h,,,t,t,,,,,,,,,h,,h,,,d,,b,,#
d,,d,,,,d,,d,,,c,c,,,,,,,,,d,,d,,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
d,,d,,,,d,,d,,,,,,,,,c,c,,,d,,d,,,,,,,#
h,,h,,,,h,,h,,,,,,,,,t,t,,,h,,h,,,d,,h,,#
f,,f,,,,f,,f,,,,,,,,,,,,,f,,f,,,,,h,,#
b,,b,,,,b,,b,,b,f,h,d,,,d,h,f,b,,b,,b,,,,f,b,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
b,f,h,d,,d,h,f,b,,b,f,h,d,,,d,h,f,b,,b,f,h,d,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
b,f,h,d,,d,h,f,b,,b,f,h,d,,,d,h,f,b,,b,f,h,d,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#query label(bedrooms3) start(15;10; top left corner of central stairs) Makes bedrooms and small dining rooms from beds and tables
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
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+,,r+,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#dig label(plumbing1) start(15;10; top left corner of central stairs) Plumbing for the waterfall system
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,h,h,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,h,,,,,,,,,h,,,,,,,,,,,#
,,,,,,,,,,h,,,,,,,,,h,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,h,h,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,h,h,#
,,,,,,,,,,,,,,,,,,,,,,,,,,d,d,d,d,#
,,,,,,,,,,,,,,,,,,,,,,,,,,d,,h,h,#
,,,,,,,,,,,,,,,,,,,,,,,,,i,d,,d,d,#
#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,h,h,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,h,,,,,,,,,h,,,,,,,,,,,#
,,,,,,,,,,h,,,,,,,,,h,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,h,h,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,d,d,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,h,h,#
,,,,,,,,,,,,,,,,,,,,,,,,,,d,d,d,d,#
,,,,,,,,,,,,,,,,,,,,,,,,,i,d,,h,h,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
"#build label(plumbing2) start(15;10; top left corner of central stairs) Grates, doors, and screw pumps for the waterfall plumbing"
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,G,G,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,G,,,,,,,,,G,,,,,,,,,,,#
,,,,,,,,,,G,,,,,,,,,G,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,G,G,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,`,`,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,d,Msm,Msm,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,~,#
#<,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,G,G,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,G,,,,,,,,,G,,,,,,,,,,,#
,,,,,,,,,,G,,,,,,,,,G,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,G,G,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,~,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,d,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,Msu,Msu,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,`,`,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#dig label(waterfall1) start(15;10; top left corner of central stairs) Top-level plumbing for the waterfall system
,,,,i,,,,,,,,,,i,i,,,,,,,,,,i,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,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,,,,,,,,,,,,d,,d,#
,,,,,,d,,,,,,,,,,,,,,,,,,,,,d,,d,#
,,,,,,d,,,,,,,,,,,,,,,,,,,,,d,,d,#
,,,,,,d,,,,,,,,,,,,,,,,,,,,,d,,d,#
,,,,i,,d,d,d,d,h,,,,i,i,,,,h,d,d,d,d,,i,,d,,d,#
,,,,i,,d,d,d,d,h,,,,i,i,,,,h,d,d,d,d,,i,,d,d,d,#
,,,,,,,,,,,,,,,,,,,,,,,d,,,,,d,d,#
,,,,,,,,,,,,,,,,,,,,,,,d,d,d,d,d,d,d,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,d,d,d,#
,,,,,,,,,,,,,,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,#
,,,,i,,,,,,,,,,i,i,,,,,,,,,,i,,,d,d,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
"#build label(waterfall2) start(15;10; top left corner of central stairs) message(Remember to link the levers and lock the doors manually) Floodgates, screw pumps, bridges and levers to control flow"
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,x,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,x,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,gw(2x1),,#
,,,,,,,,,,,,,,,,x,,,,,,Tl,,,,,d,,,#
,,,,,,,,,,,,,,,,,,,,,Tl,Tl,Tl,d,,,,,,#
,,,,,,,,,,,,,,,,,,,,,,Tl,,,,,d,Msm,Msm,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
Can't render this file because it has a wrong number of fields in line 29.

@ -0,0 +1,26 @@
#dig start(6;6) room for 24 corpses
d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d,d,d, ,d, ,d,#
, , , ,d,d,d, , , , ,#
d, ,d,d,i,i,i,d,d, ,d,#
d,d,d,d,i,i,i,d,d,d,d,#
d, ,d,d,i,i,i,d,d, ,d,#
, , , ,d,d,d, , , , ,#
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(urns) start(6;6) message(use burial script to mark urns as usable) 24 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,#
#,#,#,#,#,#,#,#,#,#,#,#
1 #dig start(6;6) room for 24 corpses
2 d, ,d, ,d, ,d, ,d, ,d,#
3 d,d,d,d,d,d,d,d,d,d,d,#
4 d, ,d, ,d,d,d, ,d, ,d,#
5 , , , ,d,d,d, , , , ,#
6 d, ,d,d,i,i,i,d,d, ,d,#
7 d,d,d,d,i,i,i,d,d,d,d,#
8 d, ,d,d,i,i,i,d,d, ,d,#
9 , , , ,d,d,d, , , , ,#
10 d, ,d, ,d,d,d, ,d, ,d,#
11 d,d,d,d,d,d,d,d,d,d,d,#
12 d, ,d, ,d, ,d, ,d, ,d,#
13 #,#,#,#,#,#,#,#,#,#,#,#
14 #build label(urns) start(6;6) message(use burial script to mark urns as usable) 24 urns
15 n, ,n, ,n, ,n, ,n, ,n,#
16 `,`,`,`,`,`,`,`,`,`,`,#
17 n, ,n, ,`,`,`, ,n, ,n,#
18 , , , ,`,`,`, , , , ,#
19 n, ,`,`,~,~,~,`,`, ,n,#
20 `,`,`,`,~,~,~,`,`,`,`,#
21 n, ,`,`,~,~,~,`,`, ,n,#
22 , , , ,`,`,`, , , , ,#
23 n, ,n, ,`,`,`, ,n, ,n,#
24 `,`,`,`,`,`,`,`,`,`,`,#
25 n, ,n, ,n, ,n, ,n, ,n,#
26 #,#,#,#,#,#,#,#,#,#,#,#

@ -0,0 +1,99 @@
#dig start(24;25) room for 513 corpses
# see an image of this blueprint at https://i.imgur.com/Kcjvx6R.png
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d,d,d,d,d,d,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
, , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
, , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
, , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
, , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
, , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , ,d,d,d, , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d,d,i,i,i,d,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
, , , , , , , , , , , , , , , , , ,d,d,d,d,i,i,i,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d,d,i,i,i,d,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , ,d,d,d, , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
, , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
, , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
, , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
, , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
, , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
d, ,d, ,d, ,d, ,d, ,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(urns) start(24;24) message(use burial script to mark urns as usable) 513 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, ,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, ,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, ,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,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
1 #dig start(24;25) room for 513 corpses
2 # see an image of this blueprint at https://i.imgur.com/Kcjvx6R.png
3 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d,d,d,d,d,d,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
4 d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
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,#
6 , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
7 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
8 d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
9 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
10 , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
11 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
12 d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
13 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
14 , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
15 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
16 d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
17 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
18 , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
19 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
20 d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
21 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
22 , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
23 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
24 d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , ,d,d,d, , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
25 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d,d,i,i,i,d,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
26 , , , , , , , , , , , , , , , , , ,d,d,d,d,i,i,i,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
27 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d,d,i,i,i,d,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
28 d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , ,d,d,d, , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
29 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
30 , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
31 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
32 d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
33 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
34 , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
35 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
36 d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
37 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
38 , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
39 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
40 d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
41 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
42 , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
43 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
44 d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
45 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
46 , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
47 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
48 d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
49 d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d,d,d,d,d,d,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
50 #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
51 #build label(urns) start(24;24) message(use burial script to mark urns as usable) 513 urns
52 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`,`,`,`,`,`,`,`,`,`,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
53 `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
54 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
55 , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
56 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
57 `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
58 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
59 , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
60 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
61 `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
62 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
63 , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
64 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
65 `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
66 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
67 , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
68 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
69 `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
70 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
71 , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
72 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n,`,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
73 `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , ,`,`,`, , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
74 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`,`,`,`,~,~,~,`,`,`,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
75 , , , , , , , , , , , , , , , , , ,`,`,`,`,~,~,~,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
76 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`,`,`,`,~,~,~,`,`,`,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
77 `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , ,`,`,`, , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
78 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n,`,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
79 , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
80 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
81 `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
82 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
83 , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
84 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
85 `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
86 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
87 , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
88 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
89 `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
90 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
91 , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
92 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
93 `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
94 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
95 , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
96 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
97 `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
98 n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,`,`,`,`,`,`,`,`,`,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
99 #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#

@ -1,8 +1,8 @@
# Common baseline for aliases for quickfort query mode blueprints. # Common baseline for aliases for quickfort query mode blueprints.
# #
# Please DO NOT EDIT this file directly. Instead, custom aliases should be added # Please DO NOT EDIT this file directly. It will get overwritten when DFHack
# to dfhack-config/quickfort/aliases.txt. See that file for syntax # is updated. Instead, custom aliases should be added to
# documentation. # dfhack-config/quickfort/aliases.txt. See that file for syntax documentation.
# #
# The aliases in this file were tested in DF 0.47.04 on 2020 Jul 18. # The aliases in this file were tested in DF 0.47.04 on 2020 Jul 18.
# #
@ -17,10 +17,6 @@
# #
# Aliases that don't fit into those two categories have comments explaining # Aliases that don't fit into those two categories have comments explaining
# their usage. # their usage.
#
# There is also a non-alphanumeric alias built into the code for the common
# shorthand for "make room":
# r+ expands to r+&
######################################## ########################################
@ -31,14 +27,19 @@ linksonly: a
nocontainers: CE nocontainers: CE
# for configuring stockpiles to give to other nearby stockpiles/workshops # for configuring stockpiles to give to other nearby stockpiles/workshops
give2up: g{Up 2}& give: g{move}&
give2down: g{Down 2}& give2up: {give move={Up 2}}
give2left: g{Left 2}& give2down: {give move={Down 2}}
give2right: g{Right 2}& give2left: {give move={Left 2}}
give10up: g{Up 10}& give2right: {give move={Right 2}}
give10down: g{Down 10}& give10up: {give move={Up 10}}
give10left: g{Left 10}& give10down: {give move={Down 10}}
give10right: g{Right 10}& give10left: {give move={Left 10}}
give10right: {give move={Right 10}}
# Keep in mind that building, stockpile, and zone names have a maximum length
# of 20 characters. usage example: {givename name="myname"}
givename: {Ctrl}n{name}&
# use to toggle a sequence of stockpile options. for example: {togglesequence 5} # use to toggle a sequence of stockpile options. for example: {togglesequence 5}
togglesequence: &{Down} togglesequence: &{Down}
@ -49,7 +50,9 @@ enablesequence: e{Down}
# clothes and armor in this quantum stockpile will rot away. If you want bones # clothes and armor in this quantum stockpile will rot away. If you want bones
# in your quantum stockpile, apply this alias to a refuse stockpile (but don't # in your quantum stockpile, apply this alias to a refuse stockpile (but don't
# put useful clothes or armor in there!) # put useful clothes or armor in there!)
quantum: {linksonly}{nocontainers}{enableanimals}{enablefood}{furnitureprefix}{enablestone}{enableammo}{enablecoins}{enablebars}{enablegems}{enablefinishedgoods}{enableleather}{enablecloth}{enablewood}}{enableweapons}{enablearmor}{enablesheet} # Optionally set a name for the stockpile by specifying the 'name' parameter,
# for example: {quantum name="my name"}
quantum: {linksonly}{nocontainers}{enableanimals}{enablefood}{enablefurniture}{enablestone}{enableammo}{enablecoins}{enablebars}{enablegems}{enablefinishedgoods}{enableleather}{enablecloth}{enablewood}{enableweapons}{enablearmor}{enablesheet}{givename}
################################## ##################################
@ -58,25 +61,38 @@ quantum: {linksonly}{nocontainers}{enableanimals}{enablefood}{furnitureprefix}{e
# Run one of the quantumstopfrom* aliases over a track stop that is set to dump # Run one of the quantumstopfrom* aliases over a track stop that is set to dump
# into a quantum stockpile. The alias will set up the stop to accept all types # into a quantum stockpile. The alias will set up the stop to accept all types
# (the actual types stored in the quantum stockpile is controlled by the feeder # (the actual types stored in the quantum stockpile should be controlled by the
# stockpile) and link the indicated adjacent feeder stockpile (for example, the # feeder stockpile) and link the indicated adjacent feeder stockpile. For
# quantumstopfromsouth alias will link to a feeder stockpile to the South). All # example, the quantumstopfromsouth alias should be used over a track stop set
# you need to do afterwards is assign a vehicle to the stop (and optionally # to dump to the North and take items from a feeder stockpile one tile to the
# give the route a name --see the namelastroute* aliases below). The track stop # South. All you need to do afterwards is assign a vehicle to the stop. The
# does not need to be constructed yet, but the feeder stockpile needs to exist # track stop does not need to be constructed yet, but the feeder stockpile needs
# so we can link it. # to exist so we can link to it.
quantumstopprefix: ^hrs&xxx&{enablesequence 17}^ #
quantumstopfromeast: {quantumstopprefix}s{Right}p^{Left}^q # Be sure to define the optional 'name' parameter if you want to give your
quantumstopfromsouth: {quantumstopprefix}s{Down}p^{Up}^q # quantum hauling routes custom names. Keep in mind that names have a maximum
quantumstopfromwest: {quantumstopprefix}s{Left}p^{Right}^q # length of 22 characters. For example:
quantumstopfromnorth: {quantumstopprefix}s{Up}p^{Down}^q # {quantumstopfromsouth name="Trash Dump"}
#
# Give a name to the most recently defined route. Keep in mind that names have # For several examples of these aliases, see
# a maximum length of 22 characters. It assumes that the route has exactly one # https://docs.google.com/spreadsheets/d/1gvTJxxRxZ5V4vXkqwhL-qlr_lXCNt8176TK14m4kSOU
# stop defined. Use it with the quantumstopfrom* aliases above like this:
# {quantumstopfromeast}{namelastrouteprefix}Trash Dumper{namelastroutesuffix}
namelastrouteprefix: ^h--n namelastrouteprefix: ^h--n
namelastroutesuffix: &^q namelastroutesuffix: &^q
namelastroute: {namelastrouteprefix}{name}{namelastroutesuffix}
quantumstopprefix: ^hrs&xxx&{enablesequence 17}^
quantumstopsuffix: ^q{namelastroute}
quantumstopfromeast: {quantumstopprefix}s{Right}p^{Left}{quantumstopsuffix}
quantumstopfromsouth: {quantumstopprefix}s{Down}p^{Up}{quantumstopsuffix}
quantumstopfromwest: {quantumstopprefix}s{Left}p^{Right}{quantumstopsuffix}
quantumstopfromnorth: {quantumstopprefix}s{Up}p^{Down}{quantumstopsuffix}
##################################
# zone aliases
##################################
# usage example: {namezone name="my zone name"}
namezone: ^i{givename}^q
################################## ##################################

@ -42,6 +42,9 @@ set(LIBZIP_ENABLE_OPENSSL OFF CACHE BOOL "")
set(LIBZIP_ENABLE_WINDOWS_CRYPTO OFF CACHE BOOL "") set(LIBZIP_ENABLE_WINDOWS_CRYPTO OFF CACHE BOOL "")
set(LIBZIP_DO_INSTALL OFF CACHE BOOL "") set(LIBZIP_DO_INSTALL OFF CACHE BOOL "")
add_subdirectory(libzip) add_subdirectory(libzip)
if(MSVC)
target_compile_options(zip PRIVATE /wd4244)
endif()
set(XLSXIO_USE_DFHACK_LIBS ON CACHE BOOL "") set(XLSXIO_USE_DFHACK_LIBS ON CACHE BOOL "")
set(XLSXIO_BUILD_STATIC ON CACHE BOOL "") set(XLSXIO_BUILD_STATIC ON CACHE BOOL "")
@ -55,3 +58,7 @@ set(XLSXIO_LIBZIP_DIR "${CMAKE_CURRENT_BINARY_DIR}/libzip" CACHE PATH "")
set(XLSXIO_EXPAT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libexpat" CACHE PATH "") set(XLSXIO_EXPAT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libexpat" CACHE PATH "")
set(XLSXIO_ENABLE_INSTALL OFF CACHE BOOL "") set(XLSXIO_ENABLE_INSTALL OFF CACHE BOOL "")
add_subdirectory(xlsxio) add_subdirectory(xlsxio)
if(MSVC)
target_compile_options(xlsxio_read_STATIC PRIVATE /wd4013 /wd4244)
target_compile_options(xlsxio_write_STATIC PRIVATE /wd4013 /wd4244)
endif()

@ -1,6 +1,6 @@
# aliases for quickfort query mode blueprints # Aliases for quickfort #query mode blueprints
# #
# This file defines custom keycode shortcuts for query mode blueprints. # This file defines custom keycode shortcuts for #query mode blueprints.
# Definitions in this file take precedence over any definitions in the baseline # Definitions in this file take precedence over any definitions in the baseline
# aliases configuration file at hack/data/quickfort/aliases-common.txt. See that # aliases configuration file at hack/data/quickfort/aliases-common.txt. See that
# file for the many useful aliases that are already defined. # file for the many useful aliases that are already defined.
@ -22,12 +22,12 @@
# #
# For example, say you have the following build and place blueprints: # For example, say you have the following build and place blueprints:
# #
# #build start(4;1;upper left corner of stockpile) build masonry workshop # #build masonry workshop
# ~, ~,~,`,`,` # ~, ~,~,`,`,`
# ~,wm,~,`,`,` # ~,wm,~,`,`,`
# ~, ~,~,`,`,` # ~, ~,~,`,`,`
# #
# #place start(4;1;upper left corner of stockpile) place stockpile for mason # #place stockpile for mason
# ~,~,~,s,s,s # ~,~,~,s,s,s
# ~,~,~,s,s,s # ~,~,~,s,s,s
# ~,~,~,s,s,s # ~,~,~,s,s,s
@ -58,19 +58,31 @@
# The syntax for defining aliases is: # The syntax for defining aliases is:
# aliasname: keystrokes # aliasname: keystrokes
# #
# Where aliasname is at least two letters or digits long and keystrokes are # Where aliasname is at least two letters or digits long (including dashes and
# whatever you would type into the DF UI. A keystroke can also be a named # underscores) and keystrokes are whatever you would type into the DF UI. A
# keycode from the DF interface definition file (data/init/interface.txt), # keystroke can also be a named keycode from the DF interface definition file
# enclosed in curly brackets like an alias, like: "{Right}" or "{Enter}". In # (data/init/interface.txt), enclosed in curly brackets like an alias, like:
# order to avoid naming conflicts between aliases and keycodes, the convention # "{Right}" or "{Enter}". In # order to avoid naming conflicts between aliases
# is to start aliases with a lowercase letter. You can add spaces in between # and keycodes, the convention is to start aliases with a lowercase letter.
# keystrokes to make them easier to read. Spaces in keystroke sequences will be
# ignored. To insert a literal space, use "{Space}"
# #
# Anything enclosed within curly brackets can also have a number after it, # Anything enclosed within curly brackets can also have a number after it,
# indicating how many times that alias or keycode should be repeated. For # indicating how many times that alias or keycode should be repeated. For
# example: "{togglesequence 9}" or "{Down 5}". # example: "{togglesequence 9}" or "{Down 5}".
# #
# Finally, you can specify sub-aliases that will only be defined while the
# current alias is being resolved by adding them after the alias name (but
# before the repetition number, if it is specified), for example:
# {quantumstopfromeast name="Trash Dump"}
# The value of the sub-alias 'name' is used by quantumstopfromeast (or one of
# the aliases it calls) to give a useful name to your quantum dump hauling
# route. You can also use this format to temporarily override the value of an
# existing regularly-defined alias.
#
# Sub-aliases must be in one of the following formats:
# subaliasname=valwithnospaces
# subaliasname="val with spaces"
# subaliasname={someotheralias repetitions}
#
# Ctrl, Alt, and Shift modifiers can be specified for the next keycode by adding # Ctrl, Alt, and Shift modifiers can be specified for the next keycode by adding
# them into the key sequence. For example, Alt-h is written as "{Alt}h". # them into the key sequence. For example, Alt-h is written as "{Alt}h".
# #
@ -83,8 +95,12 @@
# ! expands to {Ctrl} # ! expands to {Ctrl}
# ^ expands to {ESC} # ^ expands to {ESC}
# #
# There is also a non-standard alias built into the code for the common
# shorthand for "make room":
# r+ expands to r+&
#
# If you need literal verisons of the shorthand characters, surround them in # If you need literal verisons of the shorthand characters, surround them in
# curly brackets, for example: "{~}" # curly brackets, for example: "{!}"
# #
# #
# Add your custom aliases here: # Add your custom aliases here:

@ -5,23 +5,28 @@
# #
# If you have edited this file but want to revert to "factory defaults", delete # If you have edited this file but want to revert to "factory defaults", delete
# this file and a fresh one will be copied from # this file and a fresh one will be copied from
# dfhack-config/default/quickfort/qickfort.txt the next time you start DFHack. # dfhack-config/default/quickfort/quickfort.txt the next time you start DFHack.
# Directory tree to search for blueprints. Can be set to an absolute or relative # Directory tree to search for blueprints. Can be set to an absolute or relative
# path. If set to a relative path, resolves to a directory under the DF folder. # path. If set to a relative path, resolves to a directory under the DF folder.
# Note that if you change this directory, you will not automatically pick up
# blueprints written by the DFHack "blueprint" plugin (which always writes to
# the "blueprints" dir).
blueprints_dir=blueprints blueprints_dir=blueprints
# Force all blueprint buildings that could be built with any building material # Set to "true" or "false". If true, will designate all dig blueprints in marker
# to only use blocks. The prevents logs, boulders, and bars (e.g. potash and
# coal) from being wasted on constructions. If set to false, buildings will be
# built with any available building material.
buildings_use_blocks=true
# Set to "true" or "false". If true, will designate dig blueprints in marker
# mode. If false, only cells with dig codes explicitly prefixed with an "m" will # mode. If false, only cells with dig codes explicitly prefixed with an "m" will
# be designated in marker mode. # be designated in marker mode.
force_marker_mode=false force_marker_mode=false
# Skip query blueprint sanity checks that detect common blueprint errors and
# halt or skip keycode playback. Checks include ensuring a configurable building
# exists at the designated cursor position and verifying the active UI screen is
# the same before and after sending keys for the cursor position. Temporarily
# enable this if you are running a query blueprint that sends a key sequence
# that is *not* related to stockpile or building configuration.
query_unsafe=false
# Set to the maximum number of resources you want assigned to stockpiles of the # Set to the maximum number of resources you want assigned to stockpiles of the
# relevant types. Set to -1 for DF defaults (number of stockpile tiles for # relevant types. Set to -1 for DF defaults (number of stockpile tiles for
# stockpiles that take barrels and bins, 1 wheelbarrow for stone stockpiles). # stockpiles that take barrels and bins, 1 wheelbarrow for stone stockpiles).

@ -454,9 +454,55 @@ Other init files
directory, will be run when any world or that save is loaded. directory, will be run when any world or that save is loaded.
.. _dfhack-config:
Configuration Files
===================
Some DFHack settings can be changed by modifying files in the ``dfhack-config``
folder (which is in the DF folder). The default versions of these files, if they
exist, are in ``dfhack-config/default`` and are installed when DFHack starts if
necessary.
.. _script-paths:
Script paths
------------
Script paths are folders that DFHack searches to find a script when a command is
run. By default, the following folders are searched, in order (relative to the
root DF folder):
1. :file:`data/save/{<region folder>}/raw/scripts` (only if a save is loaded)
2. :file:`raw/scripts`
3. :file:`hack/scripts`
For example, if ``teleport`` is run, these folders are searched in order for
``teleport.lua`` or ``teleport.rb``, and the first matching file is run.
Script paths can be added by modifying :file:`dfhack-config/script-paths.txt`.
Each line should start with one of these characters:
- ``+``: adds a script path that is searched *before* the default paths (above)
- ``-``: adds a script path that is searched *after* the default paths
- ``#``: a comment (the line is ignored)
Paths can be absolute or relative - relative paths are interpreted relative to
the root DF folder.
.. admonition:: Tip
When developing scripts in the :source:scripts:`dfhack/scripts repo <>`,
it may be useful to add the path to your local copy of the repo with ``+``.
This will allow you to make changes in the repo and have them take effect
immediately, without needing to re-install or copy scripts over manually.
Script paths can also be modified programmatically through the `Lua API <lua-api-internal>`.
.. _env-vars: .. _env-vars:
Environment variables Environment Variables
===================== =====================
DFHack's behavior can be adjusted with some environment variables. For example, DFHack's behavior can be adjusted with some environment variables. For example,

@ -150,3 +150,19 @@ DF, DFHack, and other utilities. If you are new to Dwarf Fortress and DFHack,
these may be easier to set up. Note that these packs are not maintained by the these may be easier to set up. Note that these packs are not maintained by the
DFHack team and vary in their release schedules and contents. Some may make DFHack team and vary in their release schedules and contents. Some may make
significant configuration changes, and some may not include DFHack at all. significant configuration changes, and some may not include DFHack at all.
Linux packages
==============
Third-party DFHack packages are available for some Linux distributions,
including in:
* `AUR <https://aur.archlinux.org/packages/dfhack/>`__, for Arch and related
distributions
* `RPM Fusion <https://admin.rpmfusion.org/pkgdb/package/nonfree/dfhack/>`__,
for Fedora and related distributions
Note that these may lag behind DFHack releases. If you want to use a newer
version of DFHack, we generally recommended installing it in a clean copy of DF
in your home folder. Attempting to upgrade an installation of DFHack from a
package manager may break it.

@ -1132,7 +1132,7 @@ Job module
Does basic sanity checks to verify if the suggested item type matches Does basic sanity checks to verify if the suggested item type matches
the flags in the job item. the flags in the job item.
* ``dfhack.job.isSuitableMaterial(job_item, mat_type, mat_index)`` * ``dfhack.job.isSuitableMaterial(job_item, mat_type, mat_index, item_type)``
Likewise, if replacing material. Likewise, if replacing material.
@ -2160,6 +2160,14 @@ unless otherwise noted.
Changes the current directory to ``path``. Use with caution. Changes the current directory to ``path``. Use with caution.
* ``dfhack.filesystem.restore_cwd()``
Restores the current working directory to what it was when DF started.
* ``dfhack.filesystem.get_initial_cwd()``
Returns the value of the working directory when DF was started.
* ``dfhack.filesystem.mkdir(path)`` * ``dfhack.filesystem.mkdir(path)``
Creates a new directory. Returns ``false`` if unsuccessful, including if ``path`` already exists. Creates a new directory. Returns ``false`` if unsuccessful, including if ``path`` already exists.
@ -2213,6 +2221,8 @@ Console API
Flushes all output to the console. This can be useful when printing text that Flushes all output to the console. This can be useful when printing text that
does not end in a newline but should still be displayed. does not end in a newline but should still be displayed.
.. _lua-api-internal:
Internal API Internal API
------------ ------------
@ -2311,7 +2321,7 @@ and are only documented here for completeness:
* ``dfhack.internal.addScriptPath(path, search_before)`` * ``dfhack.internal.addScriptPath(path, search_before)``
Adds ``path`` to the list of paths searched for scripts (both in Lua and Ruby). Registers ``path`` as a `script path <script-paths>`.
If ``search_before`` is passed and ``true``, the path will be searched before If ``search_before`` is passed and ``true``, the path will be searched before
the default paths (e.g. ``raw/scripts``, ``hack/scripts``); otherwise, it will the default paths (e.g. ``raw/scripts``, ``hack/scripts``); otherwise, it will
be searched after. be searched after.
@ -2321,17 +2331,18 @@ and are only documented here for completeness:
* ``dfhack.internal.removeScriptPath(path)`` * ``dfhack.internal.removeScriptPath(path)``
Removes ``path`` from the script search paths and returns ``true`` if successful. Removes ``path`` from the list of `script paths <script-paths>` and returns
``true`` if successful.
* ``dfhack.internal.getScriptPaths()`` * ``dfhack.internal.getScriptPaths()``
Returns the list of script paths in the order they are searched, including defaults. Returns the list of `script paths <script-paths>` in the order they are
(This can change if a world is loaded.) searched, including defaults. (This can change if a world is loaded.)
* ``dfhack.internal.findScript(name)`` * ``dfhack.internal.findScript(name)``
Searches script paths for the script ``name`` and returns the path of the first Searches `script paths <script-paths>` for the script ``name`` and returns the
file found, or ``nil`` on failure. path of the first file found, or ``nil`` on failure.
.. note:: .. note::
This requires an extension to be specified (``.lua`` or ``.rb``) - use This requires an extension to be specified (``.lua`` or ``.rb``) - use
@ -3687,7 +3698,7 @@ the plugin. See existing files in ``plugins/lua`` for examples.
blueprint blueprint
========= =========
Native functions: Native functions provided by the `blueprint` plugin:
* ``dig(start, end, name)`` * ``dig(start, end, name)``
* ``build(start, end, name)`` * ``build(start, end, name)``
@ -3697,19 +3708,104 @@ Native functions:
``start`` and ``end`` are tables containing positions (see ``start`` and ``end`` are tables containing positions (see
``xyz2pos``). ``name`` is used as the basis for the filename. ``xyz2pos``). ``name`` is used as the basis for the filename.
.. _building-hacks:
building-hacks
==============
This plugin overwrites some methods in workshop df class so that mechanical workshops are possible. Although
plugin export a function it's recommended to use lua decorated function.
.. contents::
:local:
Functions
---------
``registerBuilding(table)`` where table must contain name, as a workshop raw name, the rest are optional:
:name:
custom workshop id e.g. ``SOAPMAKER``
.. note:: this is the only mandatory field.
:fix_impassible:
if true make impassible tiles impassible to liquids too
:consume:
how much machine power is needed to work.
Disables reactions if not supplied enough and ``needs_power==1``
:produce:
how much machine power is produced.
:needs_power:
if produced in network < consumed stop working, default true
:gears:
a table or ``{x=?,y=?}`` of connection points for machines.
:action:
a table of number (how much ticks to skip) and a function which
gets called on shop update
:animate:
a table of frames which can be a table of:
a. tables of 4 numbers ``{tile,fore,back,bright}`` OR
b. empty table (tile not modified) OR
c. ``{x=<number> y=<number> + 4 numbers like in first case}``,
this generates full frame useful for animations that change little (1-2 tiles)
:canBeRoomSubset:
a flag if this building can be counted in room. 1 means it can, 0 means it can't and -1 default building behaviour
:auto_gears:
a flag that automatically fills up gears and animate. It looks over building definition for gear icons and maps them.
Animate table also might contain:
:frameLength:
how many ticks does one frame take OR
:isMechanical:
a bool that says to try to match to mechanical system (i.e. how gears are turning)
``getPower(building)`` returns two number - produced and consumed power if building can be modified and returns nothing otherwise
``setPower(building,produced,consumed)`` sets current productiona and consumption for a building.
Examples
--------
Simple mechanical workshop::
require('plugins.building-hacks').registerBuilding{name="BONE_GRINDER",
consume=15,
gears={x=0,y=0}, --connection point
animate={
isMechanical=true, --animate the same conn. point as vanilla gear
frames={
{{x=0,y=0,42,7,0,0}}, --first frame, 1 changed tile
{{x=0,y=0,15,7,0,0}} -- second frame, same
}
}
Or with auto_gears::
require('plugins.building-hacks').registerBuilding{name="BONE_GRINDER",
consume=15,
auto_gears=true
}
buildingplan buildingplan
============ ============
Native functions: Native functions provided by the `buildingplan` plugin:
* ``bool isPlannableBuilding(df::building_type type)`` returns whether the building type is handled by buildingplan * ``bool isPlannableBuilding(df::building_type type, int16_t subtype, int32_t custom)`` returns whether the building type is handled by buildingplan.
* ``void addPlannedBuilding(df::building *bld)`` suspends the building jobs and adds the building to the monitor list * ``bool isPlanModeEnabled(df::building_type type, int16_t subtype, int32_t custom)`` returns whether the buildingplan UI is enabled for the specified building type.
* ``bool isPlannedBuilding(df::building *bld)`` returns whether the given building is managed by buildingplan.
* ``void addPlannedBuilding(df::building *bld)`` suspends the building jobs and adds the building to the monitor list.
* ``void doCycle()`` runs a check for whether buildlings in the monitor list can be assigned items and unsuspended. This method runs automatically twice a game day, so you only need to call it directly if you want buildingplan to do a check right now. * ``void doCycle()`` runs a check for whether buildlings in the monitor list can be assigned items and unsuspended. This method runs automatically twice a game day, so you only need to call it directly if you want buildingplan to do a check right now.
* ``void scheduleCycle()`` schedules a cycle to be run during the next non-paused game frame. Can be called multiple times while the game is paused and only one cycle will be scheduled.
burrows burrows
======= =======
Implements extended burrow manipulations. The `burrows` plugin implements extended burrow manipulations.
Events: Events:
@ -3751,15 +3847,134 @@ Native functions:
The lua module file also re-exports functions from ``dfhack.burrows``. The lua module file also re-exports functions from ``dfhack.burrows``.
sort .. _cxxrandom:
====
cxxrandom
=========
Exposes some features of the C++11 random number library to Lua.
.. contents::
:local:
Native functions (exported to Lua)
----------------------------------
- ``GenerateEngine(seed)``
returns engine id
- ``DestroyEngine(rngID)``
destroys corresponding engine
Does not export any native functions as of now. Instead, it - ``NewSeed(rngID, seed)``
calls lua code to perform the actual ordering of list items.
re-seeds engine
- ``rollInt(rngID, min, max)``
generates random integer
- ``rollDouble(rngID, min, max)``
generates random double
- ``rollNormal(rngID, avg, stddev)``
generates random normal[gaus.]
- ``rollBool(rngID, chance)``
generates random boolean
- ``MakeNumSequence(start, end)``
returns sequence id
- ``AddToSequence(seqID, num)``
adds a number to the sequence
- ``ShuffleSequence(rngID, seqID)``
shuffles the number sequence
- ``NextInSequence(seqID)``
returns the next number in sequence
Lua plugin functions
--------------------
- ``MakeNewEngine(seed)``
returns engine id
Lua plugin classes
------------------
``crng``
~~~~~~~~
- ``init(id, df, dist)``: constructor
- ``id``: Reference ID of engine to use in RNGenerations
- ``df`` (optional): bool indicating whether to destroy the Engine when the crng object is garbage collected
- ``dist`` (optional): lua number distribution to use
- ``changeSeed(seed)``: alters engine's seed value
- ``setNumDistrib(distrib)``: sets the number distribution crng object should use
- ``distrib``: number distribution object to use in RNGenerations
- ``next()``: returns the next number in the distribution
- ``shuffle()``: effectively shuffles the number distribution
``normal_distribution``
~~~~~~~~~~~~~~~~~~~~~~~
- ``init(avg, stddev)``: constructor
- ``next(id)``: returns next number in the distribution
- ``id``: engine ID to pass to native function
``real_distribution``
~~~~~~~~~~~~~~~~~~~~~
- ``init(min, max)``: constructor
- ``next(id)``: returns next number in the distribution
- ``id``: engine ID to pass to native function
``int_distribution``
~~~~~~~~~~~~~~~~~~~~
- ``init(min, max)``: constructor
- ``next(id)``: returns next number in the distribution
- ``id``: engine ID to pass to native function
``bool_distribution``
~~~~~~~~~~~~~~~~~~~~~
- ``init(min, max)``: constructor
- ``next(id)``: returns next boolean in the distribution
- ``id``: engine ID to pass to native function
``num_sequence``
~~~~~~~~~~~~~~~~
- ``init(a, b)``: constructor
- ``add(num)``: adds num to the end of the number sequence
- ``shuffle()``: shuffles the sequence of numbers
- ``next()``: returns next number in the sequence
.. _eventful: .. _eventful:
Eventful eventful
======== ========
This plugin exports some events to lua thus allowing to run lua functions This plugin exports some events to lua thus allowing to run lua functions
@ -3920,91 +4135,9 @@ Integrated tannery::
b=require "plugins.eventful" b=require "plugins.eventful"
b.addReactionToShop("TAN_A_HIDE","LEATHERWORKS") b.addReactionToShop("TAN_A_HIDE","LEATHERWORKS")
.. _building-hacks:
Building-hacks
==============
This plugin overwrites some methods in workshop df class so that mechanical workshops are possible. Although
plugin export a function it's recommended to use lua decorated function.
.. contents::
:local:
Functions
---------
``registerBuilding(table)`` where table must contain name, as a workshop raw name, the rest are optional:
:name:
custom workshop id e.g. ``SOAPMAKER``
.. note:: this is the only mandatory field.
:fix_impassible:
if true make impassible tiles impassible to liquids too
:consume:
how much machine power is needed to work.
Disables reactions if not supplied enough and ``needs_power==1``
:produce:
how much machine power is produced.
:needs_power:
if produced in network < consumed stop working, default true
:gears:
a table or ``{x=?,y=?}`` of connection points for machines.
:action:
a table of number (how much ticks to skip) and a function which
gets called on shop update
:animate:
a table of frames which can be a table of:
a. tables of 4 numbers ``{tile,fore,back,bright}`` OR
b. empty table (tile not modified) OR
c. ``{x=<number> y=<number> + 4 numbers like in first case}``,
this generates full frame useful for animations that change little (1-2 tiles)
:canBeRoomSubset:
a flag if this building can be counted in room. 1 means it can, 0 means it can't and -1 default building behaviour
:auto_gears:
a flag that automatically fills up gears and animate. It looks over building definition for gear icons and maps them.
Animate table also might contain:
:frameLength:
how many ticks does one frame take OR
:isMechanical:
a bool that says to try to match to mechanical system (i.e. how gears are turning)
``getPower(building)`` returns two number - produced and consumed power if building can be modified and returns nothing otherwise
``setPower(building,produced,consumed)`` sets current productiona and consumption for a building.
Examples
--------
Simple mechanical workshop::
require('plugins.building-hacks').registerBuilding{name="BONE_GRINDER",
consume=15,
gears={x=0,y=0}, --connection point
animate={
isMechanical=true, --animate the same conn. point as vanilla gear
frames={
{{x=0,y=0,42,7,0,0}}, --first frame, 1 changed tile
{{x=0,y=0,15,7,0,0}} -- second frame, same
}
}
Or with auto_gears::
require('plugins.building-hacks').registerBuilding{name="BONE_GRINDER",
consume=15,
auto_gears=true
}
.. _luasocket: .. _luasocket:
Luasocket luasocket
========= =========
A way to access csocket from lua. The usage is made similar to luasocket in vanilla lua distributions. Currently A way to access csocket from lua. The usage is made similar to luasocket in vanilla lua distributions. Currently
@ -4078,8 +4211,9 @@ A class with all the tcp functionality.
map-render map-render
========== ==========
A way to ask df to render a slice of map. This uses native df rendering function so it's highly dependant on A way to ask DF to render a section of the fortress mode map. This uses a native
df settings (e.g. used tileset, colors, if using graphics or not and so on...) DF rendering function so it's highly dependent on DF settings (e.g. tileset,
colors, etc.)
Functions Functions
--------- ---------
@ -4088,130 +4222,24 @@ Functions
returns a table with w*h*4 entries of rendered tiles. The format is same as ``df.global.gps.screen`` (tile,foreground,bright,background). returns a table with w*h*4 entries of rendered tiles. The format is same as ``df.global.gps.screen`` (tile,foreground,bright,background).
.. _cxxrandom: .. _pathable:
cxxrandom pathable
========= ========
Exposes some features of the C++11 random number library to Lua.
.. contents::
:local:
Native functions (exported to Lua)
----------------------------------
- ``GenerateEngine(seed)``
returns engine id
- ``DestroyEngine(rngID)``
destroys corresponding engine
- ``NewSeed(rngID, seed)``
re-seeds engine
- ``rollInt(rngID, min, max)``
generates random integer
- ``rollDouble(rngID, min, max)``
generates random double
- ``rollNormal(rngID, avg, stddev)``
generates random normal[gaus.]
- ``rollBool(rngID, chance)``
generates random boolean
- ``MakeNumSequence(start, end)``
returns sequence id
- ``AddToSequence(seqID, num)``
adds a number to the sequence
- ``ShuffleSequence(rngID, seqID)``
shuffles the number sequence
- ``NextInSequence(seqID)``
returns the next number in sequence
Lua plugin functions
--------------------
- ``MakeNewEngine(seed)``
returns engine id
Lua plugin classes
------------------
``crng``
~~~~~~~~
- ``init(id, df, dist)``: constructor
- ``id``: Reference ID of engine to use in RNGenerations
- ``df`` (optional): bool indicating whether to destroy the Engine when the crng object is garbage collected
- ``dist`` (optional): lua number distribution to use
- ``changeSeed(seed)``: alters engine's seed value
- ``setNumDistrib(distrib)``: sets the number distribution crng object should use
- ``distrib``: number distribution object to use in RNGenerations
- ``next()``: returns the next number in the distribution
- ``shuffle()``: effectively shuffles the number distribution
``normal_distribution``
~~~~~~~~~~~~~~~~~~~~~~~
- ``init(avg, stddev)``: constructor
- ``next(id)``: returns next number in the distribution
- ``id``: engine ID to pass to native function
``real_distribution``
~~~~~~~~~~~~~~~~~~~~~
- ``init(min, max)``: constructor
- ``next(id)``: returns next number in the distribution
- ``id``: engine ID to pass to native function
``int_distribution``
~~~~~~~~~~~~~~~~~~~~
- ``init(min, max)``: constructor
- ``next(id)``: returns next number in the distribution
- ``id``: engine ID to pass to native function
``bool_distribution``
~~~~~~~~~~~~~~~~~~~~~
- ``init(min, max)``: constructor This plugin implements the back end of the `gui/pathable` script. It exports a
- ``next(id)``: returns next boolean in the distribution single Lua function, in ``hack/lua/plugins/pathable.lua``:
- ``id``: engine ID to pass to native function * ``paintScreen(cursor[,skip_unrevealed])``: Paint each visible of the screen
green or red, depending on whether it can be pathed to from the tile at
``cursor``. If ``skip_unrevealed`` is specified and true, do not draw
unrevealed tiles.
``num_sequence`` sort
~~~~~~~~~~~~~~~~ ====
- ``init(a, b)``: constructor The `sort <sort>` plugin does not export any native functions as of now.
- ``add(num)``: adds num to the end of the number sequence Instead, it calls Lua code to perform the actual ordering of list items.
- ``shuffle()``: shuffles the sequence of numbers
- ``next()``: returns next number in the sequence
.. _xlsxreader: .. _xlsxreader:
@ -4265,74 +4293,170 @@ Scripts
.. contents:: .. contents::
:local: :local:
Any files with the .lua extension placed into :file:`hack/scripts/*` Any files with the ``.lua`` extension placed into the :file:`hack/scripts` folder
are automatically used by the DFHack core as commands. The are automatically made avaiable as DFHack commands. The command corresponding to
matching command name consists of the name of the file without a script is simply the script's filename, relative to the scripts folder, with
the extension. First DFHack searches for the script in the :file:`<save_folder>/raw/scripts/` folder. If it is not found there, it searches in the :file:`<DF>/raw/scripts/` folder. If it is not there, it searches in the extension omitted. For example:
:file:`<DF>/hack/scripts/`. If it is not there, it gives up.
If the first line of the script is a one-line comment, it is * :file:`hack/scripts/add-thought.lua` is invoked as ``add-thought``
used by the built-in ``ls`` and ``help`` commands. * :file:`hack/scripts/gui/teleport.lua` is invoked as ``gui/teleport``
Such a comment is required for every script in the official DFHack repository.
.. note:: .. note::
Scripts placed in subdirectories still can be accessed, but Scripts placed in subdirectories can be run as described above, but are not
do not clutter the `ls` command list (unless ``ls -a``; thus it is preferred listed by the `ls` command unless ``-a`` is specified. In general, scripts
for obscure developer-oriented scripts and scripts used by tools. should be placed in subfolders in the following situations:
When calling such scripts, always use '/' as the separator for
directories, e.g. ``devel/lua-example``. * ``devel``: scripts that are intended exclusively for DFHack development,
including examples, or scripts that are experimental and unstable
* ``fix``: fixes for specific DF issues
* ``gui``: GUI front-ends for existing tools (for example, see the
relationship between `teleport` and `gui/teleport`)
* ``modtools``: scripts that are intended to be run exclusively as part of
mods, not directly by end-users (as a rule of thumb: if someone other than
a mod developer would want to run a script from the console, it should
not be placed in this folder)
Scripts can also be placed in other folders - by default, these include
:file:`raw/scripts` and :file:`data/save/{region}/raw/scripts`, but additional
folders can be added (for example, a copy of the
:source:scripts:`scripts repository <>` for local development). See
`script-paths` for more information on how to configure this behavior.
If the first line of the script is a one-line comment (starting with ``--``),
the content of the comment is used by the built-in ``ls`` and ``help`` commands.
Such a comment is required for every script in the official DFHack repository.
Scripts are read from disk when run for the first time, or if they have changed
since the last time they were run.
Scripts are re-read from disk if they have changed since the last time they were read. Each script has an isolated environment where global variables set by the script
Global variable values persist in memory between calls, unless the file has changed. are stored. Values of globals persist across script runs in the same DF session.
Every script gets its own separate environment for global See `devel/lua-example` for an example of this behavior. Note that local
variables. variables do *not* persist.
Arguments are passed in to the scripts via the **...** built-in Arguments are passed in to the scripts via the ``...`` built-in quasi-variable;
quasi-variable; when the script is called by the DFHack core, when the script is called by the DFHack core, they are all guaranteed to be
they are all guaranteed to be non-nil strings. non-nil strings.
DFHack core invokes the scripts in the `core context <lua-core-context>`; Additional data about how a script is invoked is passed to the script as a
however it is possible to call them from any lua code (including special ``dfhack_flags`` global, which is unique to each script. This table
from other scripts) in any context, via the same function the core uses: is guaranteed to exist, but individual entries may be present or absent
depending on how the script was invoked. Flags that are present are described
in the subsections below.
DFHack invokes the scripts in the `core context <lua-core-context>`; however it
is possible to call them from any lua code (including from other scripts) in any
context with ``dfhack.run_script()`` below.
General script API
==================
* ``dfhack.run_script(name[,args...])`` * ``dfhack.run_script(name[,args...])``
Run a lua script in hack/scripts/, as if it was started from dfhack command-line. Run a Lua script in hack/scripts/, as if it was started from the DFHack
The ``name`` argument should be the name stem, as would be used on the command line. command-line. The ``name`` argument should be the name of the script without
its extension, as would be used on the command line.
Note that this function lets errors propagate to the caller. Note that this function lets Lua errors propagate to the caller.
* ``dfhack.script_environment(name)`` To run other types of commands (such as built-in commands, plugin commands, or
Ruby scripts), see ``dfhack.run_command()``. Note that this is slightly slower
than ``dfhack.run_script()`` for Lua scripts.
Run an Lua script and return its environment. * ``dfhack.script_help([name, [extension]])``
This command allows you to use scripts like modules for increased portability.
It is highly recommended that if you are a modder you put your custom modules in ``raw/scripts`` and use ``script_environment`` instead of ``require`` so that saves with your mod installed will be self-contained and can be transferred to people who do have DFHack but do not have your mod installed. Returns the contents of the embedded documentation of the specified script.
``extension`` defaults to "lua", and ``name`` defaults to the name of the
script where this function was called. For example, the following can be used
to print the current script's help text::
You can say ``dfhack.script_environment('add-thought').addEmotionToUnit([arguments go here])`` and it will have the desired effect. local args = {...}
It will call the script in question with the global ``moduleMode`` set to ``true`` so that the script can return early. if args[1] == 'help' then
This is useful because if the script is called from the console it should deal with its console arguments and if it is called by ``script_environment`` it should only create its global functions and return. print(script_help())
You can also access global variables with, for example ``print(dfhack.script_environment('add-thought').validArgs)`` return
end
The function ``script_environment`` is fast enough that it is recommended that you not store its result in a nonlocal variable, because your script might need to load a different version of that script if the save is unloaded and a save with a different mod that overrides the same script with a slightly different functionality is loaded.
This will not be an issue in most cases.
This function also permits circular dependencies of scripts. Importing scripts
=================
* ``dfhack.reqscript(name)`` or ``reqscript(name)`` * ``dfhack.reqscript(name)`` or ``reqscript(name)``
Nearly identical to script_environment() but requires scripts being loaded to Loads a Lua script and returns its environment (i.e. a table of all global
include a line similar to:: functions and variables). This is similar to the built-in ``require()``, but
searches all script paths for the first matching ``name.lua`` file instead
of searching the Lua library paths (like ``hack/lua``).
Most scripts can be made to support ``reqscript()`` without significant
changes (in contrast, ``require()`` requires the use of ``mkmodule()`` and
some additional boilerplate). However, because scripts can have side effects
when they are loaded (such as printing messages or modifying the game state),
scripts that intend to support being imported must satisfy some criteria to
ensure that they can be imported safely:
1. Include the following line - ``reqscript()`` will fail if this line is
not present::
--@ module = true --@ module = true
This is intended to only allow scripts that take appropriate action when used 2. Include a check for ``dfhack_flags.module``, and avoid running any code
as a module to be loaded. that has side-effects if this flag is true. For instance::
* ``dfhack.script_help([name, [extension]])`` -- (function definitions)
if dfhack_flags.module then
return
end
-- (main script code with side-effects)
Returns the contents of the embedded documentation of the specified script. or::
``extension`` defaults to "lua", and ``name`` defaults to the name of the
script where this function was called. -- (function definitions)
function main()
-- (main script code with side-effects)
end
if not dfhack_flags.module then
main()
end
Example usage::
local addThought = reqscript('add-thought')
addThought.addEmotionToUnit(unit, ...)
Circular dependencies between scripts are supported, as long as the scripts
have no side-effects at load time (which should already be the case per
the above criteria).
.. warning::
Avoid caching the table returned by ``reqscript()`` beyond storing it in
a local or global variable as in the example above. ``reqscript()`` is fast
for scripts that have previously been loaded and haven't changed. If you
retain a reference to a table returned by an old ``reqscript()`` call, this
may lead to unintended behavior if the location of the script changes
(e.g. if a save is loaded or unloaded, or if a `script path <script-paths>`
is added in some other way).
.. admonition:: Tip
Mods that include custom Lua modules can write these modules to support
``reqscript()`` and distribute them as scripts in ``raw/scripts``. Since the
entire ``raw`` folder is copied into new saves, this will allow saves to be
successfully transferred to other users who do not have the mod installed
(as long as they have DFHack installed).
.. admonition:: Backwards compatibility notes
For backwards compatibility, ``moduleMode`` is also defined if
``dfhack_flags.module`` is defined, and is set to the same value.
Support for this may be removed in a future version.
* ``dfhack.script_environment(name)``
Similar to ``reqscript()`` but does not enforce the check for module support.
This can be used to import scripts that support being used as a module but do
not declare support as described above, although it is preferred to update
such scripts so that ``reqscript()`` can be used instead.
Enabling and disabling scripts Enabling and disabling scripts
============================== ==============================
@ -4342,11 +4466,23 @@ by including the following line anywhere in their file::
--@ enable = true --@ enable = true
When the ``enable`` and ``disable`` commands are invoked, a ``dfhack_flags`` When the ``enable`` and ``disable`` commands are invoked, the ``dfhack_flags``
table will be passed to the script with the following fields set: table passed to the script will have the following fields set:
* ``enable``: Always ``true`` if the script is being enabled *or* disabled
* ``enable_state``: ``true`` if the script is being enabled, ``false`` otherwise
* ``enable``: Always true if the script is being enabled *or* disabled Example usage::
* ``enable_state``: True if the script is being enabled, false otherwise
-- @enable = true
-- (function definitions...)
if dfhack_flags.enable then
if dfhack_flags.enable_state then
start()
else
stop()
end
end
Save init script Save init script
================ ================

@ -37,7 +37,9 @@ For more information, see `the full Stonesense README <stonesense>`.
blueprint blueprint
========= =========
Exports a portion of your fortress into QuickFort style blueprint files.:: Exports a portion of your fortress into QuickFort style blueprint files.
Usage::
blueprint <x> <y> <z> <name> [dig] [build] [place] [query] blueprint <x> <y> <z> <name> [dig] [build] [place] [query]
@ -117,24 +119,21 @@ A tool for checking how many tiles contain flowing liquids. If you suspect that
your magma sea leaks into HFS, you can use this tool to be sure without your magma sea leaks into HFS, you can use this tool to be sure without
revealing the map. revealing the map.
.. _pathable:
pathable
========
This plugin implements the back end of the `gui/pathable` script. It exports a
single Lua function, in ``hack/lua/plugins/pathable.lua``:
* ``paintScreen(cursor[,skip_unrevealed])``: Paint each visible of the screen
green or red, depending on whether it can be pathed to from the tile at
``cursor``. If ``skip_unrevealed`` is specified and true, do not draw
unrevealed tiles.
.. _probe: .. _probe:
probe probe
===== =====
Can be used to determine tile properties like temperature.
This plugin provides multiple commands that print low-level properties of the
selected objects.
* ``probe``: prints some properties of the tile selected with :kbd:`k`. Some of
these properties can be passed into `tiletypes`.
* ``cprobe``: prints some properties of the unit selected with :kbd:`v`, as well
as the IDs of any worn items. `gui/gm-unit` and `gui/gm-editor` are more
complete in-game alternatives.
* ``bprobe``: prints some properties of the building selected with :kbd:`q` or
:kbd:`t`. `gui/gm-editor` is a more complete in-game alternative.
.. _prospect: .. _prospect:
.. _prospector: .. _prospector:
@ -706,15 +705,45 @@ enabled materials, you should be able to place complex constructions more conven
buildingplan buildingplan
============ ============
When active (via ``enable buildingplan``), this plugin adds a planning mode for When active (via ``enable buildingplan``), this plugin adds a planning mode for
furniture placement. You can then place furniture and other buildings before building placement. You can then place furniture, constructions, and other buildings
the required materials are available, and the job will be unsuspended when before the required materials are available, and they will be created in a suspended
the item is created. state. Buildingplan will periodically scan for appropriate items, and the jobs will
be unsuspended when the items are available.
Very useful when combined with `workflow` - you can set a constraint This is very useful when combined with `workflow` - you can set a constraint
to always have one or two doors/beds/tables/chairs/etc available, and place to always have one or two doors/beds/tables/chairs/etc available, and place
as many as you like. The plugins then take over and fulfill the orders, as many as you like. The plugins then take over and fulfill the orders,
with minimal space dedicated to stockpiles. with minimal space dedicated to stockpiles.
Item filtering
--------------
While placing a building, you can set filters for what materials you want the building made
out of, what quality you want the component items to be, and whether you want the items to
be decorated.
If a building type takes more than one item to construct, use
:kbd:`Ctrl`:kbd:`Left` and :kbd:`Ctrl`:kbd:`Right` to select the item that you
want to set filters for. Any filters that you set will be used for all buildings
of the selected type from that point onward (until you set a new filter or clear
the current one).
For example, you can be sure that all your constructed walls are the same color by setting
a filter to accept only certain types of stone.
Quickfort mode
--------------
If you use the external Python Quickfort to apply building blueprints instead of the native
DFHack `quickfort` script, you must enable Quickfort mode. This temporarily enables
buildingplan for all building types and adds an extra blank screen after every building
placement. This "dummy" screen is needed for Python Quickfort to interact successfully with
Dwarf Fortress.
Note that Quickfort mode is only for compatibility with the legacy Python Quickfort. The
DFHack `quickfort` script does not need Quickfort mode to be enabled. The `quickfort` script
will successfully integrate with buildingplan as long as the buildingplan plugin is enabled.
.. _confirm: .. _confirm:
confirm confirm
@ -784,6 +813,7 @@ Adds a :kbd:`q` menu for track stops, which is completely blank by default.
This allows you to view and/or change the track stop's friction and dump This allows you to view and/or change the track stop's friction and dump
direction settings, using the keybindings from the track stop building interface. direction settings, using the keybindings from the track stop building interface.
.. _sort:
.. _sort-items: .. _sort-items:
sort-items sort-items
@ -1943,10 +1973,10 @@ Options:
:L: Low Traffic :L: Low Traffic
:R: Restricted Traffic :R: Restricted Traffic
.. _burrow: .. _burrows:
burrow burrows
====== =======
Miscellaneous burrow control. Allows manipulating burrows and automated burrow Miscellaneous burrow control. Allows manipulating burrows and automated burrow
expansion while digging. expansion while digging.
@ -2488,7 +2518,8 @@ See also `alltraffic`, `filltraffic`, and `restrictice`.
tiletypes tiletypes
========= =========
Can be used for painting map tiles and is an interactive command, much like Can be used for painting map tiles and is an interactive command, much like
`liquids`. If something goes wrong, `fixveins` may help. `liquids`. Some properties of existing tiles can be looked up with `probe`. If
something goes wrong, `fixveins` may help.
The tool works with two set of options and a brush. The brush determines which The tool works with two set of options and a brush. The brush determines which
tiles will be processed. First set of options is the filter, which can exclude tiles will be processed. First set of options is the filter, which can exclude
@ -2960,9 +2991,10 @@ Lua API
Some plugins consist solely of native libraries exposed to Lua. They are listed Some plugins consist solely of native libraries exposed to Lua. They are listed
in the `lua-api` file under `lua-plugins`: in the `lua-api` file under `lua-plugins`:
* `eventful`
* `building-hacks` * `building-hacks`
* `cxxrandom`
* `eventful`
* `luasocket` * `luasocket`
* `map-render` * `map-render`
* `cxxrandom` * `pathable`
* `xlsxreader` * `xlsxreader`

@ -33,6 +33,28 @@ changelog.txt uses a syntax similar to RST, with a few special sequences:
# Future # Future
## Fixes
- Fixed an issue on some Linux systems where DFHack installed through a package manager would attempt to write files to a non-writable folder (notably when running `exportlegends` or `gui/autogems`)
- `buildingplan`: artifacts are now successfully matched when max quality is set to ``artifacts``
- `buildingplan`: no longer erroneously matches items to buildings while the game is paused
- `dwarfmonitor`: fixed a crash when opening the ``prefs`` screen if units have vague preferences
- `embark-assistant`: fixed an issue causing incursion resource matching (e.g. sand/clay) to skip some tiles if those resources were provided only through incursions
- `zone`: fixed an issue causing the ``enumnick`` subcommand to run when attempting to run ``assign``, ``unassign``, or ``slaughter``
## Misc Improvements
- `buildingplan`: all buildings, furniture, and constructions are now supported (except for instruments)
- `buildingplan`: now respects building job_item filters when matching items, so you can set your own programmatic filters for buildings before submitting them to buildingplan
- `buildingplan`: default filter setting for max quality changed from ``artifact`` to ``masterwork``
- `buildingplan`: min quality adjustment hotkeys changed from 'qw' to 'QW' to avoid conflict with existing hotkeys for setting roller speed. max quality adjustment hotkeys changed from 'QW' to 'AS' to make room for the min quality hotkey changes.
- `buildingplan`: new global settings page accessible via ``G`` hotkey when on any building build screen; ``Quickfort Mode`` toggle for legacy Python Quickfort has been moved to this page
- `buildingplan`: new global settings for whether generic building materials should match blocks, boulders, logs, and/or bars. defaults are everything but bars.
- `quickfort`: The Dreamfort sample blueprints now have complete walkthroughs for each fort level and importable orders that automate basic fort stock management
- `quickfort`: More blueprints have been added to the blueprints library: several bedroom layouts, the Saracen Crypts, and the complete fortress example from Python Quickfort: TheQuickFortress
## API
- `buildingplan`: added Lua interface API
- add item type param to dfhack.job.isSuitableMaterial() so the non_economic flag can be properly handled (it was being matched for all item types instead of just boulders)
# 0.47.04-r3 # 0.47.04-r3
## New Plugins ## New Plugins
@ -44,7 +66,6 @@ changelog.txt uses a syntax similar to RST, with a few special sequences:
- `search`: fixed an issue causing item counts on the trade screen to display inconsistently when searching - `search`: fixed an issue causing item counts on the trade screen to display inconsistently when searching
- `stockpiles`: fixed a crash when loading food stockpiles - `stockpiles`: fixed a crash when loading food stockpiles
- `stockpiles`: fixed an error when saving furniture stockpiles - `stockpiles`: fixed an error when saving furniture stockpiles
- `embark-assistant`: Fixed issue causing incursion resource matching to skip the checks if those resources were provided only through incursions.
## Misc Improvements ## Misc Improvements
- `createitem`: added support for plant growths (fruit, berries, leaves, etc.) - `createitem`: added support for plant growths (fruit, berries, leaves, etc.)

@ -5,32 +5,38 @@ Quickfort User Guide
`Quickfort <quickfort>` is a DFHack script that helps you build fortresses from `Quickfort <quickfort>` is a DFHack script that helps you build fortresses from
"blueprint" .csv and .xlsx files. Many applications exist to edit these files, "blueprint" .csv and .xlsx files. Many applications exist to edit these files,
such as MS Excel and `Google Sheets <https://sheets.new>`__. You can also build such as MS Excel and `Google Sheets <https://sheets.new>`__. Most layout and
your plan "for real" in Dwarf Fortress, and then export your map using the `blueprint` building-oriented DF commands are supported through the use of multiple files or
plugin. Most layout and building-oriented DF commands are supported through the spreadsheets, each describing a different phase of DF construction: designation,
use of multiple files or spreadsheets, each describing a different phase of DF building, placing stockpiles/zones, and setting configuration.
construction: designation, building, placing stockpiles/zones, and setting
configuration. The original idea came from :wiki:`Valdemar's <User:Valdemar>` auto-designation
macro. Joel Thornton reimplemented the core logic in Python and extended its
The original idea and 1.0 codebase came from :wiki:`Valdemar's <User:Valdemar>` functionality with `Quickfort 2.0 <https://github.com/joelpt/quickfort>`__. This
auto-designation macro. Joel Thornton (joelpt) reimplemented the core logic in DFHack-native implementation, called "DFHack Quickfort" or just "quickfort",
Python and extended its functionality with `Quickfort builds upon Quickfort 2.0's formats and features. Any blueprint that worked in
2.0 <https://github.com/joelpt/quickfort>`__. This DFHack-native implementation, Python Quickfort 2.0 should work with DFHack Quickfort. DFHack Quickfort is
called "DFHack Quickfort" or just "quickfort", builds upon Quickfort 2.0's written in Lua and interacts with Dwarf Fortress memory structures directly,
formats and features. DFHack Quickfort is written in Lua and interacts with allowing for instantaneous blueprint application, error checking and recovery,
Dwarf Fortress memory structures directly, allowing for instantaneous blueprint and many other advanced features.
application, error checking and recovery, and many other advanced features.
This document focuses on DFHack Quickfort's capabilities and teaches players how This document focuses on DFHack Quickfort's capabilities and teaches players how
to understand and build blueprint files. Some of the text was originally written to understand and create blueprint files. Some of the text was originally
by Joel Thornton, reused here with his permission. written by Joel Thornton, reused here with his permission.
For those just looking to apply blueprints, check out the `quickfort command's For those just looking to apply existing blueprints, check out the `quickfort
documentation <quickfort>` for syntax. There are also many ready-to-use blueprints command's documentation <quickfort>` for syntax. There are many ready-to-use
available in the ``blueprints/library`` subfolder in your DFHack installation. blueprints available in the ``blueprints/library`` subfolder in your DFHack
Browse them on your computer or :source:`online <data/blueprints/library>`, installation. Browse them on your computer or
or run ``quickfort list -l`` at the ``[DFHack]#`` prompt to list them, and then :source:`online <data/blueprints/library>`, or run ``quickfort list -l`` at the
``quickfort run`` to apply them to your fort! ``[DFHack]#`` prompt to list them, and then ``quickfort run`` to apply them to
your fort!
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.
See the `Links`_ section for more information and online resources. See the `Links`_ section for more information and online resources.
@ -69,7 +75,8 @@ Features
- Build mode - Build mode
- DFHack buildingplan integration - DFHack buildingplan integration, so you can place buildings before
manufacturing all required source materials
- Designate complete constructions at once, without having to wait for each - Designate complete constructions at once, without having to wait for each
tile to become supported before you can build it tile to become supported before you can build it
- Automatic expansion of building footprints to their minimum dimensions, so - Automatic expansion of building footprints to their minimum dimensions, so
@ -95,6 +102,7 @@ Features
created stockpiles created stockpiles
- Automatic splitting of stockpiles and zones that exceed maximum dimension - Automatic splitting of stockpiles and zones that exceed maximum dimension
limits limits
- Full access to all zone settings, such as hospital supply counts
- Query mode - Query mode
@ -477,37 +485,61 @@ 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 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`` declare a single-purpose stockpile or zone and then modify it with a ``#query``
blueprint, quickfort also supports directly declaring all the types on the blueprint, quickfort also supports directly declaring all the types on the
``#place`` and ``#zone`` blueprints. For example, to declare a 10x10 area that ``#place`` and ``#zone`` blueprints. For example, to declare a 20x10 stockpile
is a pasture, a fruit picking area, and a meeting area all at once, you could that accepts both corpses and refuse, you could write:
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 #zone main pasture and picnic area
nmg(10x10) nmg(10x10)
And similarly, to declare a stockpile that accepts both corpses and refuse, you The order of the individual letters doesn't matter. If you want to configure the
could write: 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 types you want to store, and
then only use a ``#query`` blueprint if you need fine-grained customization.
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 ``^``. Note the special syntax for setting hospital supply levels, which
have no in-game hotkeys:
:: ::
#place refuse heap #zone a combination hospital and shrub (but not fruit) gathering zone
yr(20x10) gGtf^hH{hospital buckets=5 splints=20}(10x10)
The valid hospital settings (and their maximum values) are:
::
The order of the individual letters doesn't matter. thread (1500000)
cloth (1000000)
splints (100)
crutches (100)
powder (15000)
buckets (100)
soap (15000)
To toggle the ``active`` flag for zones, add an ``a`` character to the string. To toggle the ``active`` flag for zones, add an ``a`` character to the string.
For example, to create a *disabled* pit zone (that you later intend to turn into For example, to create a *disabled* pond zone (that you later intend to
a pond and carefully fill to 3-depth water): carefully fill with 3-depth water for a dwarven bathtub):
:: ::
#zone disabled future pond zone #zone disabled pond zone
pa(1x3) apPf(1x3)
Note that while this notation covers most use cases, tweaking low-level zone
parameters, like hospital supply levels or converting between pits and ponds,
must still be done manually or with a ``#query`` blueprint.
Minecart tracks Minecart tracks
~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
@ -864,13 +896,13 @@ Meta blueprints
Meta blueprints are blueprints that script a series of other blueprints. Many Meta blueprints are blueprints that script a series of other blueprints. Many
blueprint packages follow this pattern: blueprint packages follow this pattern:
- Apply dig blueprint to designate dig areas 1. Apply dig blueprint to designate dig areas
- Wait for miners to dig #. Wait for miners to dig
- **Apply build buildprint** to designate buildings #. **Apply build buildprint** to designate buildings
- **Apply place buildprint** to designate stockpiles #. **Apply place buildprint** to designate stockpiles
- **Apply query blueprint** to configure stockpiles #. **Apply query blueprint** to configure stockpiles
- Wait for buildings to get built #. Wait for buildings to get built
- Apply a different query blueprint to configure rooms #. Apply a different query blueprint to configure rooms
Those three "apply"s in the middle might as well get done in one command instead Those three "apply"s in the middle might as well get done in one command instead
of three. A meta blueprint can encode that sequence. A meta blueprint refers to of three. A meta blueprint can encode that sequence. A meta blueprint refers to
@ -914,12 +946,12 @@ blueprints into one:
Now your sequence is shortened to: Now your sequence is shortened to:
- Apply dig blueprint to designate dig areas 1. Apply dig blueprint to designate dig areas
- Wait for miners to dig #. Wait for miners to dig
- **Apply meta buildprint** to build buildings and designate/configure #. **Apply meta buildprint** to build buildings and designate/configure
stockpiles stockpiles
- Wait for buildings to get built #. Wait for buildings to get built
- Apply the final query blueprint to configure the room #. Apply the final query blueprint to configure the room
You can use meta blueprints to lay out your fortress at a larger scale as well. You can use meta blueprints to lay out your fortress at a larger scale as well.
The ``#<`` and ``#>`` notation is valid in meta blueprints, so you can, for The ``#<`` and ``#>`` notation is valid in meta blueprints, so you can, for
@ -982,6 +1014,11 @@ a big fort, so we're planning for a lot of bedrooms):
Note that for blueprints without an explicit label, we still need to address Note that for blueprints without an explicit label, we still need to address
them by their auto-generated numerical label. them by their auto-generated numerical label.
It's worth calling out that ``#meta`` blueprints can only refer to blueprints
that are defined in the same file. This means that all blueprints that a
``#meta`` blueprint needs to script must be in sheets within the same
.xlsx spreadsheet or concatenated into the same .csv file.
You can then hide the blueprints that you now manage with the ``#meta``-mode You can then hide the blueprints that you now manage with the ``#meta``-mode
blueprint from ``quickfort list`` by adding a ``hidden()`` marker to their blueprint from ``quickfort list`` by adding a ``hidden()`` marker to their
modelines. That way the output of ``quickfort list`` won't be cluttered by modelines. That way the output of ``quickfort list`` won't be cluttered by
@ -1022,32 +1059,49 @@ allowing for much easier viewing and editing.
Buildingplan integration Buildingplan integration
------------------------ ------------------------
Buildingplan is a DFHack plugin that keeps jobs in a suspended state until the Buildingplan is a DFHack plugin that keeps building construction jobs in a
materials required for the job are available. This prevents a building suspended state until the materials required for the job are available. This
designation from being canceled when a dwarf picks up the job but can't find the prevents a building designation from being canceled when a dwarf picks up the
materials. job but can't find the materials.
For all types that buildingplan supports, quickfort using buildingplan to manage As long as the `buildingplan` plugin is enabled, quickfort will use it to manage
construction. Buildings are still constructed immediately if you have the construction. The buildingplan plugin also has an "enabled" setting for each
materials, but you now have the freedom to apply build blueprints before you building type, but that setting only applies to the buildingplan user interface;
manufacture all required materials, and the jobs will be fulfilled as the quickfort will always use buildingplan to manage everything designated in a
materials become available. ``#build`` blueprint.
If a ``#build`` blueprint only refers to supported types, the buildingplan However, quickfort *does* use buildingplan's filters for each building type. For
integration pairs well with the `workflow` plugin, which can build items a few example, you can use the buildingplan UI to set the stone you want your walls
at a time continuously as long as they are needed. For building types that are made out of. Or you can specify that all buildingplan-managed tables must be of
not yet supported by buildingplan, a good pattern to follow is to first run Masterful quality. The current filter settings are saved with planned buildings
``quickfort orders`` on the ``#build`` blueprint to manufacture all the required when the ``#build`` blueprint is run. This means you can set the filters the way
items, then apply the blueprint itself. you want for one blueprint, run the blueprint, and then freely change them again
for the next blueprint, even if the first set of buildings haven't been built
See the `buildingplan documentation <buildingplan>` for more information. As of yet.
this writing, buildingplan only supports basic furniture.
Note that buildings are still constructed immediately if you already have the
materials. However, with the buildingplan integration you now have the freedom
to apply ``#build`` blueprints before you manufacture the resources. The
construction jobs will be fulfilled as the materials become available.
Since it can be difficult to figure out exactly what source materials you need
for a ``#build`` blueprint, quickfort supplies the ``orders`` command. It
enqueues manager orders for everything that the buildings in a ``#build``
blueprint require. See the next section for more details on this.
Alternately, if you know you only need a few types of items, the `workflow`
plugin can be configured to build those items continuously for as long as they
are needed.
If the buildingplan plugin is not enabled, run ``quickfort orders`` first and
make sure all manager orders are fulfilled before applying a ``#build``
blueprint.
Generating manager orders Generating manager orders
------------------------- -------------------------
Quickfort can generate manager orders to make sure you have the proper items in Quickfort can generate manager orders to make sure you have the proper items in
stock to apply a ``#build`` blueprint. stock for a ``#build`` blueprint.
Many items can be manufactured from different source materials. Orders will Many items can be manufactured from different source materials. Orders will
always choose rock when it can, then wood, then cloth, then iron. You can always always choose rock when it can, then wood, then cloth, then iron. You can always
@ -1066,7 +1120,9 @@ If you want your constructions to be in a consistent color, be sure to choose a
rock type for all of your 'Make rock blocks' orders by selecting the order and rock type for all of your 'Make rock blocks' orders by selecting the order and
hitting ``d``. You might want to set the rock type for other non-block orders to hitting ``d``. You might want to set the rock type for other non-block orders to
something different if you fear running out of the type of rock that you want to something different if you fear running out of the type of rock that you want to
use for blocks. use for blocks. You should also set the `buildingplan` material filter for
construction building types to that type of rock as well so other random blocks
you might have lying around aren't used.
There are a few building types that will generate extra manager orders for There are a few building types that will generate extra manager orders for
related materials: related materials:
@ -1105,23 +1161,16 @@ Tips and tricks
Caveats and limitations Caveats and limitations
----------------------- -----------------------
- Buildings will be designated regardless of whether you have the required
materials, but if materials are not available when the construction job is
picked up by a dwarf, the buildings will be canceled and the designations
will disappear. Until the buildingplan plugin can be extended to support all
building types, you should use ``quickfort orders`` to pre-manufacture all
the materials you need for a ``#build`` blueprint before you apply it.
- If you use the ``jugs`` alias in your ``#query``-mode blueprints, be aware - If you use the ``jugs`` alias in your ``#query``-mode blueprints, be aware
that there is no way to differentiate jugs from other types of tools in the that there is no way to differentiate jugs from other types of tools in the
game. Therefore, ``jugs`` stockpiles will also take nest boxes and other game. Therefore, ``jugs`` stockpiles will also take nest boxes and other
tools. The only workaround is not to have other tools lying around in your tools. The only workaround is not to have other tools lying around in your
fort. fort.
- Likewise for bags. The game does not differentiate between empty and full - Likewise for the ``bags`` alias. The game does not differentiate between
bags, so you'll get bags of gypsum power and sand in your bags stockpile empty and full bags, so you'll get bags of gypsum power and sand in your bags
unless you avoid collecting sand and are careful to assign all your gypsum to stockpile unless you avoid collecting sand and are careful to assign all your
your hospital. gypsum to your hospital.
- Weapon traps and upright spear/spike traps can currently only be built with a - Weapon traps and upright spear/spike traps can currently only be built with a
single weapon. single weapon.
@ -1260,7 +1309,7 @@ sheet, like in surface's meta sheet.
things to include in messages are: things to include in messages are:
* The name of the next blueprint to apply and when to run it * The name of the next blueprint to apply and when to run it
* Whether quickfort orders should be run for an upcoming step * Whether quickfort orders could be run for an upcoming step
* Any manual actions that have to happen, like assigning minecarts to hauling * Any manual actions that have to happen, like assigning minecarts to hauling
routes or pasturing animals after creating zones routes or pasturing animals after creating zones
@ -1308,11 +1357,6 @@ Hauling routes are notoriously fiddly to set up, but they can be automated with
blueprints. Check out the Southern area of the ``#place`` and ``#query`` blueprints. Check out the Southern area of the ``#place`` and ``#query``
blueprints for how the quantum garbage dump is configured. blueprints for how the quantum garbage dump is configured.
Note that aliases that must be applied in a particular order must appear in the
same cell. Otherwise there are no guarantees for which cell will be processed
first. For example, look at the track stop cells in the ``#query`` blueprint for
how the hauling routes are given names.
The industry_ level: when not to use aliases The industry_ level: when not to use aliases
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -1320,7 +1364,7 @@ The industry_ level: when not to use aliases
The industry level is densely packed and has more complicated examples of The industry level is densely packed and has more complicated examples of
stockpile configurations and quantum dumps. However, what I'd like to call out stockpile configurations and quantum dumps. However, what I'd like to call out
are the key sequences that are *not* in aliases. first are the key sequences that are *not* in aliases.
.. topic:: Tip .. topic:: Tip
@ -1340,6 +1384,45 @@ see in the blueprint itself. Also, if you move the workshop, it's easier to fix
the stockpile link right there in the blueprint instead of editing the separate the stockpile link right there in the blueprint instead of editing the separate
aliases.txt file. aliases.txt file.
There are also good examples in the query blueprint for how to use the
``permit`` and ``forbid`` stockpile aliases.
.. topic:: Tip
Put all configuration that must be applied in a particular order in the
same spreadsheet cell.
Most of the baseline aliases distributed with DFHack fall into one of three
categories:
1. Make a stockpile accept only a particular item type in a category
2. Permit an item type, but do not otherwise change the stockpile configuration
3. Forbid an item type, but do not otherwise change the stockpile configuration
If you have a stockpile that covers multiple tiles, it might seem natural to put
one alias per spreadsheet cell. The aliases still all get applied to the
stockpile, and with only one alias per cell, you can just type the alias name
and avoid having to use the messier-looking ``{alias1}{alias2}`` syntax:
::
#query Incorrectly configure a 3x3 food stockpile to accept tallow and dye
tallow
permitdye
However, in quickfort there are no guarantees about which cell will be
processed first. In the example above, we obviously intend for the food
stockpile to have everything forbidden, then tallow permitted, then dye
permitted. The algorithm could happen to apply them in the opposite order,
though, and we'd end up with dye being permitted, then everything being
forbidden and tallow being enabled. To make sure you always get what you want,
write order-sensitive aliases on the same line:
::
#query Properly configure a 3x3 food stockpile to accept tallow and dye
{tallow}{permitdye}
The services_ level: handling multi-level dig blueprints The services_ level: handling multi-level dig blueprints
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

@ -201,10 +201,8 @@ def print_changelog(versions, all_entries, path, replace=True, prefix=''):
continue continue
elif entry.children: elif entry.children:
write('- ' + entry.feature + ':') write('- ' + entry.feature + ':')
write('')
for child in entry.children: for child in entry.children:
write(' - ' + child) write(' - ' + child)
write('')
else: else:
write('- ' + entry.feature) write('- ' + entry.feature)
write('') write('')

@ -57,11 +57,6 @@ div.body {
min-width: unset; min-width: unset;
} }
div.body li > p {
margin-top: 0;
margin-bottom: 0;
}
span.pre { span.pre {
overflow-wrap: break-word; overflow-wrap: break-word;
} }

@ -1618,7 +1618,10 @@ bool Core::Init()
freopen("stderr.log", "w", stderr); freopen("stderr.log", "w", stderr);
#endif #endif
fprintf(stderr, "DFHack build: %s\n", Version::git_description()); Filesystem::init();
cerr << "DFHack build: " << Version::git_description() << "\n"
<< "Starting with working directory: " << Filesystem::getcwd() << endl;
// find out what we are... // find out what we are...
#ifdef LINUX_BUILD #ifdef LINUX_BUILD

@ -2371,6 +2371,8 @@ static const luaL_Reg dfhack_screen_funcs[] = {
static const LuaWrapper::FunctionReg dfhack_filesystem_module[] = { static const LuaWrapper::FunctionReg dfhack_filesystem_module[] = {
WRAPM(Filesystem, getcwd), WRAPM(Filesystem, getcwd),
WRAPM(Filesystem, restore_cwd),
WRAPM(Filesystem, get_initial_cwd),
WRAPM(Filesystem, chdir), WRAPM(Filesystem, chdir),
WRAPM(Filesystem, mkdir), WRAPM(Filesystem, mkdir),
WRAPM(Filesystem, mkdir_recursive), WRAPM(Filesystem, mkdir_recursive),

@ -22,29 +22,28 @@ must not be misrepresented as being the original software.
distribution. distribution.
*/ */
#include "Internal.h" #include <cstdio>
#include <cstring>
#include <dirent.h> #include <dirent.h>
#include <errno.h> #include <errno.h>
#include <map>
#include <set>
#include <string>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h> #include <unistd.h>
#include <string>
#include <vector> #include <vector>
#include <map>
#include <set>
#include <cstdio>
#include <cstring>
using namespace std;
#include <md5wrapper.h> #include "Error.h"
#include "Internal.h"
#include "md5wrapper.h"
#include "MemAccess.h" #include "MemAccess.h"
#include "Memory.h" #include "Memory.h"
#include "VersionInfoFactory.h" #include "modules/Filesystem.h"
#include "VersionInfo.h" #include "VersionInfo.h"
#include "Error.h" #include "VersionInfoFactory.h"
#include <string.h>
using namespace std;
using namespace DFHack; using namespace DFHack;
Process::Process(const VersionInfoFactory& known_versions) : identified(false), my_pe(0) Process::Process(const VersionInfoFactory& known_versions) : identified(false), my_pe(0)
@ -181,28 +180,7 @@ uint32_t Process::getTickCount()
string Process::getPath() string Process::getPath()
{ {
static string cached_path; return Filesystem::get_initial_cwd();
if (cached_path.empty())
{
const char *exe_name = "/proc/self/exe";
char exe_path[1024];
int length = readlink(exe_name, exe_path, sizeof(exe_path));
if (length > 0)
{
exe_path[length] = '\0';
string path_string = exe_path;
// DF lives in libs, so move up a folder
cached_path = path_string.substr(0, path_string.find_last_of("/", path_string.find_last_of("/") - 1));
}
else
{
perror("readlink(/proc/self/exe) failed");
fprintf(stderr, " length=%i\n", length);
cached_path = ".";
}
fprintf(stderr, "Resolved DF root to %s\n", cached_path.c_str());
}
return cached_path;
} }
int Process::getPID() int Process::getPID()

@ -146,8 +146,11 @@ enum _filetype {
namespace DFHack { namespace DFHack {
namespace Filesystem { namespace Filesystem {
DFHACK_EXPORT void init ();
DFHACK_EXPORT bool chdir (std::string path); DFHACK_EXPORT bool chdir (std::string path);
DFHACK_EXPORT std::string getcwd (); DFHACK_EXPORT std::string getcwd ();
DFHACK_EXPORT bool restore_cwd ();
DFHACK_EXPORT std::string get_initial_cwd ();
DFHACK_EXPORT bool mkdir (std::string path); DFHACK_EXPORT bool mkdir (std::string path);
// returns true on success or if directory already exists // returns true on success or if directory already exists
DFHACK_EXPORT bool mkdir_recursive (std::string path); DFHACK_EXPORT bool mkdir_recursive (std::string path);

@ -88,7 +88,9 @@ namespace DFHack
bool find(const std::string &token); bool find(const std::string &token);
bool matches(df::job_item_vector_id vec_id); bool matches(df::job_item_vector_id vec_id);
bool matches(const df::job_item &item, MaterialInfo *mat = NULL, bool skip_vector = false); bool matches(const df::job_item &item, MaterialInfo *mat = NULL,
bool skip_vector = false,
df::item_type itype = df::item_type::NONE);
}; };
inline bool operator== (const ItemTypeInfo &a, const ItemTypeInfo &b) { inline bool operator== (const ItemTypeInfo &a, const ItemTypeInfo &b) {

@ -102,7 +102,9 @@ namespace DFHack
int filter_idx = -1, int insert_idx = -1); int filter_idx = -1, int insert_idx = -1);
DFHACK_EXPORT bool isSuitableItem(df::job_item *item, df::item_type itype, int isubtype); DFHACK_EXPORT bool isSuitableItem(df::job_item *item, df::item_type itype, int isubtype);
DFHACK_EXPORT bool isSuitableMaterial(df::job_item *item, int mat_type, int mat_index); DFHACK_EXPORT bool isSuitableMaterial(df::job_item *item, int mat_type,
int mat_index,
df::item_type itype);
DFHACK_EXPORT std::string getName(df::job *job); DFHACK_EXPORT std::string getName(df::job *job);
} }

@ -136,8 +136,8 @@ namespace DFHack
return findProduct(info.material, name); return findProduct(info.material, name);
} }
std::string getToken(); std::string getToken() const;
std::string toString(uint16_t temp = 10015, bool named = true); std::string toString(uint16_t temp = 10015, bool named = true) const;
bool isAnyCloth(); bool isAnyCloth();
@ -156,7 +156,8 @@ namespace DFHack
bool matches(const df::job_material_category &cat); bool matches(const df::job_material_category &cat);
bool matches(const df::dfhack_material_category &cat); bool matches(const df::dfhack_material_category &cat);
bool matches(const df::job_item &item); bool matches(const df::job_item &item,
df::item_type itype = df::item_type::NONE);
}; };
DFHACK_EXPORT bool parseJobMaterialCategory(df::job_material_category *cat, const std::string &token); DFHACK_EXPORT bool parseJobMaterialCategory(df::job_material_category *cat, const std::string &token);

@ -179,6 +179,9 @@ local building_inputs = {
[df.building_type.Slab] = { { item_type=df.item_type.SLAB } }, [df.building_type.Slab] = { { item_type=df.item_type.SLAB } },
[df.building_type.NestBox] = { { has_tool_use=df.tool_uses.NEST_BOX, item_type=df.item_type.TOOL } }, [df.building_type.NestBox] = { { has_tool_use=df.tool_uses.NEST_BOX, item_type=df.item_type.TOOL } },
[df.building_type.Hive] = { { has_tool_use=df.tool_uses.HIVE, item_type=df.item_type.TOOL } }, [df.building_type.Hive] = { { has_tool_use=df.tool_uses.HIVE, item_type=df.item_type.TOOL } },
[df.building_type.OfferingPlace] = { { has_tool_use=df.tool_uses.PLACE_OFFERING, item_type=df.item_type.TOOL } },
[df.building_type.Bookcase] = { { has_tool_use=df.tool_uses.BOOKCASE, item_type=df.item_type.TOOL } },
[df.building_type.DisplayFurniture] = { { has_tool_use=df.tool_uses.DISPLAY_OBJECT, item_type=df.item_type.TOOL } },
[df.building_type.Rollers] = { [df.building_type.Rollers] = {
{ {
name='mechanism', name='mechanism',

@ -103,7 +103,7 @@ struct CoordHash {
static unordered_map<df::coord, int32_t, CoordHash> locationToBuilding; static unordered_map<df::coord, int32_t, CoordHash> locationToBuilding;
static uint8_t *getExtentTile(df::building_extents &extent, df::coord2d tile) static df::building_extents_type *getExtentTile(df::building_extents &extent, df::coord2d tile)
{ {
if (!extent.extents) if (!extent.extents)
return NULL; return NULL;
@ -368,10 +368,19 @@ df::building *Buildings::allocInstance(df::coord pos, df::building_type type, in
obj->bucket_z = bld->z; obj->bucket_z = bld->z;
break; break;
} }
case building_type::Workshop:
{
if (VIRTUAL_CAST_VAR(obj, df::building_workshopst, bld))
obj->profile.max_general_orders = 5;
break;
}
case building_type::Furnace: case building_type::Furnace:
{ {
if (VIRTUAL_CAST_VAR(obj, df::building_furnacest, bld)) if (VIRTUAL_CAST_VAR(obj, df::building_furnacest, bld))
{
obj->melt_remainder.resize(df::inorganic_raw::get_vector().size(), 0); obj->melt_remainder.resize(df::inorganic_raw::get_vector().size(), 0);
obj->profile.max_general_orders = 5;
}
break; break;
} }
case building_type::Coffin: case building_type::Coffin:
@ -419,6 +428,12 @@ df::building *Buildings::allocInstance(df::coord pos, df::building_type type, in
obj->gate_flags.bits.closed = true; obj->gate_flags.bits.closed = true;
break; break;
} }
case building_type::Bridge:
{
if (VIRTUAL_CAST_VAR(obj, df::building_bridgest, bld))
obj->gate_flags.bits.closed = false;
break;
}
default: default:
break; break;
} }
@ -585,7 +600,7 @@ bool Buildings::checkFreeTiles(df::coord pos, df::coord2d size,
for (int dy = 0; dy < size.y; dy++) for (int dy = 0; dy < size.y; dy++)
{ {
df::coord tile = pos + df::coord(dx,dy,0); df::coord tile = pos + df::coord(dx,dy,0);
uint8_t *etile = NULL; df::building_extents_type *etile = NULL;
// Exclude using extents // Exclude using extents
if (ext && ext->extents) if (ext && ext->extents)
@ -625,7 +640,7 @@ bool Buildings::checkFreeTiles(df::coord pos, df::coord2d size,
if (!ext->extents) if (!ext->extents)
{ {
ext->extents = new uint8_t[size.x*size.y]; ext->extents = new df::building_extents_type[size.x*size.y];
ext->x = pos.x; ext->x = pos.x;
ext->y = pos.y; ext->y = pos.y;
ext->width = size.x; ext->width = size.x;
@ -638,7 +653,7 @@ bool Buildings::checkFreeTiles(df::coord pos, df::coord2d size,
if (!etile) if (!etile)
return false; return false;
*etile = 0; *etile = df::building_extents_type::None;
} }
} }
} }
@ -695,7 +710,7 @@ bool Buildings::containsTile(df::building *bld, df::coord2d tile, bool room)
if (bld->room.extents && (room || bld->isExtentShaped())) if (bld->room.extents && (room || bld->isExtentShaped()))
{ {
uint8_t *etile = getExtentTile(bld->room, tile); df::building_extents_type *etile = getExtentTile(bld->room, tile);
if (!etile || !*etile) if (!etile || !*etile)
return false; return false;
} }
@ -827,7 +842,7 @@ static void markBuildingTiles(df::building *bld, bool remove)
if (use_extents) if (use_extents)
{ {
uint8_t *etile = getExtentTile(bld->room, tile); df::building_extents_type *etile = getExtentTile(bld->room, tile);
if (!etile || !*etile) if (!etile || !*etile)
continue; continue;
} }
@ -868,7 +883,7 @@ static void linkRooms(df::building *bld)
if (!room->is_room || room->z != bld->z) if (!room->is_room || room->z != bld->z)
continue; continue;
uint8_t *pext = getExtentTile(room->room, df::coord2d(bld->x1, bld->y1)); df::building_extents_type *pext = getExtentTile(room->room, df::coord2d(bld->x1, bld->y1));
if (!pext || !*pext) if (!pext || !*pext)
continue; continue;

@ -52,8 +52,21 @@ SOFTWARE.
using namespace DFHack; using namespace DFHack;
static bool initialized = false;
static std::string initial_cwd;
void Filesystem::init ()
{
if (!initialized)
{
initialized = true;
initial_cwd = Filesystem::getcwd();
}
}
bool Filesystem::chdir (std::string path) bool Filesystem::chdir (std::string path)
{ {
Filesystem::init();
return ::chdir(path.c_str()) == 0; return ::chdir(path.c_str()) == 0;
} }
@ -71,6 +84,17 @@ std::string Filesystem::getcwd ()
return result; return result;
} }
bool Filesystem::restore_cwd ()
{
return Filesystem::chdir(initial_cwd);
}
std::string Filesystem::get_initial_cwd ()
{
Filesystem::init();
return initial_cwd;
}
bool Filesystem::mkdir (std::string path) bool Filesystem::mkdir (std::string path)
{ {
int fail; int fail;

@ -279,12 +279,13 @@ bool ItemTypeInfo::matches(df::job_item_vector_id vec_id)
return true; return true;
} }
bool ItemTypeInfo::matches(const df::job_item &item, MaterialInfo *mat, bool skip_vector) bool ItemTypeInfo::matches(const df::job_item &item, MaterialInfo *mat,
bool skip_vector, df::item_type itype)
{ {
using namespace df::enums::item_type; using namespace df::enums::item_type;
if (!isValid()) if (!isValid())
return mat ? mat->matches(item) : false; return mat ? mat->matches(item, itype) : false;
if (Items::isCasteMaterial(type) && mat && !mat->isNone()) if (Items::isCasteMaterial(type) && mat && !mat->isNone())
return false; return false;

@ -605,10 +605,11 @@ bool Job::isSuitableItem(df::job_item *item, df::item_type itype, int isubtype)
ItemTypeInfo iinfo(itype, isubtype); ItemTypeInfo iinfo(itype, isubtype);
MaterialInfo minfo(item); MaterialInfo minfo(item);
return iinfo.isValid() && iinfo.matches(*item, &minfo); return iinfo.isValid() && iinfo.matches(*item, &minfo, false, itype);
} }
bool Job::isSuitableMaterial(df::job_item *item, int mat_type, int mat_index) bool Job::isSuitableMaterial(
df::job_item *item, int mat_type, int mat_index, df::item_type itype)
{ {
CHECK_NULL_POINTER(item); CHECK_NULL_POINTER(item);
@ -618,7 +619,7 @@ bool Job::isSuitableMaterial(df::job_item *item, int mat_type, int mat_index)
ItemTypeInfo iinfo(item); ItemTypeInfo iinfo(item);
MaterialInfo minfo(mat_type, mat_index); MaterialInfo minfo(mat_type, mat_index);
return minfo.isValid() && iinfo.matches(*item, &minfo); return minfo.isValid() && iinfo.matches(*item, &minfo, false, itype);
} }
std::string Job::getName(df::job *job) std::string Job::getName(df::job *job)

@ -305,7 +305,7 @@ bool MaterialInfo::findProduct(df::material *material, const std::string &name)
return decode(-1); return decode(-1);
} }
std::string MaterialInfo::getToken() std::string MaterialInfo::getToken() const
{ {
if (isNone()) if (isNone())
return "NONE"; return "NONE";
@ -333,7 +333,7 @@ std::string MaterialInfo::getToken()
} }
} }
std::string MaterialInfo::toString(uint16_t temp, bool named) std::string MaterialInfo::toString(uint16_t temp, bool named) const
{ {
if (isNone()) if (isNone())
return "any"; return "any";
@ -444,19 +444,22 @@ bool MaterialInfo::matches(const df::dfhack_material_category &cat)
#undef TEST #undef TEST
bool MaterialInfo::matches(const df::job_item &item) bool MaterialInfo::matches(const df::job_item &item, df::item_type itype)
{ {
if (!isValid()) return false; if (!isValid()) return false;
df::job_item_flags1 ok1, mask1; df::job_item_flags1 ok1, mask1;
getMatchBits(ok1, mask1); getMatchBits(ok1, mask1);
df::job_item_flags2 ok2, mask2; df::job_item_flags2 ok2, mask2, xmask2;
getMatchBits(ok2, mask2); getMatchBits(ok2, mask2);
df::job_item_flags3 ok3, mask3; df::job_item_flags3 ok3, mask3;
getMatchBits(ok3, mask3); getMatchBits(ok3, mask3);
xmask2.bits.non_economic = itype != df::item_type::BOULDER;
mask2.whole &= ~xmask2.whole;
return bits_match(item.flags1.whole, ok1.whole, mask1.whole) && return bits_match(item.flags1.whole, ok1.whole, mask1.whole) &&
bits_match(item.flags2.whole, ok2.whole, mask2.whole) && bits_match(item.flags2.whole, ok2.whole, mask2.whole) &&
bits_match(item.flags3.whole, ok3.whole, mask3.whole); bits_match(item.flags3.whole, ok3.whole, mask3.whole);

@ -1 +1 @@
Subproject commit 00549aca0640ca121c20734df667f79b247c93b4 Subproject commit dd8b9335007941c3aea27474b0a08ba31f6bc97f

@ -90,7 +90,7 @@ if(BUILD_SUPPORTED)
dfhack_plugin(autogems autogems.cpp LINK_LIBRARIES jsoncpp_lib_static) dfhack_plugin(autogems autogems.cpp LINK_LIBRARIES jsoncpp_lib_static)
dfhack_plugin(autohauler autohauler.cpp) dfhack_plugin(autohauler autohauler.cpp)
dfhack_plugin(autolabor autolabor.cpp) dfhack_plugin(autolabor autolabor.cpp)
dfhack_plugin(automaterial automaterial.cpp) dfhack_plugin(automaterial automaterial.cpp LINK_LIBRARIES lua)
dfhack_plugin(automelt automelt.cpp) dfhack_plugin(automelt automelt.cpp)
dfhack_plugin(autotrade autotrade.cpp) dfhack_plugin(autotrade autotrade.cpp)
dfhack_plugin(blueprint blueprint.cpp LINK_LIBRARIES lua) dfhack_plugin(blueprint blueprint.cpp LINK_LIBRARIES lua)
@ -126,7 +126,7 @@ if(BUILD_SUPPORTED)
dfhack_plugin(flows flows.cpp) dfhack_plugin(flows flows.cpp)
dfhack_plugin(follow follow.cpp) dfhack_plugin(follow follow.cpp)
dfhack_plugin(forceequip forceequip.cpp) dfhack_plugin(forceequip forceequip.cpp)
dfhack_plugin(fortplan fortplan.cpp LINK_LIBRARIES buildingplan-lib) dfhack_plugin(fortplan fortplan.cpp LINK_LIBRARIES buildingplan-lib lua)
dfhack_plugin(generated-creature-renamer generated-creature-renamer.cpp) dfhack_plugin(generated-creature-renamer generated-creature-renamer.cpp)
dfhack_plugin(getplants getplants.cpp) dfhack_plugin(getplants getplants.cpp)
dfhack_plugin(hotkeys hotkeys.cpp) dfhack_plugin(hotkeys hotkeys.cpp)
@ -154,7 +154,7 @@ if(BUILD_SUPPORTED)
add_subdirectory(remotefortressreader) add_subdirectory(remotefortressreader)
dfhack_plugin(rename rename.cpp LINK_LIBRARIES lua PROTOBUFS rename) dfhack_plugin(rename rename.cpp LINK_LIBRARIES lua PROTOBUFS rename)
add_subdirectory(rendermax) add_subdirectory(rendermax)
dfhack_plugin(resume resume.cpp) dfhack_plugin(resume resume.cpp LINK_LIBRARIES lua)
dfhack_plugin(reveal reveal.cpp) dfhack_plugin(reveal reveal.cpp)
dfhack_plugin(search search.cpp) dfhack_plugin(search search.cpp)
dfhack_plugin(seedwatch seedwatch.cpp) dfhack_plugin(seedwatch seedwatch.cpp)

@ -5,6 +5,7 @@
#include <vector> #include <vector>
#include "Core.h" #include "Core.h"
#include "LuaTools.h"
#include <Console.h> #include <Console.h>
#include <Export.h> #include <Export.h>
#include <PluginManager.h> #include <PluginManager.h>
@ -504,7 +505,7 @@ static bool find_anchor_in_spiral(const df::coord &start)
return found; return found;
} }
static bool find_valid_building_sites(bool in_future_placement_mode) static bool find_valid_building_sites(bool in_future_placement_mode, bool use_buildingplan)
{ {
valid_building_sites.clear(); valid_building_sites.clear();
open_air_sites.clear(); open_air_sites.clear();
@ -519,7 +520,8 @@ static bool find_valid_building_sites(bool in_future_placement_mode)
continue; continue;
building_site site(df::coord(xB, yB, box_second.z), false); building_site site(df::coord(xB, yB, box_second.z), false);
if (is_valid_building_site(site, false, true, in_future_placement_mode)) // if we're using buildingplan, it will take care of filtering out bad tiles
if (use_buildingplan || is_valid_building_site(site, false, true, in_future_placement_mode))
valid_building_sites.push_back(site); valid_building_sites.push_back(site);
else if (site.in_open_air) else if (site.in_open_air)
{ {
@ -531,25 +533,115 @@ static bool find_valid_building_sites(bool in_future_placement_mode)
} }
} }
size_t last_open_air_count = 0; if (!use_buildingplan)
while (valid_building_sites.size() > 0 && open_air_sites.size() != last_open_air_count)
{ {
last_open_air_count = open_air_sites.size(); size_t last_open_air_count = 0;
deque<building_site> current_open_air_list = open_air_sites; while (valid_building_sites.size() > 0 && open_air_sites.size() != last_open_air_count)
open_air_sites.clear();
for (deque<building_site>::iterator it = current_open_air_list.begin(); it != current_open_air_list.end(); it++)
{ {
if (is_orthogonal_to_pending_construction(*it)) last_open_air_count = open_air_sites.size();
valid_building_sites.push_back(*it); deque<building_site> current_open_air_list = open_air_sites;
else open_air_sites.clear();
open_air_sites.push_back(*it); for (deque<building_site>::iterator it = current_open_air_list.begin(); it != current_open_air_list.end(); it++)
} {
if (is_orthogonal_to_pending_construction(*it))
valid_building_sites.push_back(*it);
else
open_air_sites.push_back(*it);
}
}
} }
return valid_building_sites.size() > 0; return valid_building_sites.size() > 0;
} }
static bool is_buildingplan_enabled()
{
auto L = Lua::Core::State;
color_ostream_proxy out(Core::getInstance().getConsole());
Lua::StackUnwinder top(L);
if (!(lua_checkstack(L, 1) &&
Lua::PushModulePublic(out, L, "plugins.buildingplan", "isEnabled") &&
Lua::SafeCall(out, L, 0, 1)))
{
return false;
}
return lua_toboolean(L, -1);
}
static bool is_buildingplan_planmode_enabled(
df::building_type type, int16_t subtype, int32_t custom)
{
auto L = Lua::Core::State;
color_ostream_proxy out(Core::getInstance().getConsole());
Lua::StackUnwinder top(L);
if (!lua_checkstack(L, 4) ||
!Lua::PushModulePublic(
out, L, "plugins.buildingplan", "isPlanModeEnabled"))
return false;
Lua::Push(L, type);
Lua::Push(L, subtype);
Lua::Push(L, custom);
if (!Lua::SafeCall(out, L, 3, 1))
return false;
return lua_toboolean(L, -1);
}
static bool is_buildingplan_managed()
{
return is_buildingplan_enabled() &&
is_buildingplan_planmode_enabled(ui_build_selector->building_type,
ui_build_selector->building_subtype,
ui_build_selector->custom_type);
}
static bool build_with_buildingplan_box_select(const df::coord &pos)
{
auto L = Lua::Core::State;
color_ostream_proxy out(Core::getInstance().getConsole());
CoreSuspendClaimer suspend;
Lua::StackUnwinder top(L);
if (!lua_checkstack(L, 5) ||
!Lua::PushModulePublic(
out, L, "plugins.automaterial",
"build_with_buildingplan_box_select"))
{
return false;
}
Lua::Push(L, ui_build_selector->building_subtype);
Lua::Push(L, pos.x);
Lua::Push(L, pos.y);
Lua::Push(L, pos.z);
if (!Lua::SafeCall(out, L, 4, 1))
return false;
return lua_toboolean(L, -1);
}
static bool build_with_buildingplan_ui()
{
auto L = Lua::Core::State;
color_ostream_proxy out(Core::getInstance().getConsole());
CoreSuspendClaimer suspend;
Lua::StackUnwinder top(L);
return lua_checkstack(L, 1) &&
Lua::PushModulePublic(out, L, "plugins.automaterial",
"build_with_buildingplan_ui") &&
Lua::SafeCall(out, L, 0, 1);
}
static bool designate_new_construction(df::coord &pos, df::construction_type &type, df::item *item) static bool designate_new_construction(df::coord &pos, df::construction_type &type, df::item *item)
{ {
auto newinst = Buildings::allocInstance(pos, building_type::Construction, type); auto newinst = Buildings::allocInstance(pos, building_type::Construction, type);
@ -722,11 +814,13 @@ struct jobutils_hook : public df::viewscreen_dwarfmodest
} }
else if (in_placement_stage()) else if (in_placement_stage())
{ {
if (input->count(interface_key::CUSTOM_A)) bool use_buildingplan = is_buildingplan_managed();
if (!use_buildingplan && input->count(interface_key::CUSTOM_A))
{ {
auto_choose_materials = !auto_choose_materials; auto_choose_materials = !auto_choose_materials;
} }
else if (input->count(interface_key::CUSTOM_T)) else if (!use_buildingplan && input->count(interface_key::CUSTOM_T))
{ {
revert_to_last_used_type = !revert_to_last_used_type; revert_to_last_used_type = !revert_to_last_used_type;
} }
@ -739,7 +833,7 @@ struct jobutils_hook : public df::viewscreen_dwarfmodest
return; return;
} }
else if (input->count(interface_key::CUSTOM_O)) else if (!use_buildingplan && input->count(interface_key::CUSTOM_O))
{ {
allow_future_placement = !allow_future_placement; allow_future_placement = !allow_future_placement;
} }
@ -816,6 +910,15 @@ struct jobutils_hook : public df::viewscreen_dwarfmodest
return; return;
} }
} }
else if (use_buildingplan
&& ui_build_selector->errors.size() == 0
&& input->count(interface_key::SELECT))
{
build_with_buildingplan_ui();
Gui::refreshSidebar();
input->clear();
return;
}
} }
} }
//END UI Methods //END UI Methods
@ -876,16 +979,17 @@ struct jobutils_hook : public df::viewscreen_dwarfmodest
static bool saved_revert_setting = false; static bool saved_revert_setting = false;
static bool auto_select_applied = false; static bool auto_select_applied = false;
bool use_buildingplan = is_buildingplan_managed();
box_select_mode = SELECT_MATERIALS; box_select_mode = SELECT_MATERIALS;
if (new_start) if (new_start)
{ {
bool ok_to_continue = false; bool ok_to_continue = false;
bool in_future_placement_mode = false; bool in_future_placement_mode = false;
if (!find_valid_building_sites(false)) if (!find_valid_building_sites(false, use_buildingplan))
{ {
if (allow_future_placement) if (allow_future_placement)
{ {
in_future_placement_mode = find_valid_building_sites(true); in_future_placement_mode = find_valid_building_sites(true, use_buildingplan);
} }
} }
else else
@ -893,7 +997,8 @@ struct jobutils_hook : public df::viewscreen_dwarfmodest
ok_to_continue = true; ok_to_continue = true;
} }
if (in_future_placement_mode) // if using buildingplan, we don't need an anchor
if (!use_buildingplan && in_future_placement_mode)
{ {
ok_to_continue = find_anchor_in_spiral(valid_building_sites[0].pos); ok_to_continue = find_anchor_in_spiral(valid_building_sites[0].pos);
} }
@ -924,6 +1029,15 @@ struct jobutils_hook : public df::viewscreen_dwarfmodest
{ {
building_site site = valid_building_sites.front(); building_site site = valid_building_sites.front();
valid_building_sites.pop_front(); valid_building_sites.pop_front();
if (use_buildingplan)
{
// we don't actually care if this fails. buildingplan will return
// false when it filters out bad tiles, and that's ok.
build_with_buildingplan_box_select(site.pos);
continue;
}
if (box_select_materials.size() > 0) if (box_select_materials.size() > 0)
{ {
df::construction_type type = (df::construction_type) ui_build_selector->building_subtype; df::construction_type type = (df::construction_type) ui_build_selector->building_subtype;
@ -986,8 +1100,10 @@ struct jobutils_hook : public df::viewscreen_dwarfmodest
// Allocation done, reset // Allocation done, reset
move_cursor(box_second); move_cursor(box_second);
// if we're using buildingplan, we never actually leave the placement
// screen, so there's no need to re-enter the screen
revert_to_last_used_type = saved_revert_setting; revert_to_last_used_type = saved_revert_setting;
if (!revert_to_last_used_type) if (!use_buildingplan && !revert_to_last_used_type)
{ {
send_key(df::interface_key::LEAVESCREEN); send_key(df::interface_key::LEAVESCREEN);
} }
@ -1091,9 +1207,18 @@ struct jobutils_hook : public df::viewscreen_dwarfmodest
} }
else if (in_placement_stage() && ui_build_selector->building_subtype < 7) else if (in_placement_stage() && ui_build_selector->building_subtype < 7)
{ {
OutputString(COLOR_BROWN, x, y, "DFHack Options", true, left_margin); bool use_buildingplan = is_buildingplan_managed();
AMOutputToggleString(x, y, "Auto Mat-select", "a", auto_choose_materials, true, left_margin);
AMOutputToggleString(x, y, "Reselect Type", "t", revert_to_last_used_type, true, left_margin); OutputString(COLOR_BROWN, x, y, "DFHack Automaterial Options", true, left_margin);
if (use_buildingplan)
{
y += 2;
}
else
{
AMOutputToggleString(x, y, "Auto Mat-select", "a", auto_choose_materials, true, left_margin);
AMOutputToggleString(x, y, "Reselect Type", "t", revert_to_last_used_type, true, left_margin);
}
++y; ++y;
AMOutputToggleString(x, y, "Box Select", "b", box_select_enabled, true, left_margin); AMOutputToggleString(x, y, "Box Select", "b", box_select_enabled, true, left_margin);
@ -1101,9 +1226,20 @@ struct jobutils_hook : public df::viewscreen_dwarfmodest
{ {
AMOutputToggleString(x, y, "Show Box Mask", "x", show_box_selection, true, left_margin); AMOutputToggleString(x, y, "Show Box Mask", "x", show_box_selection, true, left_margin);
OutputHotkeyString(x, y, (hollow_selection) ? "Make Solid" : "Make Hollow", "h", true, left_margin); OutputHotkeyString(x, y, (hollow_selection) ? "Make Solid" : "Make Hollow", "h", true, left_margin);
AMOutputToggleString(x, y, "Open Placement", "o", allow_future_placement, true, left_margin);
if (use_buildingplan)
++y;
else
AMOutputToggleString(x, y, "Open Placement", "o", allow_future_placement, true, left_margin);
} }
++y; else
{
y += 3;
}
y += 2;
if (is_buildingplan_enabled())
OutputString(COLOR_BROWN, x, y, "DFHack Buildingplan Options", true, left_margin);
if (box_select_enabled) if (box_select_enabled)
{ {
Screen::Pen pen(' ',COLOR_BLACK); Screen::Pen pen(' ',COLOR_BLACK);

@ -1,16 +1,22 @@
#include "buildingplan-lib.h" #include "buildingplan-lib.h"
#include <cstdarg>
#include "Core.h" #include "Core.h"
using namespace DFHack; using namespace DFHack;
bool show_debugging = false; bool show_debugging = false;
void debug(const std::string &msg) void debug(const char *fmt, ...)
{ {
if (!show_debugging) if (!show_debugging)
return; return;
color_ostream_proxy out(Core::getInstance().getConsole()); color_ostream_proxy out(Core::getInstance().getConsole());
out << "DEBUG: " << msg << endl; out.print("DEBUG(buildingplan): ");
va_list args;
va_start(args, fmt);
out.vprint(fmt, args);
va_end(args);
out.print("\n");
} }

@ -3,6 +3,6 @@
#include "buildingplan-planner.h" #include "buildingplan-planner.h"
#include "buildingplan-rooms.h" #include "buildingplan-rooms.h"
void debug(const std::string &msg); void debug(const char *fmt, ...) Wformat(printf,1,2);
extern bool show_debugging; extern bool show_debugging;

File diff suppressed because it is too large Load Diff

@ -1,108 +1,140 @@
#pragma once #pragma once
#include "df/item_quality.h" #include <queue>
#include <unordered_map>
#include "df/building.h"
#include "df/dfhack_material_category.h" #include "df/dfhack_material_category.h"
#include "df/item_quality.h"
#include "df/job_item.h"
#include "modules/Materials.h" #include "modules/Materials.h"
#include "modules/Persistence.h" #include "modules/Persistence.h"
struct ItemFilter class ItemFilter
{ {
df::dfhack_material_category mat_mask; public:
std::vector<DFHack::MaterialInfo> materials;
df::item_quality min_quality;
df::item_quality max_quality;
bool decorated_only;
ItemFilter(); ItemFilter();
bool matchesMask(DFHack::MaterialInfo &mat); void clear();
bool matches(const df::dfhack_material_category mask) const; bool deserialize(std::string ser);
std::string serialize() const;
void addMaterialMask(uint32_t mask);
void clearMaterialMask();
void setMaterials(std::vector<DFHack::MaterialInfo> materials);
void incMinQuality();
void decMinQuality();
void incMaxQuality();
void decMaxQuality();
void toggleDecoratedOnly();
uint32_t getMaterialMask() const;
std::vector<std::string> getMaterials() const;
std::string getMinQuality() const;
std::string getMaxQuality() const;
bool getDecoratedOnly() const;
bool matches(df::dfhack_material_category mask) const;
bool matches(DFHack::MaterialInfo &material) const; bool matches(DFHack::MaterialInfo &material) const;
bool matches(df::item *item); bool matches(df::item *item) const;
std::vector<std::string> getMaterialFilterAsVector();
std::string getMaterialFilterAsSerial();
bool parseSerializedMaterialTokens(std::string str);
std::string getMinQuality(); private:
std::string getMaxQuality(); // remove friend declaration when we no longer need v1 deserialization
friend void migrateV1ToV2();
bool isValid(); df::dfhack_material_category mat_mask;
void clear(); std::vector<DFHack::MaterialInfo> materials;
df::item_quality min_quality;
df::item_quality max_quality;
bool decorated_only;
private: bool deserializeMaterialMask(std::string ser);
bool valid; bool deserializeMaterials(std::string ser);
void setMinQuality(int quality);
void setMaxQuality(int quality);
bool matchesMask(DFHack::MaterialInfo &mat) const;
}; };
class PlannedBuilding class PlannedBuilding
{ {
public: public:
PlannedBuilding(df::building *building, ItemFilter *filter); PlannedBuilding(df::building *building, const std::vector<ItemFilter> &filters);
PlannedBuilding(DFHack::PersistentDataItem &config, DFHack::color_ostream &out); PlannedBuilding(DFHack::PersistentDataItem &config);
bool assignClosestItem(std::vector<df::item *> *items_vector);
bool assignItem(df::item *item);
bool isValid(); bool isValid() const;
void remove(); void remove();
df::building_type getType(); df::building * getBuilding();
bool isCurrentlySelectedBuilding(); const std::vector<ItemFilter> & getFilters() const;
ItemFilter *getFilter();
private: private:
df::building *building;
DFHack::PersistentDataItem config; DFHack::PersistentDataItem config;
df::coord pos; df::building *building;
ItemFilter filter; const df::building::key_field_type building_id;
const std::vector<ItemFilter> filters;
}; };
class Planner // building type, subtype, custom
{ typedef std::tuple<df::building_type, int16_t, int32_t> BuildingTypeKey;
public:
bool in_dummmy_screen;
Planner(); BuildingTypeKey toBuildingTypeKey(
df::building_type btype, int16_t subtype, int32_t custom);
BuildingTypeKey toBuildingTypeKey(df::building *bld);
BuildingTypeKey toBuildingTypeKey(df::ui_build_selector *uibs);
bool isPlanableBuilding(const df::building_type type) const; struct BuildingTypeKeyHash
{
void reset(DFHack::color_ostream &out); std::size_t operator() (const BuildingTypeKey & key) const;
};
void initialize(); class Planner
{
public:
class ItemFiltersWrapper
{
public:
ItemFiltersWrapper(std::vector<ItemFilter> & item_filters)
: item_filters(item_filters) { }
std::vector<ItemFilter>::reverse_iterator rbegin() const { return item_filters.rbegin(); }
std::vector<ItemFilter>::reverse_iterator rend() const { return item_filters.rend(); }
const std::vector<ItemFilter> & get() const { return item_filters; }
private:
std::vector<ItemFilter> &item_filters;
};
const std::map<std::string, bool> & getGlobalSettings() const;
bool setGlobalSetting(std::string name, bool value);
void reset();
void addPlannedBuilding(df::building *bld); void addPlannedBuilding(df::building *bld);
PlannedBuilding *getPlannedBuilding(df::building *bld);
void doCycle(); bool isPlannableBuilding(BuildingTypeKey key);
bool allocatePlannedBuilding(df::building_type type);
PlannedBuilding *getSelectedPlannedBuilding();
void removeSelectedPlannedBuilding();
ItemFilter *getDefaultItemFilterForType(df::building_type type);
void adjustMinQuality(df::building_type type, int amount); // returns an empty vector if the type is not supported
void adjustMaxQuality(df::building_type type, int amount); ItemFiltersWrapper getItemFilters(BuildingTypeKey key);
void enableQuickfortMode(); void doCycle();
void disableQuickfortMode();
bool inQuickFortMode();
private: private:
std::map<df::building_type, df::item_type> item_for_building_type; DFHack::PersistentDataItem config;
std::map<df::building_type, ItemFilter> default_item_filters; std::map<std::string, bool> global_settings;
std::map<df::item_type, std::vector<df::item *>> available_item_vectors; std::unordered_map<BuildingTypeKey,
std::map<df::item_type, bool> is_relevant_item_type; //Needed for fast check when looping over all items std::vector<ItemFilter>,
bool quickfort_mode; BuildingTypeKeyHash> default_item_filters;
// building id -> PlannedBuilding
std::vector<PlannedBuilding> planned_buildings; std::unordered_map<int32_t, PlannedBuilding> planned_buildings;
// vector id -> filter bucket -> queue of (building id, job_item index)
void boundsCheckItemQuality(df::enums::item_quality::item_quality *quality); std::map<df::job_item_vector_id, std::map<std::string, std::queue<std::pair<int32_t, int>>>> tasks;
void gather_available_items(); bool registerTasks(PlannedBuilding &plannedBuilding);
void unregisterBuilding(int32_t id);
void popInvalidTasks(std::queue<std::pair<int32_t, int>> &task_queue);
void doVector(df::job_item_vector_id vector_id,
std::map<std::string, std::queue<std::pair<int32_t, int>>> & buckets);
}; };
extern std::map<df::building_type, bool> planmode_enabled, saved_planmodes;
extern Planner planner; extern Planner planner;

File diff suppressed because it is too large Load Diff

@ -1155,52 +1155,107 @@ struct preference_map
string getItemLabel() string getItemLabel()
{ {
df::world_raws::T_itemdefs &defs = world->raws.itemdefs;
label = ENUM_ATTR_STR(item_type, caption, pref.item_type); label = ENUM_ATTR_STR(item_type, caption, pref.item_type);
switch (pref.item_type) switch (pref.item_type)
{ {
case (df::item_type::WEAPON): case (df::item_type::WEAPON):
label = defs.weapons[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.weapons, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::TRAPCOMP): case (df::item_type::TRAPCOMP):
label = defs.trapcomps[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.trapcomps, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::TOY): case (df::item_type::TOY):
label = defs.toys[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.toys, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::TOOL): case (df::item_type::TOOL):
label = defs.tools[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.tools, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::INSTRUMENT): case (df::item_type::INSTRUMENT):
label = defs.instruments[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.instruments, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::ARMOR): case (df::item_type::ARMOR):
label = defs.armor[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.armor, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::AMMO): case (df::item_type::AMMO):
label = defs.ammo[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.ammo, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::SIEGEAMMO): case (df::item_type::SIEGEAMMO):
label = defs.siege_ammo[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.siege_ammo, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::GLOVES): case (df::item_type::GLOVES):
label = defs.gloves[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.gloves, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::SHOES): case (df::item_type::SHOES):
label = defs.shoes[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.shoes, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::SHIELD): case (df::item_type::SHIELD):
label = defs.shields[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.shields, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::HELM): case (df::item_type::HELM):
label = defs.helms[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.helms, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::PANTS): case (df::item_type::PANTS):
label = defs.pants[pref.item_subtype]->name_plural; {
auto *def = vector_get(world->raws.itemdefs.pants, pref.item_subtype);
if (def)
label = def->name_plural;
break; break;
}
case (df::item_type::FOOD): case (df::item_type::FOOD):
label = defs.food[pref.item_subtype]->name; {
auto *def = vector_get(world->raws.itemdefs.food, pref.item_subtype);
if (def)
label = def->name;
break; break;
}
default: default:
label = ENUM_ATTR_STR(item_type, caption, pref.item_type); label = ENUM_ATTR_STR(item_type, caption, pref.item_type);

@ -1,14 +1,17 @@
#include <fstream> #include <fstream>
#include <vector> #include <vector>
#include "df/world.h" #include "df/job_item.h"
#include "df/trap_type.h" #include "df/trap_type.h"
#include "df/world.h"
#include "modules/Buildings.h"
#include "modules/Filesystem.h" #include "modules/Filesystem.h"
#include "modules/Gui.h" #include "modules/Gui.h"
#include "modules/Maps.h" #include "modules/Maps.h"
#include "modules/World.h" #include "modules/World.h"
#include "LuaTools.h"
#include "PluginManager.h" #include "PluginManager.h"
#include "buildingplan-lib.h" #include "buildingplan-lib.h"
@ -47,8 +50,40 @@ struct BuildingInfo {
hasCustomOptions = false; hasCustomOptions = false;
} }
bool allocate() { bool allocate(coord32_t cursor) {
return planner.allocatePlannedBuilding(type); auto L = Lua::Core::State;
color_ostream_proxy out(Core::getInstance().getConsole());
CoreSuspendClaimer suspend;
Lua::StackUnwinder top(L);
if (!lua_checkstack(L, 5) ||
!Lua::PushModulePublic(out, L, "plugins.fortplan",
"construct_building_from_params"))
{
return false;
}
Lua::Push(L, type);
Lua::Push(L, cursor.x);
Lua::Push(L, cursor.y);
Lua::Push(L, cursor.z);
if (!Lua::SafeCall(out, L, 4, 1))
return false;
auto bld = Lua::GetDFObject<df::building>(L, -1);
lua_pop(L, 1);
if (!bld)
{
out.printerr("fortplan: construct_building_from_params() failed\n");
return false;
}
planner.addPlannedBuilding(bld);
return true;
} }
}; };
@ -97,8 +132,6 @@ DFhackCExport command_result plugin_init ( color_ostream &out, vector <PluginCom
buildings.push_back(BuildingInfo("N",df::building_type::NestBox,"Nest Box",1,1)); buildings.push_back(BuildingInfo("N",df::building_type::NestBox,"Nest Box",1,1));
buildings.push_back(BuildingInfo("~h",df::building_type::Hive,"Hive",1,1)); buildings.push_back(BuildingInfo("~h",df::building_type::Hive,"Hive",1,1));
planner.initialize();
return CR_OK; return CR_OK;
} }
@ -122,7 +155,7 @@ DFhackCExport command_result plugin_enable(color_ostream &out, bool enable)
if (enable != is_enabled) if (enable != is_enabled)
{ {
planner.reset(out); planner.reset();
is_enabled = enable; is_enabled = enable;
} }
@ -347,13 +380,13 @@ command_result fortplan(color_ostream &out, vector<string> & params) {
offsetCursor.x -= xOffset; offsetCursor.x -= xOffset;
offsetCursor.y -= yOffset; offsetCursor.y -= yOffset;
DFHack::Gui::setCursorCoords(offsetCursor.x, offsetCursor.y, offsetCursor.z); DFHack::Gui::setCursorCoords(offsetCursor.x, offsetCursor.y, offsetCursor.z);
if (!buildingInfo.allocate()) { if (!buildingInfo.allocate(offsetCursor)) {
con.print("*** There was an error placing building with code '%s' centered at (%zu,%zu).\n",curCode.c_str(),x,y); con.print("*** There was an error placing building with code '%s' centered at (%zu,%zu).\n",curCode.c_str(),x,y);
} }
DFHack::Gui::setCursorCoords(cursor.x, cursor.y, cursor.z); DFHack::Gui::setCursorCoords(cursor.x, cursor.y, cursor.z);
} else if (block) { } else if (block) {
//con.print("Placing a building with code '%s' with corner at (%d,%d) and default size %dx%d.\n",curCode.c_str(),x,y,buildingInfo.defaultWidth,buildingInfo.defaultHeight); //con.print("Placing a building with code '%s' with corner at (%d,%d) and default size %dx%d.\n",curCode.c_str(),x,y,buildingInfo.defaultWidth,buildingInfo.defaultHeight);
if (!buildingInfo.allocate()) { if (!buildingInfo.allocate(cursor)) {
con.print("*** There was an error placing building with code '%s' with corner at (%zu,%zu).\n",curCode.c_str(),x,y); con.print("*** There was an error placing building with code '%s' with corner at (%zu,%zu).\n",curCode.c_str(),x,y);
} }
} else { } else {
@ -366,7 +399,7 @@ command_result fortplan(color_ostream &out, vector<string> & params) {
} }
} else { } else {
//con.print("Building a(n) %s.\n",buildingInfo.name.c_str()); //con.print("Building a(n) %s.\n",buildingInfo.name.c_str());
if (!buildingInfo.allocate()) { if (!buildingInfo.allocate(cursor)) {
con.print("*** There was an error placing the %s at (%zu,%zu).\n",buildingInfo.name.c_str(),x,y); con.print("*** There was an error placing the %s at (%zu,%zu).\n",buildingInfo.name.c_str(),x,y);
} }
} }

@ -0,0 +1,23 @@
local _ENV = mkmodule('plugins.automaterial')
local buildingplan = require('plugins.buildingplan')
-- construct the building and register it with buildingplan for item selection
function build_with_buildingplan_box_select(subtype, x, y, z)
local pos = xyz2pos(x, y, z)
local bld, err = dfhack.buildings.constructBuilding{
type=df.building_type.Construction, subtype=subtype, pos=pos}
-- it's not a user error if we can't place a building here; just indicate
-- that no building was placed by returning false.
if err then return false end
buildingplan.addPlannedBuilding(bld)
return true
end
function build_with_buildingplan_ui()
for _,bld in ipairs(buildingplan.construct_buildings_from_ui_state()) do
buildingplan.addPlannedBuilding(bld)
end
end
return _ENV

@ -4,10 +4,250 @@ local _ENV = mkmodule('plugins.buildingplan')
Native functions: Native functions:
* bool isPlannableBuilding(df::building_type type) * void setSetting(string name, boolean value)
* bool isPlanModeEnabled(df::building_type type, int16_t subtype, int32_t custom)
* bool isPlannableBuilding(df::building_type type, int16_t subtype, int32_t custom)
* bool isPlannedBuilding(df::building *bld)
* void addPlannedBuilding(df::building *bld) * void addPlannedBuilding(df::building *bld)
* void doCycle() * void doCycle()
* void scheduleCycle()
--]] --]]
local dialogs = require('gui.dialogs')
local guidm = require('gui.dwarfmode')
require('dfhack.buildings')
-- does not need the core suspended
function get_num_filters(btype, subtype, custom)
local filters = dfhack.buildings.getFiltersByType(
{}, btype, subtype, custom)
if filters then return #filters end
return 0
end
local function to_title_case(str)
str = str:gsub('(%a)([%w_]*)',
function (first, rest) return first:upper()..rest:lower() end)
str = str:gsub('_', ' ')
return str
end
local function get_filter(btype, subtype, custom, reverse_idx)
local filters = dfhack.buildings.getFiltersByType(
{}, btype, subtype, custom)
if not filters or reverse_idx < 0 or reverse_idx >= #filters then
error(string.format('invalid index: %d', reverse_idx))
end
return filters[#filters-reverse_idx]
end
-- returns a reasonable label for the item based on the qualities of the filter
-- does not need the core suspended
-- reverse_idx is 0-based and is expected to be counted from the *last* filter
function get_item_label(btype, subtype, custom, reverse_idx)
local filter = get_filter(btype, subtype, custom, reverse_idx)
if filter.has_tool_use then
return to_title_case(df.tool_uses[filter.has_tool_use])
end
if filter.item_type then
return to_title_case(df.item_type[filter.item_type])
end
if filter.flags2 and filter.flags2.building_material then
if filter.flags2.fire_safe then
return "Fire-safe building material";
end
if filter.flags2.magma_safe then
return "Magma-safe building material";
end
return "Generic building material";
end
if filter.vector_id then
return to_title_case(df.job_item_vector_id[filter.vector_id])
end
return "Unknown";
end
-- returns whether the items matched by the specified filter can have a quality
-- rating. This also conveniently indicates whether an item can be decorated.
-- does not need the core suspended
-- reverse_idx is 0-based and is expected to be counted from the *last* filter
function item_can_be_improved(btype, subtype, custom, reverse_idx)
local filter = get_filter(btype, subtype, custom, reverse_idx)
if filter.flags2 and filter.flags2.building_material then
return false;
end
return filter.item_type ~= df.item_type.WOOD and
filter.item_type ~= df.item_type.BLOCKS and
filter.item_type ~= df.item_type.BAR and
filter.item_type ~= df.item_type.BOULDER
end
-- needs the core suspended
-- returns a vector of constructed buildings (usually of size 1, but potentially
-- more for constructions)
function construct_buildings_from_ui_state()
local uibs = df.global.ui_build_selector
local world = df.global.world
local direction = world.selected_direction
local _, width, height = dfhack.buildings.getCorrectSize(
world.building_width, world.building_height, uibs.building_type,
uibs.building_subtype, uibs.custom_type, direction)
-- the cursor is at the center of the building; we need the upper-left
-- corner of the building
local pos = guidm.getCursorPos()
pos.x = pos.x - math.floor(width/2)
pos.y = pos.y - math.floor(height/2)
local min_x, max_x = pos.x, pos.x
local min_y, max_y = pos.y, pos.y
if width == 1 and height == 1 and
(world.building_width > 1 or world.building_height > 1) then
min_x = math.ceil(pos.x - world.building_width/2)
max_x = math.floor(pos.x + world.building_width/2)
min_y = math.ceil(pos.y - world.building_height/2)
max_y = math.floor(pos.y + world.building_height/2)
end
local blds = {}
for y=min_y,max_y do for x=min_x,max_x do
local bld, err = dfhack.buildings.constructBuilding{
type=uibs.building_type, subtype=uibs.building_subtype,
custom=uibs.custom_type, pos=xyz2pos(x, y, pos.z),
width=width, height=height, direction=direction}
if err then
for _,b in ipairs(blds) do
dfhack.buildings.deconstruct(b)
end
error(err)
end
-- assign fields for the types that need them. we can't pass them all in
-- to the call to constructBuilding since attempting to assign unrelated
-- fields to building types that don't support them causes errors.
for k,v in pairs(bld) do
if k == 'friction' then bld.friction = uibs.friction end
if k == 'use_dump' then bld.use_dump = uibs.use_dump end
if k == 'dump_x_shift' then bld.dump_x_shift = uibs.dump_x_shift end
if k == 'dump_y_shift' then bld.dump_y_shift = uibs.dump_y_shift end
if k == 'speed' then bld.speed = uibs.speed end
end
table.insert(blds, bld)
end end
return blds
end
--
-- GlobalSettings dialog
--
local GlobalSettings = defclass(GlobalSettings, dialogs.MessageBox)
GlobalSettings.focus_path = 'buildingplan_globalsettings'
GlobalSettings.ATTRS{
settings = {}
}
function GlobalSettings:onDismiss()
for k,v in pairs(self.settings) do
-- call back into C++ to save changes
setSetting(k, v)
end
end
-- does not need the core suspended.
function show_global_settings_dialog(settings)
GlobalSettings{
frame_title="Buildingplan Global Settings",
settings=settings,
}:show()
end
function GlobalSettings:toggle_setting(name)
self.settings[name] = not self.settings[name]
end
function GlobalSettings:get_setting_string(name)
if self.settings[name] then return 'On' end
return 'Off'
end
function GlobalSettings:get_setting_pen(name)
if self.settings[name] then return COLOR_LIGHTGREEN end
return COLOR_LIGHTRED
end
function GlobalSettings:is_setting_enabled(name)
return self.settings[name]
end
function GlobalSettings:make_setting_label_token(text, key, name, width)
return {text=text, key=key, key_sep=': ', key_pen=COLOR_LIGHTGREEN,
on_activate=self:callback('toggle_setting', name), width=width}
end
function GlobalSettings:make_setting_value_token(name)
return {text=self:callback('get_setting_string', name),
enabled=self:callback('is_setting_enabled', name),
pen=self:callback('get_setting_pen', name),
dpen=COLOR_GRAY}
end
-- mockup:
--[[
Buildingplan Global Settings
e: Enable all: Off
Enables buildingplan for all building types. Use this to avoid having to
manually enable buildingplan for each building type that you want to plan.
Note that DFHack quickfort will use buildingplan to manage buildings
regardless of whether buildingplan is "enabled" for the building type.
Allowed types for generic, fire-safe, and magma-safe building material:
b: Blocks: On
s: Boulders: On
w: Wood: On
r: Bars: Off
Changes to these settings will be applied to newly-planned buildings.
A: Apply building material filter settings to existing planned buildings
Use this if your planned buildings can't be completed because the settings
above were too restrictive when the buildings were originally planned.
M: Edit list of materials to avoid
potash
pearlash
ash
coal
Buildingplan will avoid using these material types when a planned building's
material filter is set to 'any'. They can stil be matched when they are
explicitly allowed by a planned building's material filter. Changes to this
list take effect for existing buildings immediately.
g: Allow bags: Off
This allows bags to be placed where a 'coffer' is planned.
f: Legacy Quickfort Mode: Off
Compatibility mode for the legacy Python-based Quickfort application. This
setting is not needed for DFHack quickfort.
--]]
function GlobalSettings:init()
self.subviews.label:setText{
'Allowed types for generic, fire-safe, and magma-safe building material:\n',
self:make_setting_label_token('Blocks', 'CUSTOM_B', 'blocks', 10),
self:make_setting_value_token('blocks'), '\n',
self:make_setting_label_token('Boulders', 'CUSTOM_S', 'boulders', 10),
self:make_setting_value_token('boulders'), '\n',
self:make_setting_label_token('Wood', 'CUSTOM_W', 'logs', 10),
self:make_setting_value_token('logs'), '\n',
self:make_setting_label_token('Bars', 'CUSTOM_R', 'bars', 10),
self:make_setting_value_token('bars'), '\n',
' Changes to these settings will be applied to newly-planned buildings.\n',
' If no types are enabled above, then any building material is allowed.\n',
'\n',
self:make_setting_label_token('Legacy Quickfort Mode', 'CUSTOM_F',
'quickfort_mode', 23),
self:make_setting_value_token('quickfort_mode'), '\n',
' Compatibility mode for the legacy Python-based Quickfort application.\n',
' This setting is not needed for DFHack quickfort.'
}
end
return _ENV return _ENV

@ -0,0 +1,13 @@
local _ENV = mkmodule('plugins.fortplan')
require('dfhack.buildings')
function construct_building_from_params(building_type, x, y, z)
local pos = xyz2pos(x, y, z)
local bld, err =
dfhack.buildings.constructBuilding{type=building_type, pos=pos}
if err then error(err) end
return bld
end
return _ENV

@ -11,6 +11,7 @@
// DF data structure definition headers // DF data structure definition headers
#include "DataDefs.h" #include "DataDefs.h"
#include "LuaTools.h"
#include "MiscUtils.h" #include "MiscUtils.h"
#include "Types.h" #include "Types.h"
#include "df/viewscreen_dwarfmodest.h" #include "df/viewscreen_dwarfmodest.h"
@ -85,6 +86,25 @@ struct SuspendedBuilding
} }
}; };
static bool is_planned_building(df::building *bld)
{
auto L = Lua::Core::State;
color_ostream_proxy out(Core::getInstance().getConsole());
Lua::StackUnwinder top(L);
if (!lua_checkstack(L, 2) ||
!Lua::PushModulePublic(
out, L, "plugins.buildingplan", "isPlannedBuilding"))
return false;
Lua::Push(L, bld);
if (!Lua::SafeCall(out, L, 1, 1))
return false;
return lua_toboolean(L, -1);
}
DFHACK_PLUGIN_IS_ENABLED(enabled); DFHACK_PLUGIN_IS_ENABLED(enabled);
static bool buildings_scanned = false; static bool buildings_scanned = false;
static vector<SuspendedBuilding> suspended_buildings, resumed_buildings; static vector<SuspendedBuilding> suspended_buildings, resumed_buildings;
@ -101,7 +121,7 @@ void scan_for_suspended_buildings()
if (job) if (job)
{ {
SuspendedBuilding sb(bld); SuspendedBuilding sb(bld);
sb.is_planned = job->job_items.size() == 1 && job->job_items[0]->item_type == item_type::NONE; sb.is_planned = is_planned_building(bld);
auto it = resumed_buildings.begin(); auto it = resumed_buildings.begin();

@ -79,7 +79,7 @@ static void for_each_(map<T, V> &v, Fn func)
} }
template <class T, class V, typename Fn> template <class T, class V, typename Fn>
static void transform_(vector<T> &src, vector<V> &dst, Fn func) static void transform_(const vector<T> &src, vector<V> &dst, Fn func)
{ {
transform(src.begin(), src.end(), back_inserter(dst), func); transform(src.begin(), src.end(), back_inserter(dst), func);
} }

@ -449,7 +449,7 @@ void unitInfo(color_ostream & out, df::unit* unit, bool verbose = false)
out << ", milkable"; out << ", milkable";
if(unit->flags2.bits.slaughter) if(unit->flags2.bits.slaughter)
out << ", slaughter"; out << ", slaughter";
if(verbose) if(verbose)
{ {
out << ". Pos: ("<<unit->pos.x << "/"<< unit->pos.y << "/" << unit->pos.z << ") " << endl; out << ". Pos: ("<<unit->pos.x << "/"<< unit->pos.y << "/" << unit->pos.z << ") " << endl;
@ -1493,7 +1493,7 @@ command_result df_zone (color_ostream &out, vector <string> & parameters)
bool cagezone_assign = false; bool cagezone_assign = false;
bool nick_set = false; bool nick_set = false;
string target_nick; string target_nick;
bool enum_nick = true; bool enum_nick = false;
string enum_prefix; string enum_prefix;
bool verbose = false; bool verbose = false;
@ -1552,8 +1552,7 @@ command_result df_zone (color_ostream &out, vector <string> & parameters)
return CR_OK; return CR_OK;
} else { } else {
out.color(COLOR_BLUE); out.color(COLOR_BLUE);
out << "Current building unset (no building under" out << "Current building unset (no building under cursor)." << endl;
"cursor)." << endl;
out.reset_color(); out.reset_color();
return CR_OK; return CR_OK;
@ -2127,7 +2126,7 @@ command_result df_zone (color_ostream &out, vector <string> & parameters)
} }
continue; continue;
} }
matchedCount++; matchedCount++;
if(unit_info) if(unit_info)

@ -1 +1 @@
Subproject commit 0b274855424e5d0850d2cfc8b10e1cdcc47c6877 Subproject commit 5aaa1ce815b2192c6b6a22523a996ed556c04fbd

@ -13,6 +13,10 @@ function test.getDFPath()
expect.eq(clean_path(dfhack.getDFPath()), old_cwd) expect.eq(clean_path(dfhack.getDFPath()), old_cwd)
end end
function test.get_initial_cwd()
expect.eq(clean_path(dfhack.filesystem.get_initial_cwd()), clean_path(dfhack.getDFPath()))
end
function test.getDFPath_chdir() function test.getDFPath_chdir()
dfhack.with_finalize(restore_cwd, function() dfhack.with_finalize(restore_cwd, function()
fs.chdir('data') fs.chdir('data')