diff --git a/library/include/modules/GuiHooks.h b/library/include/modules/GuiHooks.h index c9a68d92f..62f412961 100644 --- a/library/include/modules/GuiHooks.h +++ b/library/include/modules/GuiHooks.h @@ -44,6 +44,7 @@ namespace DFHack { class Callback { T_func *func; T_hook *hook; + bool enabled; public: Callback(T_hook *hook, T_func *func) : hook(hook), func(func) { } @@ -58,9 +59,12 @@ namespace DFHack { hook->add(func); else hook->remove(func); + enabled = enable; } inline void enable() { apply(true); } inline void disable() { apply(false); } + inline bool is_enabled() { return enabled; } + inline void toggle() { apply(!enabled); } }; }; } diff --git a/library/modules/Screen.cpp b/library/modules/Screen.cpp index 2d9408aeb..307da11cf 100644 --- a/library/modules/Screen.cpp +++ b/library/modules/Screen.cpp @@ -220,7 +220,7 @@ bool Screen::drawBorder(const std::string &title) for (int y = 0; y < dim.y; y++) { doSetTile(border, 0, y, false); - doSetTile(border, dim.x - 1, dim.y + y, false); + doSetTile(border, dim.x - 1, y, false); } paintString(signature, dim.x-8, dim.y-1, "DFHack"); diff --git a/plugins/devel/color-dfhack-text.cpp b/plugins/devel/color-dfhack-text.cpp index 45147fba6..70dcb130f 100644 --- a/plugins/devel/color-dfhack-text.cpp +++ b/plugins/devel/color-dfhack-text.cpp @@ -10,6 +10,7 @@ using namespace DFHack; DFHACK_PLUGIN("color-dfhack-text"); DFHACK_PLUGIN_IS_ENABLED(is_enabled); +REQUIRE_GLOBAL(gps); struct { bool flicker; @@ -29,44 +30,82 @@ void color_text_tile(const Screen::Pen &pen, int x, int y, bool map) return color_text_hook.next()(pen2, x, y, map); } +void aaaaa_set_tile(const Screen::Pen &pen, int x, int y, bool map); +GUI_HOOK_CALLBACK(Screen::Hooks::set_tile, aaaaa_set_tile_hook, aaaaa_set_tile); +void aaaaa_set_tile(const Screen::Pen &pen, int x, int y, bool map) +{ + Screen::Pen pen2 = pen; + if ((pen.ch >= 'A' && pen.ch <= 'Z') || (pen.ch >= '0' && pen.ch <= '9')) + pen2.ch = 'A'; + else if (pen.ch >= 'a' && pen.ch <= 'z') + pen2.ch = 'a'; + aaaaa_set_tile_hook.next()(pen2, x, y, map); +} + +void shift_set_tile(const Screen::Pen &pen, int x, int y, bool map); +GUI_HOOK_CALLBACK(Screen::Hooks::set_tile, shift_set_tile_hook, shift_set_tile); +void shift_set_tile(const Screen::Pen &pen, int x, int y, bool map) +{ + x = (x + 1) % gps->dimx; + shift_set_tile_hook.next()(pen, x, y, map); +} + DFhackCExport command_result plugin_enable (color_ostream &out, bool enable) { color_text_hook.apply(enable); + if (!enable) + { + shift_set_tile_hook.disable(); + aaaaa_set_tile_hook.disable(); + } is_enabled = enable; return CR_OK; } command_result color(color_ostream &out, std::vector ¶ms) { - plugin_enable(out, true); - std::string p0 = toLower(params[0]); -#define CHECK_COLOR(color_name) else if (p0 == toLower(std::string(#color_name))) \ - { config.flicker = false; config.color = COLOR_##color_name % 8; } if (params.empty()) - return CR_OK; - CHECK_COLOR(RED) - CHECK_COLOR(GREEN) - CHECK_COLOR(BLUE) - CHECK_COLOR(YELLOW) - CHECK_COLOR(BROWN) - CHECK_COLOR(CYAN) - CHECK_COLOR(MAGENTA) - CHECK_COLOR(WHITE) - CHECK_COLOR(GREY) - CHECK_COLOR(BLACK) -#undef CHECK_COLOR - else if (p0 == "flicker") - { - config.flicker = true; - } - else if (p0 == "disable") - { - plugin_enable(out, false); - } - else if (p0 != "enable") + return plugin_enable(out, true); + for (auto it = params.begin(); it != params.end(); ++it) { - out.printerr("Unrecognized option: %s\n", p0.c_str()); - return CR_WRONG_USAGE; + std::string p = toLower(*it); + if (!p.size()) + continue; + #define CHECK_COLOR(color_name) else if (p == toLower(std::string(#color_name))) \ + { config.flicker = false; config.color = COLOR_##color_name % 8; plugin_enable(out, true); } + CHECK_COLOR(RED) + CHECK_COLOR(GREEN) + CHECK_COLOR(BLUE) + CHECK_COLOR(YELLOW) + CHECK_COLOR(BROWN) + CHECK_COLOR(CYAN) + CHECK_COLOR(MAGENTA) + CHECK_COLOR(WHITE) + CHECK_COLOR(GREY) + CHECK_COLOR(BLACK) + #undef CHECK_COLOR + else if (p == "flicker") + { + config.flicker = true; + plugin_enable(out, true); + } + else if (p.size() >= 3 && p.substr(0, 3) == "aaa") + { + aaaaa_set_tile_hook.toggle(); + } + else if (p == "shift") + { + shift_set_tile_hook.toggle(); + } + else if (p == "disable") + { + plugin_enable(out, false); + } + else if (p != "enable") + { + out.printerr("Unrecognized option: %s\n", p.c_str()); + return CR_WRONG_USAGE; + } } return CR_OK; } @@ -75,7 +114,7 @@ DFhackCExport command_result plugin_init (color_ostream &out, std::vector |flicker|enable|disable", + "color |flicker|enable|disable|shift|aaaaa", color, false ));