From e46a27c8a4669c08c3dc7e6196bb2d7c81bad5a7 Mon Sep 17 00:00:00 2001 From: Eric Wald Date: Sat, 27 Sep 2014 11:07:26 -0600 Subject: [PATCH 1/2] Switching automelt to the stockpile iterator. --- plugins/automelt.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/plugins/automelt.cpp b/plugins/automelt.cpp index 58cbdd20c..394bd9406 100644 --- a/plugins/automelt.cpp +++ b/plugins/automelt.cpp @@ -7,6 +7,7 @@ #include "df/building_def.h" #include "df/viewscreen_dwarfmodest.h" #include "df/building_stockpilest.h" +#include "modules/Buildings.h" #include "modules/Items.h" #include "df/ui.h" #include "modules/Maps.h" @@ -25,8 +26,6 @@ static const string PERSISTENCE_KEY = "automelt/stockpiles"; static void mark_all_in_stockpiles(vector &stockpiles) { - std::vector &items = world->items.other[items_other_id::IN_PLAY]; - // Precompute a bitmask with the bad flags df::item_flags bad_flags; bad_flags.whole = 0; @@ -39,22 +38,23 @@ static void mark_all_in_stockpiles(vector &stockpiles) #undef F size_t marked_count = 0; - for (size_t i = 0; i < items.size(); i++) + auto &melting_items = world->items.other[items_other_id::ANY_MELT_DESIGNATED]; + for (auto it = stockpiles.begin(); it != stockpiles.end(); it++) { - df::item *item = items[i]; - if (item->flags.whole & bad_flags.whole) + if (!it->isValid()) continue; - if (!can_melt(item)) - continue; + Buildings::StockpileIterator stored; + for (stored.begin(it->getStockpile()); !stored.done(); ++stored) + { + df::item *item = *stored; + if (item->flags.whole & bad_flags.whole) + continue; - if (is_set_to_melt(item)) - continue; + if (!can_melt(item)) + continue; - auto &melting_items = world->items.other[items_other_id::ANY_MELT_DESIGNATED]; - for (auto it = stockpiles.begin(); it != stockpiles.end(); it++) - { - if (!it->inStockpile(item)) + if (is_set_to_melt(item)) continue; ++marked_count; From 95dd009a15bfb4d7a611fd71f24a8ef5bc9cb1c7 Mon Sep 17 00:00:00 2001 From: Eric Wald Date: Sun, 5 Oct 2014 17:57:57 -0600 Subject: [PATCH 2/2] Restoring automelt for items in bins. The stockpile iterator yields bins, but not their contents. Should other containers be checked, too? --- plugins/automelt.cpp | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/plugins/automelt.cpp b/plugins/automelt.cpp index 394bd9406..cfd348455 100644 --- a/plugins/automelt.cpp +++ b/plugins/automelt.cpp @@ -24,6 +24,34 @@ DFHACK_PLUGIN("automelt"); static const string PERSISTENCE_KEY = "automelt/stockpiles"; +static int mark_item(df::item *item, df::item_flags bad_flags, int32_t stockpile_id) +{ + if (item->flags.whole & bad_flags.whole) + return 0; + + if (item->isAssignedToThisStockpile(stockpile_id)) { + size_t marked_count = 0; + std::vector contents; + Items::getContainedItems(item, &contents); + for (auto child = contents.begin(); child != contents.end(); child++) + { + marked_count += mark_item(*child, bad_flags, stockpile_id); + } + + return marked_count; + } + + if (!can_melt(item)) + return 0; + + if (is_set_to_melt(item)) + return 0; + + insert_into_vector(world->items.other[items_other_id::ANY_MELT_DESIGNATED], &df::item::id, item); + item->flags.bits.melt = true; + return 1; +} + static void mark_all_in_stockpiles(vector &stockpiles) { // Precompute a bitmask with the bad flags @@ -38,28 +66,16 @@ static void mark_all_in_stockpiles(vector &stockpiles) #undef F size_t marked_count = 0; - auto &melting_items = world->items.other[items_other_id::ANY_MELT_DESIGNATED]; for (auto it = stockpiles.begin(); it != stockpiles.end(); it++) { if (!it->isValid()) continue; + auto spid = it->getId(); Buildings::StockpileIterator stored; for (stored.begin(it->getStockpile()); !stored.done(); ++stored) { - df::item *item = *stored; - if (item->flags.whole & bad_flags.whole) - continue; - - if (!can_melt(item)) - continue; - - if (is_set_to_melt(item)) - continue; - - ++marked_count; - insert_into_vector(melting_items, &df::item::id, item); - item->flags.bits.melt = true; + marked_count += mark_item(*stored, bad_flags, spid); } }