static void mark_all_in_stockpiles(vector<StockpileInfo> &stockpiles, bool announce) { if (!depot_info.findDepot()) { if (announce) Gui::showAnnouncement("Cannot trade, no valid depot available", COLOR_RED, true); return; } std::vector<df::item*> &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; #define F(x) bad_flags.bits.x = true; F(dump); F(forbid); F(garbage_collect); F(hostile); F(on_fire); F(rotten); F(trader); F(in_building); F(construction); F(artifact); F(spider_web); F(owned); F(in_job); #undef F size_t marked_count = 0; size_t error_count = 0; for (size_t i = 0; i < items.size(); i++) { df::item *item = items[i]; if (item->flags.whole & bad_flags.whole) continue; if (!is_valid_item(item)) continue; for (auto it = stockpiles.begin(); it != stockpiles.end(); it++) { if (!it->inStockpile(item)) continue; // In case of container, check contained items for mandates bool mandates_ok = true; vector<df::item*> contained_items; Items::getContainedItems(item, &contained_items); for (auto cit = contained_items.begin(); cit != contained_items.end(); cit++) { if (!check_mandates(*cit)) { mandates_ok = false; break; } } if (!mandates_ok) continue; if (depot_info.assignItem(item)) { ++marked_count; } else { if (++error_count < 5) { Gui::showZoomAnnouncement(df::announcement_type::CANCEL_JOB, item->pos, "Cannot trade item from stockpile " + int_to_string(it->getId()), COLOR_RED, true); } } } } if (marked_count) Gui::showAnnouncement("Marked " + int_to_string(marked_count) + " items for trade", COLOR_GREEN, false); else if (announce) Gui::showAnnouncement("No more items to mark", COLOR_RED, true); if (error_count >= 5) { Gui::showAnnouncement(int_to_string(error_count) + " items were not marked", COLOR_RED, true); } }
static void mark_all_in_stockpiles(vector<PersistentStockpileInfo> &stockpiles) { if (!depot_info.findDepot()) return; // Precompute a bitmask with the bad flags df::item_flags bad_flags; bad_flags.whole = 0; #define F(x) bad_flags.bits.x = true; F(dump); F(forbid); F(garbage_collect); F(hostile); F(on_fire); F(rotten); F(trader); F(in_building); F(construction); F(artifact); F(spider_web); F(owned); F(in_job); #undef F size_t marked_count = 0; size_t error_count = 0; for (auto it = stockpiles.begin(); it != stockpiles.end(); it++) { if (!it->isValid()) 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_valid_item(item)) continue; // In case of container, check contained items for mandates bool mandates_ok = true; vector<df::item*> contained_items; Items::getContainedItems(item, &contained_items); for (df::item *cit : contained_items) { if (!Items::checkMandates(cit)) { mandates_ok = false; break; } } if (!mandates_ok) continue; if (depot_info.assignItem(item)) { ++marked_count; } else { if (++error_count < 5) { Gui::showZoomAnnouncement(df::announcement_type::CANCEL_JOB, item->pos, "Cannot trade item from stockpile " + int_to_string(it->getId()), COLOR_RED, true); } } } } if (marked_count) Gui::showAnnouncement("Marked " + int_to_string(marked_count) + " items for trade", COLOR_GREEN, false); if (error_count >= 5) { Gui::showAnnouncement(int_to_string(error_count) + " items were not marked", COLOR_RED, true); } }