Merge branch 'develop' of https://github.com/DFHack/dfhack into prevent_repeated_survey_mlt_calls

develop
bseiller 2021-01-24 13:57:27 +01:00
commit 3c4cb749a3
8 changed files with 154 additions and 35 deletions

@ -24,6 +24,7 @@ Bearskie Bearskie
belal jimhester
Ben Lubar BenLubar
Ben Rosser TC01
Benjamin Seiller bseiller RedDwarfStepper
billw2012 billw2012
BrickViking brickviking
brndd brndd burneddi

@ -716,6 +716,8 @@ 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,
with minimal space dedicated to stockpiles.
.. _buildingplan-filters:
Item filtering
--------------
@ -723,11 +725,11 @@ While placing a building, you can set filters for what materials you want the bu
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).
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 placed from that point onward
(until you set a new filter or clear the current one). Buildings placed before the filters
were changed will keep the filter values that were set when the building was placed.
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.
@ -745,6 +747,48 @@ Note that Quickfort mode is only for compatibility with the legacy Python Quickf
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.
.. _buildingplan-settings:
Global settings
---------------
The buildingplan plugin has several global settings that can be set from the UI (:kbd:`G`
from any building placement screen, for example: :kbd:`b`:kbd:`a`:kbd:`G`). These settings
can also be set from the ``DFHack#`` prompt once a map is loaded (or from your
``onMapLoad.init`` file) with the syntax::
buildingplan set <setting> <true|false>
and displayed with::
buildingplan set
The available settings are:
+----------------+---------+---------------------------------------+
| Setting | Default | Description |
+================+=========+=======================================+
| blocks | true | Allow blocks, boulders, logs, or bars |
+----------------+---------+ to be matched for generic "building |
| boulders | true | material" items |
+----------------+---------+ |
| logs | true | |
+----------------+---------+ |
| bars | false | |
+----------------+---------+---------------------------------------+
| quickfort_mode | false | Enable compatibility mode for the |
| | | legacy Python Quickfort (not required |
| | | for DFHack quickfort) |
+----------------+---------+---------------------------------------+
For example, to ensure you only use blocks when a "building material" item is required, you
could add this to your ``onMapLoad.init`` file::
on-new-fortress buildingplan set boulders false; buildingplan set logs false
You only need to set the settings for new fortresses since your current filter settings
are saved with your game.
.. _confirm:
confirm

@ -35,6 +35,10 @@ changelog.txt uses a syntax similar to RST, with a few special sequences:
## Fixes
- `embark-assistant`: fixed order of factors when calculating min temperature
- `embark-assistant`: improved performance of surveying
## Misc Improvements
- `buildingplan`: set global settings from the ``DFHack#`` prompt: e.g. ``buildingplan set boulders false``
# 0.47.04-r4

@ -842,6 +842,8 @@ Blueprint mode Description
meta Link sequences of blueprints together
notes Display long messages, such as help text or blueprint
walkthroughs
ignore Hide a section from quickfort, useful for scratch space or
personal notes
============== ===========
.. _quickfort-meta:
@ -1000,6 +1002,14 @@ The quotes around the ``#meta`` modeline allow newlines in a single cell's text.
Each line of the ``#notes`` "blueprint", however, is in a separate cell,
allowing for much easier viewing and editing.
Ignore blueprints
`````````````````
If you don't want some data to be visible to quickfort at all, use an
``#ignore`` blueprint. All lines until the next modeline in the file or sheet
will be completely ignored. This can be useful for personal notes, scratch
space, or temporarily "commented out" blueprints.
Buildingplan integration
------------------------
@ -1009,19 +1019,22 @@ prevents a building designation from being canceled when a dwarf picks up the
job but can't find the materials.
As long as the `buildingplan` plugin is enabled, quickfort will use it to manage
construction. The buildingplan plugin also has an "enabled" setting for each
building type, but that setting only applies to the buildingplan user interface;
quickfort will use buildingplan to manage everything designated in a ``#build``
blueprint regardless of the buildingplan UI settings.
However, quickfort *does* use buildingplan's filters for each building type. For
example, you can use the buildingplan UI to set the type of stone you want your
walls made out of. Or you can specify that all buildingplan-managed tables must
be of Masterful quality. The current filter settings are saved with planned
buildings when the ``#build`` blueprint is run. This means you can set the
filters the way 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 yet.
construction. The buildingplan plugin has an `"enabled" setting
<buildingplan-settings>` for each building type, but those settings only apply
to buildings created through the buildingplan user interface. In addition,
buildingplan has a "quickfort_mode" setting for compatibility with legacy Python
Quickfort. This setting has no effect on DFHack Quickfort, which will use
buildingplan to manage everything designated in a ``#build`` blueprint
regardless of the buildingplan UI settings.
However, quickfort *does* use `buildingplan's filters <buildingplan-filters>`
for each building type. For example, you can use the buildingplan UI to set the
type of stone you want your walls made out of. Or you can specify that all
buildingplan-managed tables must be of Masterful quality. The current filter
settings are saved with planned buildings when the ``#build`` blueprint is run.
This means you can set the filters the way 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 yet.
Note that buildings are still constructed immediately if you already have the
materials. However, with buildingplan you now have the freedom to apply

