2023-04-27 15:22:45 -06:00
|
|
|
#include "Debug.h"
|
2012-11-19 18:17:05 -07:00
|
|
|
#include "PluginManager.h"
|
2013-03-16 20:43:57 -06:00
|
|
|
|
|
|
|
#include "modules/EventManager.h"
|
2023-12-31 01:54:20 -07:00
|
|
|
#include "modules/Persistence.h"
|
|
|
|
#include "modules/World.h"
|
2013-03-16 20:43:57 -06:00
|
|
|
|
2023-04-27 15:22:45 -06:00
|
|
|
using std::string;
|
|
|
|
using std::vector;
|
2012-11-19 18:17:05 -07:00
|
|
|
using namespace DFHack;
|
|
|
|
|
2023-04-27 15:22:45 -06:00
|
|
|
DFHACK_PLUGIN("work-now");
|
|
|
|
DFHACK_PLUGIN_IS_ENABLED(is_enabled);
|
2023-12-31 01:54:20 -07:00
|
|
|
|
2014-12-06 16:47:35 -07:00
|
|
|
REQUIRE_GLOBAL(process_jobs);
|
|
|
|
REQUIRE_GLOBAL(process_dig);
|
2012-11-19 18:17:05 -07:00
|
|
|
|
2023-04-27 15:22:45 -06:00
|
|
|
namespace DFHack {
|
|
|
|
DBG_DECLARE(worknow, log, DebugCategory::LINFO);
|
|
|
|
}
|
2012-11-19 18:17:05 -07:00
|
|
|
|
2023-12-31 01:54:20 -07:00
|
|
|
static const string CONFIG_KEY = string(plugin_name) + "/config";
|
|
|
|
static PersistentDataItem config;
|
|
|
|
|
|
|
|
enum ConfigValues {
|
|
|
|
CONFIG_IS_ENABLED = 0,
|
|
|
|
};
|
|
|
|
|
|
|
|
static int get_config_val(PersistentDataItem &c, int index) {
|
|
|
|
if (!c.isValid())
|
|
|
|
return -1;
|
|
|
|
return c.ival(index);
|
|
|
|
}
|
|
|
|
static bool get_config_bool(PersistentDataItem &c, int index) {
|
|
|
|
return get_config_val(c, index) == 1;
|
|
|
|
}
|
|
|
|
static void set_config_val(PersistentDataItem &c, int index, int value) {
|
|
|
|
if (c.isValid())
|
|
|
|
c.ival(index) = value;
|
|
|
|
}
|
|
|
|
static void set_config_bool(PersistentDataItem &c, int index, bool value) {
|
|
|
|
set_config_val(c, index, value ? 1 : 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
static command_result work_now(color_ostream& out, vector<string>& parameters);
|
2012-12-08 10:50:33 -07:00
|
|
|
|
2023-04-27 15:22:45 -06:00
|
|
|
static void jobCompletedHandler(color_ostream& out, void* ptr);
|
2013-03-16 20:43:57 -06:00
|
|
|
EventManager::EventHandler handler(jobCompletedHandler,1);
|
|
|
|
|
2012-12-08 10:50:33 -07:00
|
|
|
DFhackCExport command_result plugin_init(color_ostream& out, std::vector<PluginCommand> &commands) {
|
2022-07-31 14:32:06 -06:00
|
|
|
commands.push_back(PluginCommand(
|
2023-04-27 15:22:45 -06:00
|
|
|
"work-now",
|
2022-07-31 14:32:06 -06:00
|
|
|
"Reduce the time that dwarves idle after completing a job.",
|
2023-04-27 15:22:45 -06:00
|
|
|
work_now));
|
2015-02-14 20:53:06 -07:00
|
|
|
|
2012-12-08 10:50:33 -07:00
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
2023-12-31 01:54:20 -07:00
|
|
|
static void cleanup() {
|
|
|
|
EventManager::unregister(EventManager::EventType::JOB_COMPLETED, handler, plugin_self);
|
|
|
|
}
|
|
|
|
|
2023-04-27 15:22:45 -06:00
|
|
|
DFhackCExport command_result plugin_enable(color_ostream &out, bool enable) {
|
2023-12-31 01:54:20 -07:00
|
|
|
if (!Core::getInstance().isWorldLoaded()) {
|
|
|
|
out.printerr("Cannot enable %s without a loaded world.\n", plugin_name);
|
|
|
|
return CR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (enable != is_enabled) {
|
|
|
|
is_enabled = enable;
|
|
|
|
DEBUG(log,out).print("%s from the API; persisting\n",
|
|
|
|
is_enabled ? "enabled" : "disabled");
|
|
|
|
set_config_bool(config, CONFIG_IS_ENABLED, is_enabled);
|
2023-04-27 15:22:45 -06:00
|
|
|
if (enable)
|
|
|
|
EventManager::registerListener(EventManager::EventType::JOB_COMPLETED, handler, plugin_self);
|
|
|
|
else
|
2023-12-31 01:54:20 -07:00
|
|
|
cleanup();
|
|
|
|
} else {
|
|
|
|
DEBUG(log,out).print("%s from the API, but already %s; no action\n",
|
|
|
|
is_enabled ? "enabled" : "disabled",
|
|
|
|
is_enabled ? "enabled" : "disabled");
|
2023-04-27 15:22:45 -06:00
|
|
|
}
|
|
|
|
|
2012-11-19 18:17:05 -07:00
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
2023-04-27 15:22:45 -06:00
|
|
|
DFhackCExport command_result plugin_shutdown ( color_ostream &out ) {
|
2023-12-31 01:54:20 -07:00
|
|
|
cleanup();
|
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
DFhackCExport command_result plugin_load_data (color_ostream &out) {
|
|
|
|
config = World::GetPersistentData(CONFIG_KEY);
|
|
|
|
|
|
|
|
if (!config.isValid()) {
|
|
|
|
DEBUG(log,out).print("no config found in this save; initializing\n");
|
|
|
|
config = World::AddPersistentData(CONFIG_KEY);
|
|
|
|
set_config_bool(config, CONFIG_IS_ENABLED, is_enabled);
|
|
|
|
}
|
|
|
|
|
|
|
|
is_enabled = get_config_bool(config, CONFIG_IS_ENABLED);
|
|
|
|
DEBUG(log,out).print("loading persisted enabled state: %s\n",
|
|
|
|
is_enabled ? "true" : "false");
|
|
|
|
|
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void poke_idlers() {
|
|
|
|
*process_jobs = true;
|
|
|
|
*process_dig = true;
|
2023-04-27 15:22:45 -06:00
|
|
|
}
|
|
|
|
|
2012-12-08 10:50:33 -07:00
|
|
|
DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_change_event e) {
|
2023-04-27 15:22:45 -06:00
|
|
|
if (e == SC_PAUSED) {
|
|
|
|
DEBUG(log,out).print("game paused; poking idlers\n");
|
2023-12-31 01:54:20 -07:00
|
|
|
poke_idlers();
|
|
|
|
} else if (e == DFHack::SC_WORLD_UNLOADED) {
|
|
|
|
if (is_enabled) {
|
|
|
|
DEBUG(log,out).print("world unloaded; disabling %s\n",
|
|
|
|
plugin_name);
|
|
|
|
is_enabled = false;
|
|
|
|
}
|
2012-12-08 10:50:33 -07:00
|
|
|
}
|
2015-02-14 20:53:06 -07:00
|
|
|
|
2012-11-19 18:17:05 -07:00
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
2023-12-31 01:54:20 -07:00
|
|
|
static command_result work_now(color_ostream& out, vector<string>& parameters) {
|
2023-04-27 15:22:45 -06:00
|
|
|
if (parameters.empty() || parameters[0] == "status") {
|
|
|
|
out.print("work_now is %sactively poking idle dwarves.\n", is_enabled ? "" : "not ");
|
2012-12-08 10:50:33 -07:00
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
2023-04-27 15:22:45 -06:00
|
|
|
return CR_WRONG_USAGE;
|
2012-11-19 18:17:05 -07:00
|
|
|
}
|
|
|
|
|
2023-04-27 15:22:45 -06:00
|
|
|
static void jobCompletedHandler(color_ostream& out, void* ptr) {
|
|
|
|
DEBUG(log,out).print("job completed; poking idlers\n");
|
2023-12-31 01:54:20 -07:00
|
|
|
poke_idlers();
|
2013-03-16 20:43:57 -06:00
|
|
|
}
|