From 2b2d03b9b18b948d2926a5153a69fdfe0f107946 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 22 Apr 2023 15:05:25 -0700 Subject: [PATCH] calculate and display global stats --- plugins/logistics.cpp | 33 ++++++++++++++++++++++++++++++++ plugins/lua/logistics.lua | 40 +++++++++++++++++++++++---------------- 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/plugins/logistics.cpp b/plugins/logistics.cpp index 495dc9305..d4c4cef53 100644 --- a/plugins/logistics.cpp +++ b/plugins/logistics.cpp @@ -663,6 +663,38 @@ static void logistics_clearAllStockpileConfigs(color_ostream &out) { watched_stockpiles.clear(); } +static int logistics_getGlobalCounts(lua_State *L) { + color_ostream *out = Lua::GetOutput(L); + if (!out) + out = &Core::getInstance().getConsole(); + DEBUG(status,*out).print("entering logistics_getGlobalCounts\n"); + + size_t num_melt = df::global::world->items.other.ANY_MELT_DESIGNATED.size(); + + size_t num_trade = 0; + for (auto link = world->jobs.list.next; link; link = link->next) { + df::job *job = link->item; + if (job->job_type == df::job_type::BringItemToDepot) + ++num_trade; + } + + size_t num_dump = 0; + for (auto item : world->items.other.IN_PLAY) { + if (item->flags.bits.dump) + ++num_dump; + } + + unordered_map results; + results.emplace("total_melt", num_melt); + results.emplace("total_trade", num_trade); + results.emplace("total_dump", num_dump); + Lua::Push(L, results); + + TRACE(cycle, *out).print("exit logistics_getGlobalCounts\n"); + + return 1; +} + DFHACK_PLUGIN_LUA_FUNCTIONS{ DFHACK_LUA_FUNCTION(logistics_cycle), DFHACK_LUA_FUNCTION(logistics_setStockpileConfig), @@ -673,4 +705,5 @@ DFHACK_PLUGIN_LUA_COMMANDS{ DFHACK_LUA_COMMAND(logistics_getStockpileData), DFHACK_LUA_COMMAND(logistics_getStockpileConfigs), DFHACK_LUA_COMMAND(logistics_clearStockpileConfig), + DFHACK_LUA_COMMAND(logistics_getGlobalCounts), DFHACK_LUA_END}; diff --git a/plugins/lua/logistics.lua b/plugins/lua/logistics.lua index 806d1aa97..4d3ff00be 100644 --- a/plugins/lua/logistics.lua +++ b/plugins/lua/logistics.lua @@ -34,22 +34,7 @@ function getStockpileData() return data end -local function print_status() - print(('logistics is %sactively monitoring stockpiles and marking items') - :format(isEnabled() and '' or 'not ')) - - if df.global.gamemode ~= df.game_mode.DWARF or not dfhack.isMapLoaded() then - return - end - - local data = getStockpileData() - - print() - if not data[1] then - print 'No stockpiles defined -- go make some!' - return - end - +local function print_stockpile_data(data) local name_len = 12 for _,sp in ipairs(data) do name_len = math.min(40, math.max(name_len, #sp.name)) @@ -69,6 +54,29 @@ local function print_status() end end +local function print_status() + print(('logistics is %sactively monitoring stockpiles and marking items') + :format(isEnabled() and '' or 'not ')) + + if df.global.gamemode ~= df.game_mode.DWARF or not dfhack.isMapLoaded() then + return + end + + local data = getStockpileData() + print() + if not data[1] then + print 'No stockpiles defined -- go make some!' + else + print_stockpile_data(data) + end + + local global_stats = logistics_getGlobalCounts() + print() + print(('Total items marked for melting: %5d'):format(global_stats.total_melt)) + print(('Total items marked for trading: %5d'):format(global_stats.total_trade)) + print(('Total items marked for dumping: %5d'):format(global_stats.total_dump)) +end + local function for_stockpiles(opts, fn) if not opts.sp then local selected_sp = dfhack.gui.getSelectedStockpile()