diff --git a/data/dfhack-config/init/dfhack.control-panel-system.init b/data/dfhack-config/init/dfhack.control-panel-system.init index 8b1431373..c1ad6a679 100644 --- a/data/dfhack-config/init/dfhack.control-panel-system.init +++ b/data/dfhack-config/init/dfhack.control-panel-system.init @@ -2,3 +2,4 @@ # Please use gui/control-panel to edit this file enable faststart +enable work-now diff --git a/docs/changelog.txt b/docs/changelog.txt index 66904aa6d..a6d72d4ce 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -34,6 +34,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: # Future ## New Plugins +- `work-now`: reduce the time that dwarves are left without a task after completing a job ## Fixes - `autoclothing`: eliminate game lag when there are many inventory items in the fort diff --git a/docs/plugins/work-now.rst b/docs/plugins/work-now.rst index 7578500e8..517378d56 100644 --- a/docs/plugins/work-now.rst +++ b/docs/plugins/work-now.rst @@ -6,17 +6,12 @@ work-now :tags: fort auto jobs After finishing a job, dwarves will wander away for a while before picking up a -new job. This plugin will automatically poke the game to assign dwarves to new -tasks. +new job. This plugin will automatically poke them to pick up a new task quicker. Usage ----- -``workNow`` - Print current plugin status. -``workNow 0`` - Stop monitoring and poking. -``workNow 1`` - Poke the game to assign dwarves to tasks whenever the game is paused. -``workNow 2`` - Poke the game to assign dwarves to tasks whenever a dwarf finishes a job. +:: + + enable work-now + work-now [status] diff --git a/plugins/work-now.cpp b/plugins/work-now.cpp index 2286fee7e..bce2d9a73 100644 --- a/plugins/work-now.cpp +++ b/plugins/work-now.cpp @@ -1,92 +1,74 @@ -#include "Core.h" -#include "Console.h" -#include "Export.h" +#include "Debug.h" #include "PluginManager.h" -#include "DataDefs.h" #include "modules/EventManager.h" -#include "modules/World.h" -#include "df/global_objects.h" - -#include - -using namespace std; +using std::string; +using std::vector; using namespace DFHack; -DFHACK_PLUGIN("workNow"); +DFHACK_PLUGIN("work-now"); +DFHACK_PLUGIN_IS_ENABLED(is_enabled); REQUIRE_GLOBAL(process_jobs); REQUIRE_GLOBAL(process_dig); -static int mode = 0; +namespace DFHack { + DBG_DECLARE(worknow, log, DebugCategory::LINFO); +} -DFhackCExport command_result workNow(color_ostream& out, vector& parameters); +DFhackCExport command_result work_now(color_ostream& out, vector& parameters); -void jobCompletedHandler(color_ostream& out, void* ptr); +static void jobCompletedHandler(color_ostream& out, void* ptr); EventManager::EventHandler handler(jobCompletedHandler,1); DFhackCExport command_result plugin_init(color_ostream& out, std::vector &commands) { - if (!process_jobs || !process_dig) - return CR_FAILURE; - commands.push_back(PluginCommand( - "workNow", + "work-now", "Reduce the time that dwarves idle after completing a job.", - workNow)); + work_now)); return CR_OK; } -DFhackCExport command_result plugin_shutdown ( color_ostream &out ) { - mode = 0; +DFhackCExport command_result plugin_enable(color_ostream &out, bool enable) { + if (enable != is_enabled) + { + if (enable) + EventManager::registerListener(EventManager::EventType::JOB_COMPLETED, handler, plugin_self); + else + EventManager::unregister(EventManager::EventType::JOB_COMPLETED, handler, plugin_self); + + is_enabled = enable; + } + return CR_OK; } +DFhackCExport command_result plugin_shutdown ( color_ostream &out ) { + return plugin_enable(out, false); +} + DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_change_event e) { - if ( !mode ) - return CR_OK; - if ( e == DFHack::SC_WORLD_UNLOADED ) { - mode = 0; - return CR_OK; + if (e == SC_PAUSED) { + DEBUG(log,out).print("game paused; poking idlers\n"); + *process_jobs = true; + *process_dig = true; } - if ( e != DFHack::SC_PAUSED ) - return CR_OK; - - *process_jobs = true; - *process_dig = true; return CR_OK; } -DFhackCExport command_result workNow(color_ostream& out, vector& parameters) { - if ( parameters.size() == 0 ) { - out.print("workNow status = %d\n", mode); +DFhackCExport command_result work_now(color_ostream& out, vector& parameters) { + if (parameters.empty() || parameters[0] == "status") { + out.print("work_now is %sactively poking idle dwarves.\n", is_enabled ? "" : "not "); return CR_OK; } - if ( parameters.size() > 1 ) { - return CR_WRONG_USAGE; - } - int32_t a = atoi(parameters[0].c_str()); - - if (a < 0 || a > 2) - return CR_WRONG_USAGE; - if ( a == 2 && mode != 2 ) { - EventManager::registerListener(EventManager::EventType::JOB_COMPLETED, handler, plugin_self); - } else if ( mode == 2 && a != 2 ) { - EventManager::unregister(EventManager::EventType::JOB_COMPLETED, handler, plugin_self); - } - - mode = a; - out.print("workNow status = %d\n", mode); - - return CR_OK; + return CR_WRONG_USAGE; } -void jobCompletedHandler(color_ostream& out, void* ptr) { - if ( mode < 2 ) - return; - +static void jobCompletedHandler(color_ostream& out, void* ptr) { + DEBUG(log,out).print("job completed; poking idlers\n"); *process_jobs = true; *process_dig = true; }