update dreamfort case study and general formatting

develop
Myk Taylor 2023-06-14 11:28:41 -07:00
parent 3b5af82a0e
commit f894634eef
No known key found for this signature in database
GPG Key ID: 8A39CA0FA0C16E78
2 changed files with 580 additions and 520 deletions

@ -137,7 +137,7 @@ Crypt
````` `````
.. image:: https://drive.google.com/uc?export=download&id=16iT_ho7BIRPD_eofuxdlVQ4FunR1Li23 .. image:: https://drive.google.com/uc?export=download&id=16iT_ho7BIRPD_eofuxdlVQ4FunR1Li23
:alt: Annotated screenshot of the dreamfort noble suites :alt: Annotated screenshot of the dreamfort crypt
:target: https://drive.google.com/file/d/16iT_ho7BIRPD_eofuxdlVQ4FunR1Li23 :target: https://drive.google.com/file/d/16iT_ho7BIRPD_eofuxdlVQ4FunR1Li23
:align: center :align: center

@ -708,6 +708,57 @@ tiles::
#place #place
f10(3x3) f10(3x3)
Stockpile configuration
~~~~~~~~~~~~~~~~~~~~~~~
Quickfort uses the `stockpiles` plugin and `stockpiles-library` to configure
stockpile settings, and provides a syntax that is easy to write in a blueprint
yet still allows you to access the full power of the `stockpiles` command.
The syntax is::
: <op> <preset_name> [/<filter>] [<op> <preset_name> [/<filter>]...]
``<op>`` is one of ``=``, ``-``, or ``+``, representing the three `stockpiles`
import modes: ``set``, ``disable``, or ``enable``, respectively. Note that if
you are using an ``=`` op, then it should go first in the list. Any ``=``
configuration segment will override anything that comes before it.
For example, a blueprint like::
#place
f:=booze(5x4)
would be equivalent to creating a 5x4 food stockpile in the UI, then selecting it and running this command::
stockpiles import --mode=set booze
you can also add a slash (``/``) and a comma-separated list of filter strings
to customize the settings further::
#place
p{name="Metal weapons"}:-cat_weapons/other/(7x3)
Note that the "op" in this case lets us disable the matched preset, which in
this case is the "Other materials" types in the Weapons category. This
configuration is equivalent to the `stockpiles` command::
stockpiles import --mode=disable cat_weapons --filter=other/
And we can chain multiple `stockpiles` commands together by adding another "op"
character and another preset::
#place
p{name="Steel weapons"}:-cat_weapons/mats/,other/+steelweapons(7x3)
which corresponds to running these two commands::
stockpiles import --mode=disable cat_weapons --filter=mats/,other/
stockpiles import --mode=enable steelweapons
With the combination of the library presets and custom filter strings, you can
configure any stockpile any way you like!
#build mode #build mode
----------- -----------
@ -824,7 +875,7 @@ elements before we discuss them in more detail::
#build label(noblebedroom) No explicit 'start()' so cursor is in upper left #build label(noblebedroom) No explicit 'start()' so cursor is in upper left
#meta label(digwholefort) start(center of stairs on surface) #meta label(digwholefort) start(center of stairs on surface)
#dig label(dig_dining) hidden() called by the digwholefort meta blueprint #dig label(dig_dining) hidden() called by the digwholefort meta blueprint
#zone label(pastures) message(remember to assign animals to the new pastures) #zone label(pastures) message(remember to assign animals to the pastures)
.. _quickfort-label: .. _quickfort-label:
@ -1376,9 +1427,9 @@ Dreamfort blueprint set. Then we'll walk through the spreadsheets for each of
the fort levels in turn, calling out feature usage examples and explaining the the fort levels in turn, calling out feature usage examples and explaining the
parts that might not be obvious just from looking at them. parts that might not be obvious just from looking at them.
If you haven't built Dreamfort before, maybe try an embark in a flat area and If you haven't built Dreamfort before, maybe try an embark in a relatively flat
take it for a spin! It will help put the following sections in context. There is area and take it for a spin! It will help put the following sections in
also a pre-built Dreamfort available for download on context. There is also a pre-built Dreamfort available for download on
:dffd:`dffd <15434>` if you just want an interactive reference. :dffd:`dffd <15434>` if you just want an interactive reference.
Dreamfort organization and packaging Dreamfort organization and packaging
@ -1388,9 +1439,9 @@ The Dreamfort blueprints are distributed with DFHack as
:source:`one large .csv file <data/blueprints/dreamfort.csv>`, but :source:`one large .csv file <data/blueprints/dreamfort.csv>`, but
editing in that format would be frustrating. Instead, the blueprints are editing in that format would be frustrating. Instead, the blueprints are
edited `online as Google drive spreadsheets edited `online as Google drive spreadsheets
<https://drive.google.com/drive/folders/1iS90EEVqUkxTeZiiukVj1pLloZqabKuP>`__. <https://drive.google.com/drive/folders/1dsmvnzbOKsyFS3DCj0F8ibSnMhVHEjdV>`__.
Either the .csv file or the .xlsx files can be read and applied by quickfort, Either the .csv file or the .xlsx files can be read and applied by quickfort,
but it made more sense to distribute the blueprints as a .csv so users would but it made more sense to distribute the blueprints as a .csv so players would
only have to remember one filename. Also, .csv files are text-based, which works only have to remember one filename. Also, .csv files are text-based, which works
more naturally with the DFHack source control system. We use the more naturally with the DFHack source control system. We use the
`xlsx2csv <https://github.com/dilshod/xlsx2csv>`__ utility to do the conversion `xlsx2csv <https://github.com/dilshod/xlsx2csv>`__ utility to do the conversion
@ -1406,7 +1457,7 @@ walkthrough and other useful details. This is the first sheet in each
spreadsheet so it will be selected by default if the user doesn't specify a spreadsheet so it will be selected by default if the user doesn't specify a
label name. For example, just running ``quickfort run label name. For example, just running ``quickfort run
library/dreamfort.csv`` will display Dreamfort's `introduction text library/dreamfort.csv`` will display Dreamfort's `introduction text
<https://docs.google.com/spreadsheets/d/13PVZ2h3Mm3x_G1OXQvwKd7oIR2lK4A1Ahf6Om1kFigw>`__. <https://docs.google.com/spreadsheets/d/15TDBebP8rBNvsFbezb9xuKPmGWNzv7j4XZWq1AsfCio>`__.
Do not neglect writing the help text! Not only will it give others a chance to Do not neglect writing the help text! Not only will it give others a chance to
use your blueprints appropriately, but the help you write will remind *you* what use your blueprints appropriately, but the help you write will remind *you* what
@ -1415,11 +1466,11 @@ you were thinking when you wrote the blueprint in the first place.
The surface_ level: how to manage complexity The surface_ level: how to manage complexity
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. _surface: https://docs.google.com/spreadsheets/d/1vlxOuDOTsjsZ5W45Ri1kJKgp3waFo8r505LfZVg5wkU .. _surface: https://docs.google.com/spreadsheets/d/17HfnCJY4WDPlLdiLuUNc0gwyf6BiSdayndjvFYXzS7c
.. image:: https://drive.google.com/uc?export=download&id=1YL_vQJLB2YnUEFrAg9y3HEdFq3Wpw9WP .. image:: https://drive.google.com/uc?export=download&id=1dlu3nmwQszav-ZaTx-ac28wrcaYBQc_t
:alt: Annotated screenshot of the dreamfort surface level :alt: Annotated screenshot of the dreamfort surface level
:target: https://drive.google.com/file/d/1YL_vQJLB2YnUEFrAg9y3HEdFq3Wpw9WP :target: https://drive.google.com/file/d/1dlu3nmwQszav-ZaTx-ac28wrcaYBQc_t
:align: center :align: center
For smaller blueprints, packaging and usability are not really that important - For smaller blueprints, packaging and usability are not really that important -
@ -1427,9 +1478,9 @@ just write it, run it, and you're done. However, as your blueprints become
larger and more detailed, there are some best practices that can help you deal larger and more detailed, there are some best practices that can help you deal
with the added complexity. Dreamfort's surface level is many steps long since with the added complexity. Dreamfort's surface level is many steps long since
there are trees to be cleared, holes to be dug, flooring to be laid, and there are trees to be cleared, holes to be dug, flooring to be laid, and
bridges to be built, and each step requires the previous step to be completely bridges to be linked to control levers, and each step requires the previous
finished before it can begin. Therefore, a lot of thought went into minimizing step to be completely finished before it can begin. Therefore, a lot of thought
the toil associated with applying so many blueprints. went into minimizing the toil associated with applying so many blueprints.
.. topic:: Tip .. topic:: Tip
@ -1440,13 +1491,13 @@ The single most effective way to make your blueprint sets easier to use is to
group them with `meta blueprints <quickfort-meta>`. For the Dreamfort set of group them with `meta blueprints <quickfort-meta>`. For the Dreamfort set of
blueprints, each logical "step" generally takes more than one blueprint. For blueprints, each logical "step" generally takes more than one blueprint. For
example, with ``#meta`` blueprints, setting up pastures with a ``#zone`` example, with ``#meta`` blueprints, setting up pastures with a ``#zone``
blueprint, placing starting stockpiles with a ``#place`` blueprint, building blueprint, placing starting stockpiles with a ``#place`` blueprint, and building
starting workshops with a ``#build`` blueprint, and configuring the stockpiles starting workshops with a ``#build`` blueprint can all be done with a single
with a ``#query`` blueprint can all be done with a single command. Bundling command. Bundling blueprints with ``#meta`` blueprints reduced the number of
blueprints with ``#meta`` blueprints reduced the number of steps in Dreamfort steps in Dreamfort from 100 to about 25, and it also made it much clearer to
from 61 to 30, and it also made it much clearer to see which blueprints can be see which blueprints can be applied at once without unpausing the game. Check
applied at once without unpausing the game. Check out dreamfort_surface's "`meta out dreamfort_surface's "`meta
<https://docs.google.com/spreadsheets/d/1vlxOuDOTsjsZ5W45Ri1kJKgp3waFo8r505LfZVg5wkU/edit#gid=972927200>`__" <https://docs.google.com/spreadsheets/d/17HfnCJY4WDPlLdiLuUNc0gwyf6BiSdayndjvFYXzS7c/edit#gid=972927200>`__"
sheet to see how much meta blueprints can simplify your life. sheet to see how much meta blueprints can simplify your life.
You can define `as many blueprints as you want <quickfort-packaging>` on one You can define `as many blueprints as you want <quickfort-packaging>` on one
@ -1458,25 +1509,27 @@ having a bird's eye view of your entire plan in one sheet.
Keep the blueprint list uncluttered by using ``hidden()`` markers. Keep the blueprint list uncluttered by using ``hidden()`` markers.
If a blueprint is bundled into a meta blueprint, it does not need to appear in If a blueprint is bundled into a meta blueprint, it does not need to appear in
the ``quickfort list`` output since you won't be running it directly. Add a the `gui/quickfort` blueprint load dialog or ``quickfort list`` output since
`hidden() marker <quickfort-hidden>` to those blueprints to keep the list you won't be running it directly. Add a `hidden() marker <quickfort-hidden>` to
output tidy. You can still access hidden blueprints with ``quickfort list those blueprints to keep the list output tidy. You can still access hidden
--hidden`` if you need to -- for example to reapply a partially completed blueprints by toggling the "Hidden" setting in `gui/quickfort` or by passing the
``#build`` blueprint -- but now they wont clutter up the normal blueprint list. ``--hidden`` option to ``quickfort list`` if you need to, for example to
reapply a partially completed ``#build`` blueprint, but now they wont clutter
up the normal blueprint list.
.. topic:: Tip .. topic:: Tip
Name your blueprints with a common prefix so you can find them easily. Name your blueprints with a common prefix so you can find them easily.
This goes for both the file name and the `modeline label() <quickfort-label>`. This goes for both the file name and the `modeline label() <quickfort-label>`.
Searching and filtering is implemented for both the Searching and filtering is implemented for both `gui/quickfort` and the
``quickfort list`` command and the quickfort interactive dialog. If you give ``quickfort list`` command. If you give related blueprints a common prefix, it
related blueprints a common prefix, it makes it easy to set the filters to makes it easy to set the filters to display just the blueprints that you're
display just the blueprints that you're interested in. If you have a lot of interested in. If you have a lot of blueprints, this can save you a lot of
blueprints, this can save you a lot of time. Dreamfort uses the level name as a time. Dreamfort uses the level name as a prefix for the labels, like
prefix for the labels, like "surface1", "surface2", "farming1", etc. So if Im "surface1", "surface2", "farming1", etc. So if Im in the middle of applying
in the middle of applying the surface blueprints, Id set the filter to the surface blueprints, Id set the filter to ``dreamfort surface`` to just
``dreamfort surface`` to just display the relevant blueprints. display the relevant blueprints.
.. topic:: Tip .. topic:: Tip
@ -1496,7 +1549,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 the current or an upcoming step * Whether orders should be generated for the current or an upcoming step
* Any actions that you have to perform manually after running the blueprint, * Any actions that you have to perform manually after running the blueprint,
like assigning minecarts to hauling routes or pasturing animals in like assigning minecarts to hauling routes or pasturing animals in
newly-created zones newly-created zones
@ -1505,136 +1558,96 @@ These things are just too easy to forget. Adding a ``message()`` can save you
from time-wasting mistakes. Note that ``message()`` markers can still appear on from time-wasting mistakes. Note that ``message()`` markers can still appear on
the ``hidden()`` blueprints, and they'll still get shown when the blueprint is the ``hidden()`` blueprints, and they'll still get shown when the blueprint is
run via a ``#meta`` blueprint. For an example of this, check out the `zones run via a ``#meta`` blueprint. For an example of this, check out the `zones
sheet <https://docs.google.com/spreadsheets/d/1vlxOuDOTsjsZ5W45Ri1kJKgp3waFo8r505LfZVg5wkU/edit#gid=1226136256>`__ sheet <https://docs.google.com/spreadsheets/d/17HfnCJY4WDPlLdiLuUNc0gwyf6BiSdayndjvFYXzS7c/edit#gid=1226136256>`__
where the pastures are defined. where the pastures are defined.
The farming_ level: fun with stockpiles The farming_ level: fun with stockpiles
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. _farming: https://docs.google.com/spreadsheets/d/1iuj807iGVk6vsfYY4j52v9_-wsszA1AnFqoxeoehByg .. _farming: https://docs.google.com/spreadsheets/d/1RZ67upSpQx7hX-AkqiFXVJl8o5GGdDX1WDOJNz-wOiA
.. image:: https://drive.google.com/uc?export=download&id=1fBC3G5Y888l4tVe5REAyAd_zeojADVme .. image:: https://drive.google.com/uc?export=download&id=1vDaedLcgoexUdKREUz75ZXQi0ZSdwWwj
:alt: Annotated screenshot of the dreamfort farming level :alt: Annotated screenshot of the dreamfort farming level
:target: https://drive.google.com/file/d/1fBC3G5Y888l4tVe5REAyAd_zeojADVme :target: https://drive.google.com/file/d/1vDaedLcgoexUdKREUz75ZXQi0ZSdwWwj
:align: center :align: center
It is usually convenient to store closely associated blueprints in the same It is usually convenient to store closely associated blueprints in the same
spreadsheet. The farming level is very closely tied to the surface because the spreadsheet. The farming level is very closely tied to the surface because the
miasma vents dug on the surface have to perfectly line up with where waste miasma vents dug on the surface have to perfectly line up with where rottables
products are placed on the farming level. However, surface is a separate z-level can accumulate on the farming level. However, surface is a separate z-level
and, more importantly, already has many many blueprints of its own. Farming is and, more importantly, already has many many blueprints of its own. Farming is
therefore split into a separate file. therefore split into a separate file.
.. topic:: Tip .. topic:: Tip
Automate stockpile chains when you can, and write ``message()`` reminders Automate stockpile chains with the ``take_from`` and ``give_to`` properties.
when you can't.
The farming level starts doing interesting things with stockpiles in its
The farming level starts doing interesting things with ``#query`` blueprints and ``#place`` blueprints. Note the `careful customization
stockpiles. Note the `careful customization <https://docs.google.com/spreadsheets/d/1RZ67upSpQx7hX-AkqiFXVJl8o5GGdDX1WDOJNz-wOiA/edit#gid=1174337781>`__
<https://docs.google.com/spreadsheets/d/1iuj807iGVk6vsfYY4j52v9_- of the food stockpiles and the stockpile chains set up with the ``take_from``
wsszA1AnFqoxeoehByg/edit#gid=486506218>`__ of the food stockpiles and the and ``give_to`` properties. For example, the "Seeds" stockpile is set to
stockpile chains set up with the ``give*`` aliases. This is so when multiple ``link_only=true`` and the "Seeds feeder" stockpile has ``containers=0`` and
stockpiles can hold the same item, the largest can keep the smaller ones filled. ``give_to=Seeds``. This minimizes container churn for the common task of seed
For example the ``give2up`` alias funnels seeds from the seeds feeder pile to recovery. When finding the named stockpiles to link, quickfort will search the
the container-enabled seed storage pile. If you have multiple stockpiles holding other stockpiles created in the same blueprint first. If no stockpiles by that
the same type on different z-levels, though, this can be tricky to set up with a name are found, then existing stockpiles/workshops are searched. This is how
blueprint. Here, the jugs and pots stockpiles must be manually linked to the many of the stockpiles on this level are configured to take from the starter
quantum stockpile on the industry level, since we can't know beforehand how many stockpiles on the surface.
z-levels away that is. Note how we call that out in the ``#query`` blueprint's
``message()``.
.. topic:: Tip .. topic:: Tip
Use aliases to set up hauling routes and quantum stockpiles. Quantum stockpiles are super easy to define, if you want to use them.
Hauling routes are notoriously fiddly to set up, but they can be automated with Hauling routes are notoriously fiddly to set up by hand, but they can be easily
blueprints. Check out the Southern area of the ``#place`` and ``#query`` automated with blueprints. Check out the Southern area of the ``#place`` and
blueprints for how the quantum refuse dump is configured with simple aliases ``#build`` blueprints for how the quantum refuse dump is configured with simple
from the alias library. ``take_from`` and ``route`` properties attached to the track stop.
The industry_ level: when not to use aliases The industry_ level: advanced linking
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. _industry: https://docs.google.com/spreadsheets/d/1gvTJxxRxZ5V4vXkqwhL-qlr_lXCNt8176TK14m4kSOU .. _industry: https://docs.google.com/spreadsheets/d/16nzXGrznQmtkrmQv7FeKsVYnv8SSA7eBl1M-97NmuQk
.. image:: https://drive.google.com/uc?export=download&id=1emMaHHCaUPcdRbkLQqvr-0ZCs2tdM5X7 .. image:: https://drive.google.com/uc?export=download&id=1c8YTHxTgJY5tUII-BOWdLhmDFAHwIOEs
:alt: Annotated screenshot of the dreamfort industry level :alt: Annotated screenshot of the dreamfort industry level
:target: https://drive.google.com/file/d/1emMaHHCaUPcdRbkLQqvr-0ZCs2tdM5X7 :target: https://drive.google.com/file/d/1c8YTHxTgJY5tUII-BOWdLhmDFAHwIOEs
:align: center :align: center
The industry level is densely packed and has more complicated examples of The industry level is densely packed and has more intracate stockpile and
stockpile configurations and quantum dumps. However, what I'd like to call out hauling route configuration.
first are the key sequences that are *not* in aliases.
.. topic:: Tip .. topic:: Tip
Don't use aliases for ad-hoc cursor movements. Name things.
It may be tempting to put all query blueprint key sequences into aliases to make
them easier to edit, keep them all in one place, and make them reusable, but
some key sequences just aren't very valuable as aliases.
`Check out <https://docs.google.com/spreadsheets/d/1gvTJxxRxZ5V4vXkqwhL-qlr_lXCNt8176TK14m4kSOU/edit#gid=787640554>`__ In order to be a target for a stockpile or workshop link, the stockpile or
the Eastern (goods) and Northern (stone and gems) quantum stockpiles -- cells building must have a name. That's not the only reason you should give things
I19 and R10. They give to the jeweler's workshop to prevent the jeweler from names, though. The game is just much easier to play when stockpiles and key
using the gems held in reserve for strange moods. The keys are not aliased since buildings have descriptive names. Which lever controls the bridge named "Right outer gate"? You can click on that bridge, click on "show linked buildings", zoom to the lever, and click on the lever. Or you can scan your mouse over the levers and click onYou can always edit names in-game, but
they're dependent on the relative positions of the tiles where they are blueprints are a great way to automate this task.
interpreted, which is easiest to 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 a separate alias definition.
There are also good examples in the ``#query`` blueprint for how to use the
``permit`` and ``forbid`` stockpile aliases.
.. topic:: Tip .. topic:: Tip
Put all configuration that must be applied in a particular order in the You can give to or take from multiple sources.
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 Some of the feeder stockpiles on this level are split up so that no one item
2. Permit an item type, but do not otherwise change the stockpile configuration type can fill the whole pile. The track stops that drive the quantum stockpiles
3. Forbid an item type, but do not otherwise change the stockpile configuration have to take from all of them at once. When specifying multiple link targets
that have spaces in their names, remember to surround the whole list with
quotes. For example::
If you have a stockpile that covers multiple tiles, it might seem natural to put #build
one alias per spreadsheet cell. The aliases still all get applied to the trackstopW{name="Goods/wood dumper" take_from="Wood feeder,Goods feeder,Furniture feeder" route="Goods/wood quantum"}
stockpile, and with only one alias per cell, you can just type the alias name
and avoid having to use the messier-looking ``{aliasname}`` syntax::
#place Declare a food stockpile
f(3x3)
#query Incorrectly configure a 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 tallow exclusively permitted, then to add dye. It could happen
that the two aliases are applied in the opposite order, though, and we'd end up
with dye being permitted, then everything (including dye) being forbidden, and,
finally, tallow being enabled. To make sure you always get what you want, write
order-sensitive aliases on the same line::
#place Declare a food stockpile
f(3x3)
#query Properly configure a food stockpile to accept tallow and dye
{tallow}{permitdye}
You can see a more complex example of this with the ``meltables`` stockpiles in
the `lower left corner <https://docs.google.com/spreadsheets/d/1gvTJxxRxZ5V4vXkqwhL-qlr_lXCNt8176TK14m4kSOU/edit#gid=787640554>`__
of the industry level.
The services_ level: handling multi-level dig blueprints The services_ level: handling multi-level dig blueprints
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. _services: https://docs.google.com/spreadsheets/d/1IBy6_pGEe6WSBCLukDz_5I-4vi_mpHuJJyOp2j6SJlY .. _services: https://docs.google.com/spreadsheets/d/1xu8vNKGlGDN9L3MVB4qp2Ytef9oAWvuET6RkuZXmCaE
.. image:: https://drive.google.com/uc?export=download&id=13vDIkTVOZGkM84tYf4O5nmRs4VZdE1gh .. image:: https://drive.google.com/uc?export=download&id=1RQMy_zYQWM5GN7-zjn6LoLWmnrJjkxPM
:alt: Annotated screenshot of the dreamfort services level :alt: Annotated screenshot of the dreamfort services level
:target: https://drive.google.com/file/d/13vDIkTVOZGkM84tYf4O5nmRs4VZdE1gh :target: https://drive.google.com/file/d/1RQMy_zYQWM5GN7-zjn6LoLWmnrJjkxPM
:align: center :align: center
Services is a multi-level blueprint that includes a well cistern beneath the Services is a multi-level blueprint that includes a well cistern beneath the
@ -1646,27 +1659,31 @@ priorities <quickfort-dig-priorities>`.
Use dig priorities to control ramp creation. Use dig priorities to control ramp creation.
We can `ensure <https://docs.google.com/spreadsheets/d/1IBy6_pGEe6WSBCLukDz_5I-4vi_mpHuJJyOp2j6SJlY/edit#gid=962076234>`__ We can `ensure <https://docs.google.com/spreadsheets/d/1xu8vNKGlGDN9L3MVB4qp2Ytef9oAWvuET6RkuZXmCaE/edit#gid=1706912296>`__
the bottom level is carved out before the layer above is channeled by assigning the bottom level is carved out before the layer above is channeled by assigning
the channel designations lower priorities (the ``h5``\s in the third layer -- the channel designations lower priorities (the ``h5``\s in the lower layers --
scroll down). scroll down). This works here because there is only a single column of
higher-priority stairs for a dwarf to dig down to get below the lower-priority
channels. If the dig area has multiple tiles exposed, it is harder to control
dig order since a second dwarf may not have access to any higher-priority tiles
and may start digging the lower-priority designations prematurely.
An alternative is to have a follow-up blueprint that removes any undesired An alternative is to have a follow-up blueprint that removes any undesired
ramps. We did this on the ramps. We did this on the
`surface <https://docs.google.com/spreadsheets/d/1vlxOuDOTsjsZ5W45Ri1kJKgp3waFo8r505LfZVg5wkU/edit#gid=1790750180>`__ `surface <https://docs.google.com/spreadsheets/d/17HfnCJY4WDPlLdiLuUNc0gwyf6BiSdayndjvFYXzS7c/edit#gid=1790750180>`__
and and
`farming <https://docs.google.com/spreadsheets/d/1iuj807iGVk6vsfYY4j52v9_-wsszA1AnFqoxeoehByg/edit#gid=436537058>`__ `farming <https://docs.google.com/spreadsheets/d/1RZ67upSpQx7hX-AkqiFXVJl8o5GGdDX1WDOJNz-wOiA/edit#gid=436537058>`__
levels with the miasma vents since it would be too complicated to synchronize levels with the miasma vents since it would be too complicated to synchronize
the digging between the two layers. simultaneous digging of the two layers.
The guildhall_ level: avoiding smoothing issues The guildhall_ level: avoiding smoothing issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. _guildhall: https://docs.google.com/spreadsheets/d/1wwKcOpEW-v_kyEnFyXS0FTjvLwJsyWbCUmEGaXWxJyU .. _guildhall: https://docs.google.com/spreadsheets/d/1DltZIHkw7zpNiQdSvXLcHdbwdttPwl35pVpBUYy90TA
.. image:: https://drive.google.com/uc?export=download&id=17jHiCKeZm6FSS-CI4V0r0GJZh09nzcO_ .. image:: https://drive.google.com/uc?export=download&id=1mt66QOkfBqFLtw6AJKU6GNYmhB72XSJG
:alt: Annotated screenshot of the dreamfort guildhall level :alt: Annotated screenshot of the dreamfort guildhall level
:target: https://drive.google.com/file/d/17jHiCKeZm6FSS-CI4V0r0GJZh09nzcO_ :target: https://drive.google.com/file/d/1mt66QOkfBqFLtw6AJKU6GNYmhB72XSJG
:align: center :align: center
The goal of this level is to provide rooms for ``locations`` like guildhalls, The goal of this level is to provide rooms for ``locations`` like guildhalls,
@ -1685,24 +1702,65 @@ blocks a corner, or if a line of statues blocks a wall segment, it forces the
player to smooth before building the statues. Otherwise they have to bother with player to smooth before building the statues. Otherwise they have to bother with
temporarily removing statues to smooth the walls behind them. temporarily removing statues to smooth the walls behind them.
The beds_ levels: multi level meta blueprints The suites_ level: balance of flexibility
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. _beds: https://docs.google.com/spreadsheets/d/1QNHORq6YmYfuVVMP5yGAFCQluary_JbgZ-UXACqKs9g .. _suites: https://docs.google.com/spreadsheets/d/1pZ5mnYzzYLSni-LA3rfHZ6dFX8n7rTW088iBwsCI7N4
.. image:: https://drive.google.com/uc?export=download&id=1IBqCf6fF3lw7sHiBE_15Euubysl5AAiS .. image:: https://drive.google.com/uc?export=download&id=16XRb1w5zFoyVq2LBMx_aCwOyjFq7GULc
:alt: Annotated screenshot of the dreamfort noble suites :alt: Annotated screenshot of the dreamfort noble suites
:target: https://drive.google.com/file/d/1IBqCf6fF3lw7sHiBE_15Euubysl5AAiS :target: https://drive.google.com/file/d/16XRb1w5zFoyVq2LBMx_aCwOyjFq7GULc
:align: center :align: center
.. image:: https://drive.google.com/uc?export=download&id=1mDQQXG8BnXqasRGFC9R5N6xNALiswEyr In designing this level, we needed to choose between two approaches:
1. Create rooms with specific, pre-determined purposes, laying out furniture
and zoning with appropriate types
#. Lay out each room the same so each can serve any purpose
Each has pros and cons. The first option reduces more toil by pre-creating the
zones. If we go this route, we can also auto-assign the rooms to the various
roles (if they exist when the blueprint is run). Each room can be customized
for its intended purpose: offices can look like offices, bedrooms could look
like bedrooms, and so on. However, if the needs of the fort don't correspond to
the pre-determined layouts, or if the needs of the fort *change* significantly,
then the blueprint can become more of a hinderance than a help.
As you can see from the screenshot, we went with option 2. The ability to
re-zone arbitrarily to meet changing noble needs was too great of a benefit to
ignore. The downside, of course, is that you have to zone and assign your own
rooms. However, as soon as you gain a barony or a duchy, you'd be doing that
anyway with option 1.
With option 2, if you need a "better" bedroom, you'd just expand the zone to
cover the neighboring "unit". Satisfying the monarch is also simple: plop down
a new suites level and assign each block of 4 rooms to one zone. four units for
the bedroom, four for the office, four for the dining hall, and four for the
tomb. Smooth and engrave and you're done. Of course, more asthetic-minded
players are always free to design custom areas too. These blueprints are
designed to be functional more than beautiful.
The beds_ and crypt_ levels: copy and paste and repeat
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. _beds: https://docs.google.com/spreadsheets/d/1pZ5mnYzzYLSni-LA3rfHZ6dFX8n7rTW088iBwsCI7N4
.. _crypt: https://docs.google.com/spreadsheets/d/1yTr48EFgXIoswhzL2RXpzUBvY8Sa-XKEacf6zXriZvM
.. image:: https://drive.google.com/uc?export=download&id=16-NXlodLIQjeZUMSmsWRafeytwU2dXQo
:alt: Annotated screenshot of the dreamfort apartments :alt: Annotated screenshot of the dreamfort apartments
:target: https://drive.google.com/file/d/1mDQQXG8BnXqasRGFC9R5N6xNALiswEyr :target: https://drive.google.com/file/d/16-NXlodLIQjeZUMSmsWRafeytwU2dXQo
:align: center
.. image:: https://drive.google.com/uc?export=download&id=16iT_ho7BIRPD_eofuxdlVQ4FunR1Li23
:alt: Annotated screenshot of the dreamfort crypt
:target: https://drive.google.com/file/d/16iT_ho7BIRPD_eofuxdlVQ4FunR1Li23
:align: center :align: center
The suites and apartments blueprints are straightforward. The only fancy bit The apartments and crypt blueprints are straightforward, other than the sheer
is the meta blueprint that digs the stack of apartment levels, which brings us number of zones. Copy-paste in Google Sheets was used heavily here. The only
to our final tip: fancy bit is the meta blueprint that digs the stack of apartment levels, which
brings us to our final tip:
.. topic:: Tip .. topic:: Tip
@ -1713,15 +1771,15 @@ aquifer between the farming and industry levels, and we can't know beforehand
how many z-levels we need to skip. We can, however, automate the digging of how many z-levels we need to skip. We can, however, automate the digging of
everything from the industry level down, including designating all apartment everything from the industry level down, including designating all apartment
levels at once. See the levels at once. See the
`#meta <https://docs.google.com/spreadsheets/d/13PVZ2h3Mm3x_G1OXQvwKd7oIR2lK4A1Ahf6Om1kFigw/edit#gid=284974597>`__ `#meta <https://docs.google.com/spreadsheets/d/15TDBebP8rBNvsFbezb9xuKPmGWNzv7j4XZWq1AsfCio/edit#gid=284974597>`__
blueprint in the `Dreamfort help spreadsheet blueprint in the `Dreamfort help spreadsheet
<https://docs.google.com/spreadsheets/d/13PVZ2h3Mm3x_G1OXQvwKd7oIR2lK4A1Ahf6Om1kFigw/edit#gid=0>`__ <https://docs.google.com/spreadsheets/d/15TDBebP8rBNvsFbezb9xuKPmGWNzv7j4XZWq1AsfCio>`__
for how it uses a ``repeat()`` marker for the ``/apartments1`` blueprint to for how it uses a ``repeat()`` marker for the ``/apartments1`` blueprint to
apply it to five z-levels at once. apply it to three z-levels at once.
That's it! I hope this guide was useful to you. Please leave feedback on the That's it! I hope this guide was useful to you. Please leave feedback on the
forums if you have ideas on how this guide (or the dreamfort blueprints) can be forums or on the DFHack Discord server if you have ideas on how this guide (or
improved! the dreamfort blueprints themselves) can be improved!
Links Links
----- -----
@ -1952,9 +2010,11 @@ Property Description
In addition to the type-specific properties listed below, all building types In addition to the type-specific properties listed below, all building types
accept the ``name`` property. accept the ``name`` property.
Moreover, all workshops and furnaces accept ``take_from`` and ``give_to`` Moreover, all workshops and furnaces accept the ``max_general_orders``
properties, which are comma-separated lists of names (the same as the property, which sets the maximum number of general workorders that the building
correponding stockpile properties above). can accept, and the ``take_from`` and ``give_to`` properties, which are
comma-separated lists of names (the same as the correponding stockpile
properties above).
================= ============================= ========== ================= ============================= ==========
Symbol Type Properties Symbol Type Properties