Merge pull request #3088 from myk002/myk_buildingplan_normalize_stairs

[buildingplan] normalize stairs so they all use the same filter
develop
Myk 2023-03-25 12:55:29 -07:00 committed by GitHub
commit 9a5a259fa9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 7 deletions

@ -37,6 +37,8 @@ changelog.txt uses a syntax similar to RST, with a few special sequences:
- `prospector`: prospector tool in fort mode is now available. embark prospect is not yet available and is disabled at this time.
## Fixes
- `buildingplan`: filters are now properly applied to planned stairs
- `buildingplan`: existing carved up/down stairs are now taken into account when determining which stair shape to construct
- `buildingplan`: upright spike traps are now placed extended rather than retracted
- `buildingplan`: you can no longer designate constructions on tiles with magma or deep water
- `buildingplan`: fixed material filter getting lost for planning buildings on save/reload

@ -9,6 +9,7 @@
#include "modules/World.h"
#include "df/construction_type.h"
#include "df/item.h"
#include "df/job_item.h"
#include "df/world.h"
@ -282,6 +283,18 @@ static void clear_state(color_ostream &out) {
call_buildingplan_lua(&out, "reload_pens");
}
static int16_t get_subtype(df::building *bld) {
if (!bld)
return -1;
int16_t subtype = bld->getSubtype();
if (bld->getType() == df::building_type::Construction &&
subtype >= df::construction_type::UpStair &&
subtype <= df::construction_type::UpDownStair)
subtype = df::construction_type::UpDownStair;
return subtype;
}
DFhackCExport command_result plugin_load_data (color_ostream &out) {
cycle_timestamp = 0;
config = World::GetPersistentData(CONFIG_KEY);
@ -315,7 +328,7 @@ DFhackCExport command_result plugin_load_data (color_ostream &out) {
pb.remove(out);
continue;
}
BuildingTypeKey key(bld->getType(), bld->getSubtype(), bld->getCustomType());
BuildingTypeKey key(bld->getType(), get_subtype(bld), bld->getCustomType());
if (pb.item_filters.size() != get_item_filters(out, key).getItemFilters().size()) {
WARN(status).print("loaded state for building %d doesn't match world\n", pb.id);
pb.remove(out);
@ -604,11 +617,15 @@ static bool isPlannedBuilding(color_ostream &out, df::building *bld) {
static bool addPlannedBuilding(color_ostream &out, df::building *bld) {
DEBUG(status,out).print("entering addPlannedBuilding\n");
if (!bld || planned_buildings.count(bld->id)
|| !isPlannableBuilding(out, bld->getType(), bld->getSubtype(),
bld->getCustomType()))
if (!bld || planned_buildings.count(bld->id))
return false;
BuildingTypeKey key(bld->getType(), bld->getSubtype(), bld->getCustomType());
int16_t subtype = get_subtype(bld);
if (!isPlannableBuilding(out, bld->getType(), subtype, bld->getCustomType()))
return false;
BuildingTypeKey key(bld->getType(), subtype, bld->getCustomType());
PlannedBuilding pb(out, bld, get_heat_safety_filter(key), get_item_filters(out, key));
return registerPlannedBuilding(out, pb);
}

@ -782,7 +782,7 @@ function PlannerOverlay:get_stairs_subtype(pos, bounds)
if opt == 'auto' then
local tt = dfhack.maps.getTileType(pos)
local shape = df.tiletype.attrs[tt].shape
if shape ~= df.tiletype_shape.STAIR_DOWN then
if shape ~= df.tiletype_shape.STAIR_DOWN and shape ~= df.tiletype_shape.STAIR_UPDOWN then
subtype = df.construction_type.UpStair
end
else
@ -793,7 +793,7 @@ function PlannerOverlay:get_stairs_subtype(pos, bounds)
if opt == 'auto' then
local tt = dfhack.maps.getTileType(pos)
local shape = df.tiletype.attrs[tt].shape
if shape ~= df.tiletype_shape.STAIR_UP then
if shape ~= df.tiletype_shape.STAIR_UP and shape ~= df.tiletype_shape.STAIR_UPDOWN then
subtype = df.construction_type.DownStair
end
else