From 5087b6d2ae88efcac5efef7943daddd5d8cba754 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 4 Oct 2020 23:53:42 -0700 Subject: [PATCH] use new default_item_filters structure so vector references aren't to items on the stack also don't let query mode swallow all input --- plugins/buildingplan-planner.cpp | 8 ++++---- plugins/buildingplan-planner.h | 4 +++- plugins/buildingplan.cpp | 7 +++---- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/plugins/buildingplan-planner.cpp b/plugins/buildingplan-planner.cpp index c367ecc33..25df38ad5 100644 --- a/plugins/buildingplan-planner.cpp +++ b/plugins/buildingplan-planner.cpp @@ -439,7 +439,7 @@ void Planner::initialize() void Planner::reset() { debug("resetting Planner state"); - item_filters.clear(); + default_item_filters.clear(); planned_buildings.clear(); std::vector items; @@ -549,9 +549,9 @@ Planner::ItemFiltersWrapper Planner::getItemFilters(BuildingTypeKey key) int nfilters = getNumFilters(key); if (nfilters < 1) return empty_ret; - std::vector ret; - ret.push_back(item_filters[std::get<0>(key)]); - return ItemFiltersWrapper(ret); + while (default_item_filters[key].size() < nfilters) + default_item_filters[key].push_back(ItemFilter()); + return ItemFiltersWrapper(default_item_filters[key]); } void Planner::doCycle() diff --git a/plugins/buildingplan-planner.h b/plugins/buildingplan-planner.h index a1f53dcd2..9341ad03f 100644 --- a/plugins/buildingplan-planner.h +++ b/plugins/buildingplan-planner.h @@ -119,7 +119,9 @@ public: private: std::map item_for_building_type; - std::map item_filters; + std::unordered_map, + BuildingTypeKeyHash> default_item_filters; std::map> available_item_vectors; std::map is_relevant_item_type; //Needed for fast check when looping over all items std::vector planned_buildings; diff --git a/plugins/buildingplan.cpp b/plugins/buildingplan.cpp index 6cb45c879..2caa9c542 100644 --- a/plugins/buildingplan.cpp +++ b/plugins/buildingplan.cpp @@ -309,13 +309,12 @@ struct buildingplan_query_hook : public df::viewscreen_dwarfmodest return true; // Don't unsuspend planned buildings if (input->count(interface_key::DESTROYBUILDING)) { - // remove persistent data + // remove persistent data and allow the parent to handle the key + // so the building is removed planner.getPlannedBuilding(world->selected_building)->remove(); - // still allow the building to be removed - return false; } - return true; + return false; } DEFINE_VMETHOD_INTERPOSE(void, feed, (set *input))