diff --git a/docs/plugins/automelt.rst b/docs/plugins/automelt.rst index 83f433599..45f51561a 100644 --- a/docs/plugins/automelt.rst +++ b/docs/plugins/automelt.rst @@ -17,21 +17,28 @@ Usage enable automelt automelt [status] - automelt (designate) - automelt (monitor|nomonitor) + automelt designate + automelt (monitor|nomonitor) [,...] Examples -------- -Automatically designate all meltable items in the stockpile ("melt") for melting. :: +Automatically monitor stockpile ("melt"), marking new valid items for melting. This also immediately marks all present items for melting:: enable automelt automelt monitor melt -Enable monitoring for the stockpile ("melt"), and mmediately designate all meltable items in monitored stockpiles for melting. :: +Enable monitoring for ("Stockpile #52"), which has not been given a custom name:: - automelt monitor melt - automelt designate + automelt monitor "Stockpile #52" + +Enable monitoring for ("Stockpile #52"), which has not been given a custom name:: + + automelt monitor 52 + +Enable monitoring for multiple stockpiles ("Stockpile #52", "Stockpile #35", and "melt"):: + + automelt monitor 52,"Stockpile #35",melt Commands -------- @@ -43,4 +50,6 @@ Commands Designates items in monitored stockpiles for melting right now. This works even if ``automelt`` is not currently enabled. ``(no)monitor `` - Enable/disable monitoring of a given stockpile. Requires the stockpile to have a name set. + Enable/disable monitoring of a given stockpile. Works with either the stockpile's name (if set) or ID. + If the stockpile has no custom name set, you may designate it by either the full name as reported by + the status command, or by just the number. \ No newline at end of file diff --git a/plugins/automelt.cpp b/plugins/automelt.cpp index b12bc3b7c..c0d80532a 100644 --- a/plugins/automelt.cpp +++ b/plugins/automelt.cpp @@ -276,7 +276,8 @@ struct BadFlagsCanMelt { #define F(x) 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(in_job); + F(in_building); F(construction); F(artifact); + F(spider_web); F(owned); F(in_job); #undef F whole = flags.whole; } @@ -361,7 +362,6 @@ static int mark_item(color_ostream &out, df::item *item, BadFlagsMarkItem bad_fl if (item->flags.whole & bad_flags.whole){ DEBUG(perf,out).print("rejected flag check\n"); - item_count++; return 0; } @@ -392,7 +392,6 @@ static int mark_item(color_ostream &out, df::item *item, BadFlagsMarkItem bad_fl if (!can_melt(item)) { DEBUG(perf,out).print("cannot melt\n"); - item_count++; return 0; } @@ -588,7 +587,6 @@ static void push_stockpile_config(lua_State *L, int id, bool monitored) { map stockpile_config; stockpile_config.emplace("id", id); stockpile_config.emplace("monitored", monitored); - Lua::Push(L, stockpile_config); } @@ -625,13 +623,18 @@ static void automelt_printStatus(color_ostream &out) { int name_width = 11; for (auto &stockpile : world->buildings.other.STOCKPILE) { if (!isStockpile(stockpile)) continue; - name_width = std::max(name_width, (int)stockpile->name.size()); + if (stockpile->name.empty()) { + string stock_name = "Stockpile #" + int_to_string(stockpile->stockpile_number); + name_width = std::max(name_width, (int)(stock_name.size())); + } else { + name_width = std::max(name_width, (int)stockpile->name.size()); + } } name_width = -name_width; - const char *fmt = "%*s %4s %4s %5s %5s\n"; - out.print(fmt, name_width, "name", " id ", "monitored", "items", "marked"); - out.print(fmt, name_width, "----", "----", "---------", "-----", "------"); + const char *fmt = "%*s %9s %5s %6s\n"; + out.print(fmt, name_width, "name", "monitored", "items", "marked"); + out.print(fmt, name_width, "----", "---------", "-----", "------"); for (auto &stockpile : world->buildings.other.STOCKPILE) { if (!isStockpile(stockpile)) continue; @@ -644,11 +647,19 @@ static void automelt_printStatus(color_ostream &out) { int id = get_config_val(c, STOCKPILE_CONFIG_ID); item_count = item_count_piles[id]; marked_item_count = premarked_item_count_piles[id]; + } + int32_t stockpile_number = stockpile->stockpile_number; + if (stockpile->name.empty()) { + string stock_name = "Stockpile #" + int_to_string(stockpile->stockpile_number); + out.print(fmt, name_width, stock_name, monitored ? "[x]": "[ ]", + int_to_string(item_count).c_str(), int_to_string(marked_item_count).c_str()); + } else { + out.print(fmt, name_width, stockpile->name.c_str(), monitored ? "[x]": "[ ]", + int_to_string(item_count).c_str(), int_to_string(marked_item_count).c_str()); } - out.print(fmt, name_width, stockpile->name.c_str(), int_to_string(stockpile->id).c_str(), monitored ? "[x]": "[ ]", - int_to_string(item_count).c_str(), int_to_string(marked_item_count).c_str()); + } DEBUG(status,out).print("exiting automelt_printStatus\n"); @@ -667,6 +678,11 @@ static void automelt_setStockpileConfig(color_ostream &out, int id, bool monitor PersistentDataItem &c = ensure_stockpile_config(out, id); set_config_val(c, STOCKPILE_CONFIG_ID, id); set_config_bool(c, STOCKPILE_CONFIG_MONITORED, monitored); + + //If we're marking something as monitored, go ahead and designate contents. + if (monitored) { + automelt_designate(out); + } } static int automelt_getStockpileConfig(lua_State *L) { @@ -678,10 +694,23 @@ static int automelt_getStockpileConfig(lua_State *L) { int id; if (lua_isnumber(L, -1)) { + bool found = false; id = lua_tointeger(L, -1); - if (!df::building::find(id)) + + for (auto &stockpile : world->buildings.other.STOCKPILE) { + if (!isStockpile(stockpile)) continue; + if (id == stockpile->stockpile_number){ + id = stockpile->id; + found = true; + break; + + } + } + + if (!found) return 0; + } else { const char * name = lua_tostring(L, -1); if (!name) @@ -694,8 +723,16 @@ static int automelt_getStockpileConfig(lua_State *L) { id = stockpile->id; found = true; break; + } else { + string stock_name = "Stockpile #" + int_to_string(stockpile->stockpile_number); + if (stock_name == nameStr) { + id = stockpile->id; + found = true; + break; + } } + } if (!found) return 0; diff --git a/plugins/lua/automelt.lua b/plugins/lua/automelt.lua index 9be662ee9..dc6c94f9b 100644 --- a/plugins/lua/automelt.lua +++ b/plugins/lua/automelt.lua @@ -38,7 +38,7 @@ function parse_commandline(...) automelt_designate() elseif command == 'monitor' then do_set_stockpile_config('monitor', true, args[2]) - elseif command == 'nomonitor'then + elseif command == 'nomonitor' or command == 'unmonitor' then do_set_stockpile_config('monitor', false, args[2]) else return false @@ -47,12 +47,13 @@ function parse_commandline(...) return true end --- used by gui/auomelt +-- used by gui/automelt function setStockpileConfig(config) automelt_setStockpileConfig(config.id, config.monitored) end function getItemCountsAndStockpileConfigs() + local fmt = 'Stockpile #%-5s' local data = {automelt_getItemCountsAndStockpileConfigs()} local ret = {} ret.summary = table.remove(data, 1) @@ -62,6 +63,10 @@ function getItemCountsAndStockpileConfigs() ret.stockpile_configs = data for _,c in ipairs(ret.stockpile_configs) do c.name = df.building.find(c.id).name + if not c.name or c.name == '' then + c.name = (fmt):format(tostring(df.building.find(c.id).stockpile_number)) + c.name = c.name.gsub(c.name, '^%s*(.-)%s*$', '%1') + end c.monitored = c.monitored ~= 0 end return ret