diff --git a/plugins/automelt.cpp b/plugins/automelt.cpp index 58cbdd20c..cfd348455 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" @@ -23,10 +24,36 @@ DFHACK_PLUGIN("automelt"); static const string PERSISTENCE_KEY = "automelt/stockpiles"; -static void mark_all_in_stockpiles(vector &stockpiles) +static int mark_item(df::item *item, df::item_flags bad_flags, int32_t stockpile_id) { - std::vector &items = world->items.other[items_other_id::IN_PLAY]; + 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 df::item_flags bad_flags; bad_flags.whole = 0; @@ -39,27 +66,16 @@ static void mark_all_in_stockpiles(vector &stockpiles) #undef F size_t marked_count = 0; - for (size_t i = 0; i < items.size(); i++) + for (auto it = stockpiles.begin(); it != stockpiles.end(); it++) { - df::item *item = items[i]; - if (item->flags.whole & bad_flags.whole) - continue; - - if (!can_melt(item)) - continue; - - if (is_set_to_melt(item)) + if (!it->isValid()) continue; - auto &melting_items = world->items.other[items_other_id::ANY_MELT_DESIGNATED]; - for (auto it = stockpiles.begin(); it != stockpiles.end(); it++) + auto spid = it->getId(); + Buildings::StockpileIterator stored; + for (stored.begin(it->getStockpile()); !stored.done(); ++stored) { - if (!it->inStockpile(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); } }