From 385ac3f9f5694355f64edafc6955e3c5a20eb798 Mon Sep 17 00:00:00 2001 From: Phillip Spiess Date: Sun, 20 May 2018 14:25:59 -0700 Subject: [PATCH] Add 'Max Quality' setting to buildingplan --- docs/Authors.rst | 1 + plugins/buildingplan-lib.cpp | 24 ++++++++++++++++++++---- plugins/buildingplan-lib.h | 10 ++++++++-- plugins/buildingplan.cpp | 12 +++++++++++- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/docs/Authors.rst b/docs/Authors.rst index a67266006..594b4952e 100644 --- a/docs/Authors.rst +++ b/docs/Authors.rst @@ -131,6 +131,7 @@ Tim Walberg twalberg Timothy Collett danaris Tom Jobbins TheBloke Tom Prince +TotallyGatsby TotallyGatsby Travis Hoppe thoppe orthographic-pedant txtsd txtsd U-glouglou\\simon diff --git a/plugins/buildingplan-lib.cpp b/plugins/buildingplan-lib.cpp index f6023d2d7..2c2a2fb07 100644 --- a/plugins/buildingplan-lib.cpp +++ b/plugins/buildingplan-lib.cpp @@ -39,7 +39,7 @@ bool ItemFilter::matches(DFHack::MaterialInfo &material) const bool ItemFilter::matches(df::item *item) { - if (item->getQuality() < min_quality) + if (item->getQuality() < min_quality || item->getQuality() > max_quality) return false; if (decorated_only && !item->hasImprovements()) @@ -120,6 +120,11 @@ std::string ItemFilter::getMinQuality() return ENUM_KEY_STR(item_quality, min_quality); } +std::string ItemFilter::getMaxQuality() +{ + return ENUM_KEY_STR(item_quality, max_quality); +} + bool ItemFilter::isValid() { return valid; @@ -400,6 +405,7 @@ PlannedBuilding::PlannedBuilding(df::building *building, ItemFilter *filter) config.ival(1) = building->id; config.ival(2) = filter->min_quality + 1; config.ival(3) = static_cast(filter->decorated_only) + 1; + config.ival(4) = filter->max_quality + 1; } PlannedBuilding::PlannedBuilding(PersistentDataItem &config, color_ostream &out) @@ -418,6 +424,7 @@ PlannedBuilding::PlannedBuilding(PersistentDataItem &config, color_ostream &out) pos = df::coord(building->centerx, building->centery, building->z); filter.min_quality = static_cast(config.ival(2) - 1); + filter.max_quality = static_cast(config.ival(4) - 1); filter.decorated_only = config.ival(3) - 1; } @@ -647,11 +654,20 @@ PlannedBuilding *Planner::getSelectedPlannedBuilding() return nullptr; } -void Planner::cycleDefaultQuality(df::building_type type) +void Planner::cycleMinQuality(df::building_type type) { - auto quality = &getDefaultItemFilterForType(type)->min_quality; + cycleItemQuality(&getDefaultItemFilterForType(type)->min_quality); +} + +void Planner::cycleMaxQuality(df::building_type type) +{ + cycleItemQuality(&getDefaultItemFilterForType(type)->max_quality); +} + + +void Planner::cycleItemQuality(item_quality::item_quality *quality) { *quality = static_cast(*quality + 1); - if (*quality == item_quality::Artifact) + if (*quality > item_quality::Artifact) (*quality) = item_quality::Ordinary; } diff --git a/plugins/buildingplan-lib.h b/plugins/buildingplan-lib.h index 9720d5421..8ace8029b 100644 --- a/plugins/buildingplan-lib.h +++ b/plugins/buildingplan-lib.h @@ -111,9 +111,11 @@ struct ItemFilter df::dfhack_material_category mat_mask; std::vector materials; df::item_quality min_quality; + df::item_quality max_quality; + bool decorated_only; - ItemFilter() : min_quality(df::item_quality::Ordinary), decorated_only(false), valid(true) + ItemFilter() : min_quality(df::item_quality::Ordinary), max_quality(df::item_quality::Artifact), decorated_only(false), valid(true) { clear(); // mat_mask is not cleared by default (see issue #1047) } @@ -133,6 +135,7 @@ struct ItemFilter bool parseSerializedMaterialTokens(std::string str); std::string getMinQuality(); + std::string getMaxQuality(); bool isValid(); @@ -414,7 +417,8 @@ public: ItemFilter *getDefaultItemFilterForType(df::building_type type) { return &default_item_filters[type]; } - void cycleDefaultQuality(df::building_type type); + void cycleMinQuality(df::building_type type); + void cycleMaxQuality(df::building_type type); void enableQuickfortMode() { @@ -441,6 +445,8 @@ private: std::vector planned_buildings; + void cycleItemQuality(item_quality::item_quality *quality); + void gather_available_items() { debug("Gather available items"); diff --git a/plugins/buildingplan.cpp b/plugins/buildingplan.cpp index 37bb069a4..e0aa3affd 100644 --- a/plugins/buildingplan.cpp +++ b/plugins/buildingplan.cpp @@ -163,7 +163,11 @@ struct buildingplan_hook : public df::viewscreen_dwarfmodest } else if (input->count(interface_key::CUSTOM_SHIFT_Q)) { - planner.cycleDefaultQuality(type); + planner.cycleMinQuality(type); + } + else if (input->count(interface_key::CUSTOM_SHIFT_W)) + { + planner.cycleMaxQuality(type); } else if (input->count(interface_key::CUSTOM_SHIFT_D)) { @@ -274,6 +278,9 @@ struct buildingplan_hook : public df::viewscreen_dwarfmodest OutputHotkeyString(x, y, "Min Quality: ", "Q"); OutputString(COLOR_BROWN, x, y, filter->getMinQuality(), true, left_margin); + OutputHotkeyString(x, y, "Max Quality: ", "W"); + OutputString(COLOR_BROWN, x, y, filter->getMaxQuality(), true, left_margin); + OutputToggleString(x, y, "Decorated Only: ", "D", filter->decorated_only, true, left_margin); OutputHotkeyString(x, y, "Material Filter:", "M", true, left_margin); @@ -299,7 +306,10 @@ struct buildingplan_hook : public df::viewscreen_dwarfmodest auto filter = planner.getSelectedPlannedBuilding()->getFilter(); y = 24; OutputString(COLOR_BROWN, x, y, "Planned Building Filter:", true, left_margin); + OutputString(COLOR_BROWN, x, y, "Min Quality: ", false, left_margin); OutputString(COLOR_BLUE, x, y, filter->getMinQuality(), true, left_margin); + OutputString(COLOR_BROWN, x, y, "Max Quality: ", false, left_margin); + OutputString(COLOR_BLUE, x, y, filter->getMaxQuality(), true, left_margin); if (filter->decorated_only) OutputString(COLOR_BLUE, x, y, "Decorated Only", true, left_margin);