@ -17,7 +17,7 @@
#include "buildingplan-lib.h"
DFHACK_PLUGIN("buildingplan");
#define PLUGIN_VERSION 2.0
#define PLUGIN_VERSION "2.0"
REQUIRE_GLOBAL(ui);
REQUIRE_GLOBAL(ui_build_selector);
REQUIRE_GLOBAL(world); // used in buildingplan library
@ -911,26 +911,87 @@ IMPLEMENT_VMETHOD_INTERPOSE(buildingplan_query_hook, render);
IMPLEMENT_VMETHOD_INTERPOSE(buildingplan_place_hook, render);
IMPLEMENT_VMETHOD_INTERPOSE(buildingplan_room_hook, render);
DFHACK_PLUGIN_IS_ENABLED(is_enabled);
static bool setSetting(std::string name, bool value);
static bool isTrue(std::string val)
{
val = toLower(val);
return val == "on" || val == "true" || val == "y" || val == "yes"
|| val == "1";
}
static command_result buildingplan_cmd(color_ostream &out, vector <string> & parameters)
{
if (!parameters.empty())
if (parameters.empty())
return CR_OK;
std::string cmd = toLower(parameters[0]);
if (cmd.size() >= 1 && cmd[0] == 'v')
{
out.print("buildingplan version: %s\n", PLUGIN_VERSION);
}
else if (parameters.size() >= 2 && cmd == "debug")
{
show_debugging = isTrue(parameters[1]);
out.print("buildingplan debugging: %s\n",
show_debugging ? "enabled" : "disabled");
}
else if (cmd == "set")
{
if (parameters.size() == 1 && toLower(parameters[0])[0] == 'v')
if (!is_enabled)
{
out << "Building Plan" << endl << "Version: " << PLUGIN_VERSION << endl;
out.printerr(
"ERROR: buildingplan must be enabled before you can"
" read or set buildingplan global settings.");
return CR_FAILURE;
}
else if (parameters.size() == 2 && toLower(parameters[0]) == "debug")
if (!DFHack::Core::getInstance().isMapLoaded())
{
show_debugging = (toLower(parameters[1]) == "on");
out << "Debugging " << ((show_debugging) ? "enabled" : "disabled") << endl;
out.printerr(
"ERROR: A map must be loaded before you can read or set"
"buildingplan global settings. Try adding your"
"'buildingplan set' commands to the onMapLoad.init file.\n");
return CR_FAILURE;
}
if (parameters.size() == 1)
{
// display current settings
out.print("active settings:\n");
for (auto & setting : planner.getGlobalSettings())
{
out.print(" %s = %s\n", setting.first.c_str(),
setting.second ? "true" : "false");
}
out.print(" quickfort_mode = %s\n",
quickfort_mode ? "true" : "false");
}
else if (parameters.size() == 3)
{
// set a setting
std::string setting = toLower(parameters[1]);
bool val = isTrue(parameters[2]);
if (!setSetting(setting, val))
{
out.printerr("ERROR: invalid parameter: '%s'\n",
parameters[1].c_str());
}
}
else
{
out.printerr("ERROR: invalid syntax\n");
}
}
return CR_OK;
}
DFHACK_PLUGIN_IS_ENABLED(is_enabled);
DFhackCExport command_result plugin_enable(color_ostream &out, bool enable)
{
if (!gps)
@ -1040,14 +1101,14 @@ static void scheduleCycle() {
cycle_requested = true;
}
static void setSetting(std::string name, bool value) {
static bool setSetting(std::string name, bool value) {
if (name == "quickfort_mode")
{
debug("setting quickfort_mode %d -> %d", quickfort_mode, value);
quickfort_mode = value;
return;
return true;
}
planner.setGlobalSetting(name, value);
return planner.setGlobalSetting(name, value);
}
DFHACK_PLUGIN_LUA_FUNCTIONS {

@ -996,7 +996,6 @@ void embark_assist::survey::survey_mid_level_tile(embark_assist::defs::geo_data
base_z = elevation - 1;
features = details->features[i][k];
std::map<int, int> layer_bottom, layer_top;
mlt->at(i).at(k).adamantine_level = -1;
mlt->at(i).at(k).magma_level = -1;
@ -1027,8 +1026,6 @@ void embark_assist::survey::survey_mid_level_tile(embark_assist::defs::geo_data
feature->min_z != -30000) {
auto layer = world_data->underground_regions[feature->layer];
layer_bottom[layer->layer_depth] = feature->min_z;
layer_top[layer->layer_depth] = feature->max_z;
base_z = std::min((int)base_z, (int)feature->min_z);
if (layer->type == df::world_underground_region::MagmaSea) {

@ -1,5 +1,4 @@
#pragma once
#include <map>
#include "DataDefs.h"
#include "df/coord2d.h"

@ -1 +1 @@
Subproject commit 9d11d91e1991bedc3108f97c0b79389c88206594
Subproject commit ebe6f5d599bfafb614a791b637413e976c8870a5