From 30ea58374cf7191dfb0f4ba55b90169a84dcfad5 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 19 Feb 2023 00:55:14 -0800 Subject: [PATCH 01/12] better detection of fire and magma safety --- docs/changelog.txt | 1 + library/modules/Materials.cpp | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 4eb816c29..62fb484a0 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -54,6 +54,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `autobutcher`: implemented work-around for Dwarf Fortress not setting nicknames properly, so that nicknames created in the in-game interface are detected & protect animals from being butchered properly. Note that nicknames for unnamed units are not currently saved by dwarf fortress - use ``enable fix/protect-nicks`` to fix any nicknames created/removed within dwarf fortress so they can be saved/reloaded when you reload the game. -@ `seedwatch`: fix saving and loading of seed stock targets - `autodump`: changed behaviour to only change ``dump`` and ``forbid`` flags if an item is successfully dumped. +- ``dfhack.job.isSuitableMaterial``: now properly detects lack of fire and magma safety for vulnerable materials with high melting points -@ `autochop`: generate default names for burrows with no assigned names - ``Buildings::StockpileIterator``: fix check for stockpile items on block boundary. - `tailor`: block making clothing sized for toads; make replacement clothing orders use the size of the wearer, not the size of the garment diff --git a/library/modules/Materials.cpp b/library/modules/Materials.cpp index 0854a85ce..a6141f1d8 100644 --- a/library/modules/Materials.cpp +++ b/library/modules/Materials.cpp @@ -513,8 +513,14 @@ void MaterialInfo::getMatchBits(df::job_item_flags2 &ok, df::job_item_flags2 &ma TEST(sewn_imageless, is_cloth); TEST(glass_making, MAT_FLAG(CRYSTAL_GLASSABLE)); - TEST(fire_safe, material->heat.melting_point > 11000); - TEST(magma_safe, material->heat.melting_point > 12000); + TEST(fire_safe, material->heat.melting_point > 11000 + && material->heat.boiling_point > 11000 + && material->heat.ignite_point > 11000 + && material->heat.heatdam_point > 11000); + TEST(magma_safe, material->heat.melting_point > 12000 + && material->heat.boiling_point > 12000 + && material->heat.ignite_point > 12000 + && material->heat.heatdam_point > 12000); TEST(deep_material, FLAG(inorganic, inorganic_flags::SPECIAL)); TEST(non_economic, !inorganic || !(plotinfo && vector_get(plotinfo->economic_stone, index))); From 472cab846fa60d1b798f193daee6c782a8f57900 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Feb 2023 16:58:17 -0800 Subject: [PATCH 02/12] move changelog entry to next version --- docs/changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 62fb484a0..90439bf79 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -36,6 +36,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## New Plugins ## Fixes +- ``dfhack.job.isSuitableMaterial``: now properly detects lack of fire and magma safety for vulnerable materials with high melting points ## Misc Improvements @@ -54,7 +55,6 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: - `autobutcher`: implemented work-around for Dwarf Fortress not setting nicknames properly, so that nicknames created in the in-game interface are detected & protect animals from being butchered properly. Note that nicknames for unnamed units are not currently saved by dwarf fortress - use ``enable fix/protect-nicks`` to fix any nicknames created/removed within dwarf fortress so they can be saved/reloaded when you reload the game. -@ `seedwatch`: fix saving and loading of seed stock targets - `autodump`: changed behaviour to only change ``dump`` and ``forbid`` flags if an item is successfully dumped. -- ``dfhack.job.isSuitableMaterial``: now properly detects lack of fire and magma safety for vulnerable materials with high melting points -@ `autochop`: generate default names for burrows with no assigned names - ``Buildings::StockpileIterator``: fix check for stockpile items on block boundary. - `tailor`: block making clothing sized for toads; make replacement clothing orders use the size of the wearer, not the size of the garment From a684f294c5027a960831f2940e449c6ac9eeb4b6 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Feb 2023 17:05:08 -0800 Subject: [PATCH 03/12] add templated version of join_strings --- library/Core.cpp | 2 -- library/include/MiscUtils.h | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/library/Core.cpp b/library/Core.cpp index 5375daa3c..478693dbf 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -61,8 +61,6 @@ using namespace std; #include "LuaTools.h" #include "DFHackVersion.h" -#include "MiscUtils.h" - using namespace DFHack; #include "df/plotinfost.h" diff --git a/library/include/MiscUtils.h b/library/include/MiscUtils.h index c9a5f66d6..d14bdb6e9 100644 --- a/library/include/MiscUtils.h +++ b/library/include/MiscUtils.h @@ -404,6 +404,22 @@ DFHACK_EXPORT bool split_string(std::vector *out, bool squash_empty = false); DFHACK_EXPORT std::string join_strings(const std::string &separator, const std::vector &items); +template +inline std::string join_strings(const std::string &separator, T &items) { + std::stringstream ss; + + bool first = true; + for (auto &item : items) { + if (first) + first = false; + else + ss << separator; + ss << item; + } + + return ss.str(); +} + DFHACK_EXPORT std::string toUpper(const std::string &str); DFHACK_EXPORT std::string toLower(const std::string &str); DFHACK_EXPORT std::string to_search_normalized(const std::string &str); From 75b1cd748a085a698caba910d69c99a39359d05b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Wed, 22 Feb 2023 18:58:50 -0800 Subject: [PATCH 04/12] convert otherwise unused THIN_FRAME to INTERIOR_FRAME without a signature --- library/lua/gui.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/library/lua/gui.lua b/library/lua/gui.lua index 9a5038e69..7791f3685 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -916,7 +916,8 @@ end WINDOW_FRAME = make_frame('Window', true) PANEL_FRAME = make_frame('Panel', false) MEDIUM_FRAME = make_frame('Medium', false) -THIN_FRAME = make_frame('Thin', false) +INTERIOR_FRAME = make_frame('Thin', false) +INTERIOR_FRAME.signature_pen = false -- for compatibility with pre-steam code GREY_LINE_FRAME = WINDOW_FRAME From 0febce5e8f6f28119aec489025defe91fe2cd8f0 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Feb 2023 17:09:11 -0800 Subject: [PATCH 05/12] add docs --- docs/dev/Lua API.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 7ead7e374..bee602456 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4325,9 +4325,11 @@ There are the following predefined frame style tables: A frame suitable for overlay widget panels. -* ``THIN_FRAME`` +* ``INTERIOR_FRAME`` - A frame suitable for light accent elements. + A frame suitable for light interior accent elements. This frame does *not* have + a visible ``DFHack`` signature on it, so it must not be used as the most external + frame for a DFHack-owned UI. gui.widgets =========== From dafafefe112053010b6e56e675e7ccd4d4d665ed Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Feb 2023 17:11:20 -0800 Subject: [PATCH 06/12] update changelog --- docs/changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index 4eb816c29..49a218183 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -44,8 +44,10 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API ## Lua +-@ ``gui.INTERIOR_FRAME``: a panel frame style for use in highlighting off interior areas of a UI ## Removed +-@ ``gui.THIN_FRAME``: replaced by ``gui.INTERIOR_FRAME`` # 50.07-alpha2 From d7d3dcb0beae631370dc4d824fdd8ce44f561dc2 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 19 Feb 2023 23:27:16 -0800 Subject: [PATCH 07/12] keep focus strings if they are already labeled i.e. don't add a "dfhack/" prefix if the focus string already has the string "dfhack" in it --- library/modules/Gui.cpp | 7 ++++++- library/modules/Screen.cpp | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/library/modules/Gui.cpp b/library/modules/Gui.cpp index e3a7ba983..6ea0a5ff0 100644 --- a/library/modules/Gui.cpp +++ b/library/modules/Gui.cpp @@ -491,7 +491,12 @@ bool Gui::matchFocusString(std::string focus_string, df::viewscreen *top) { static void push_dfhack_focus_string(dfhack_viewscreen *vs, std::vector &focusStrings) { auto name = vs->getFocusString(); - focusStrings.push_back(name.empty() ? "dfhack" : "dfhack/" + name); + if (name.empty()) + name = "dfhack"; + else if (string::npos == name.find("dfhack/")) + name = "dfhack/" + name; + + focusStrings.push_back(name); } std::vector Gui::getFocusStrings(df::viewscreen* top) diff --git a/library/modules/Screen.cpp b/library/modules/Screen.cpp index a78a36a3f..ca0876904 100644 --- a/library/modules/Screen.cpp +++ b/library/modules/Screen.cpp @@ -877,7 +877,7 @@ void dfhack_lua_viewscreen::update_focus(lua_State *L, int idx) if (focus.empty()) focus = "lua"; - else + else if (string::npos == focus.find("lua/")) focus = "lua/"+focus; } From ab4af88c92bbd3fa5666f1c8560abfd0f05fd8c9 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 24 Feb 2023 17:21:38 -0800 Subject: [PATCH 08/12] update changelog --- docs/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.txt b/docs/changelog.txt index 4eb816c29..a3cd76aa9 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -42,6 +42,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## Documentation ## API +- Gui focus strings will no longer get the "dfhack/" prefix if the string "dfhack/" already exists in the focus string ## Lua From cfa649b4ac7646076d5d0fe6b2c7c78d2742c2c7 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Fri, 24 Feb 2023 20:47:58 -0600 Subject: [PATCH 09/12] clean up code for C++20 readiness two change: * remove use of `register` in `md5.cpp` * remove use of `using namespace std` in `Core.cpp` (which causes an ambiguous name resolution error between `byte` and `std::byte`). while there are other ways to resolve this, `using namespace std` is a code smell anyway, so eliminating it is the best option --- depends/md5/md5.cpp | 2 +- library/Core.cpp | 289 ++++++++++++++++++++++---------------------- 2 files changed, 145 insertions(+), 146 deletions(-) diff --git a/depends/md5/md5.cpp b/depends/md5/md5.cpp index 044df259e..8aa9ba38c 100644 --- a/depends/md5/md5.cpp +++ b/depends/md5/md5.cpp @@ -158,7 +158,7 @@ void MD5Final(unsigned char digest[16], MD5Context *ctx) */ void MD5Transform(uint32_t buf[4], uint32_t in[16]) { - register uint32_t a, b, c, d; + uint32_t a, b, c, d; a = buf[0]; b = buf[1]; diff --git a/library/Core.cpp b/library/Core.cpp index 5375daa3c..fd7626f17 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -35,7 +35,6 @@ distribution. #include #include #include -using namespace std; #include "Error.h" #include "MemAccess.h" @@ -99,7 +98,7 @@ using df::global::world; // FIXME: A lot of code in one file, all doing different things... there's something fishy about it. static bool parseKeySpec(std::string keyspec, int *psym, int *pmod, std::string *pfocus = NULL); -size_t loadScriptFiles(Core* core, color_ostream& out, const vector& prefix, const std::string& folder); +size_t loadScriptFiles(Core* core, color_ostream& out, const std::vector& prefix, const std::string& folder); namespace DFHack { @@ -160,9 +159,9 @@ struct CommandDepthCounter }; thread_local int CommandDepthCounter::depth = 0; -void Core::cheap_tokenise(string const& input, vector &output) +void Core::cheap_tokenise(std::string const& input, std::vector& output) { - string *cur = NULL; + std::string *cur = NULL; size_t i = 0; // Check the first non-space character @@ -234,13 +233,13 @@ void fHKthread(void * iodata) PluginManager * plug_mgr = ((IODATA*) iodata)->plug_mgr; if(plug_mgr == 0 || core == 0) { - cerr << "Hotkey thread has croaked." << endl; + std::cerr << "Hotkey thread has croaked." << std::endl; return; } bool keep_going = true; while(keep_going) { - std::string stuff = core->getHotkeyCmd(keep_going); // waits on mutex! + std::string stuff = core->getHotkeyCmd(keep_going); // waits on std::mutex! if(!stuff.empty()) { color_ostream_proxy out(core->getConsole()); @@ -256,10 +255,10 @@ void fHKthread(void * iodata) struct sortable { bool recolor; - string name; - string description; + std::string name; + std::string description; //FIXME: Nuke when MSVC stops failing at being C++11 compliant - sortable(bool recolor_,const string& name_,const string & description_): recolor(recolor_), name(name_), description(description_){}; + sortable(bool recolor_,const std::string& name_,const std::string & description_): recolor(recolor_), name(name_), description(description_){}; bool operator <(const sortable & rhs) const { if( name < rhs.name ) @@ -268,9 +267,9 @@ struct sortable }; }; -static string dfhack_version_desc() +static std::string dfhack_version_desc() { - stringstream s; + std::stringstream s; s << Version::dfhack_version() << " "; if (Version::is_release()) s << "(release)"; @@ -284,11 +283,11 @@ static string dfhack_version_desc() namespace { struct ScriptArgs { - const string *pcmd; - vector *pargs; + const std::string *pcmd; + std::vector *pargs; }; struct ScriptEnableState { - const string *pcmd; + const std::string *pcmd; bool pstate; }; } @@ -307,7 +306,7 @@ static bool init_run_script(color_ostream &out, lua_State *state, void *info) return true; } -static command_result runLuaScript(color_ostream &out, std::string name, vector &args) +static command_result runLuaScript(color_ostream &out, std::string name, std::vector &args) { ScriptArgs data; data.pcmd = &name; @@ -346,25 +345,25 @@ command_result Core::runCommand(color_ostream &out, const std::string &command) { if (!command.empty()) { - vector parts; + std::vector parts; Core::cheap_tokenise(command,parts); if(parts.size() == 0) return CR_NOT_IMPLEMENTED; - string first = parts[0]; + std::string first = parts[0]; parts.erase(parts.begin()); if (first[0] == '#') return CR_OK; - cerr << "Invoking: " << command << endl; + std::cerr << "Invoking: " << command << std::endl; return runCommand(out, first, parts); } else return CR_NOT_IMPLEMENTED; } -bool is_builtin(color_ostream &con, const string &command) { +bool is_builtin(color_ostream &con, const std::string &command) { CoreSuspender suspend; auto L = Lua::Core::State; Lua::StackUnwinder top(L); @@ -385,7 +384,7 @@ bool is_builtin(color_ostream &con, const string &command) { return lua_toboolean(L, -1); } -void get_commands(color_ostream &con, vector &commands) { +void get_commands(color_ostream &con, std::vector &commands) { CoreSuspender suspend; auto L = Lua::Core::State; Lua::StackUnwinder top(L); @@ -431,10 +430,10 @@ static bool try_autocomplete(color_ostream &con, const std::string &first, std:: return false; } -bool Core::addScriptPath(string path, bool search_before) +bool Core::addScriptPath(std::string path, bool search_before) { - lock_guard lock(script_path_mutex); - vector &vec = script_paths[search_before ? 0 : 1]; + std::lock_guard lock(script_path_mutex); + std::vector &vec = script_paths[search_before ? 0 : 1]; if (std::find(vec.begin(), vec.end(), path) != vec.end()) return false; if (!Filesystem::isdir(path)) @@ -443,13 +442,13 @@ bool Core::addScriptPath(string path, bool search_before) return true; } -bool Core::removeScriptPath(string path) +bool Core::removeScriptPath(std::string path) { - lock_guard lock(script_path_mutex); + std::lock_guard lock(script_path_mutex); bool found = false; for (int i = 0; i < 2; i++) { - vector &vec = script_paths[i]; + std::vector &vec = script_paths[i]; while (1) { auto it = std::find(vec.begin(), vec.end(), path); @@ -464,14 +463,14 @@ bool Core::removeScriptPath(string path) void Core::getScriptPaths(std::vector *dest) { - lock_guard lock(script_path_mutex); + std::lock_guard lock(script_path_mutex); dest->clear(); - string df_path = this->p->getPath() + "/"; + std::string df_path = this->p->getPath() + "/"; for (auto it = script_paths[0].begin(); it != script_paths[0].end(); ++it) dest->push_back(*it); dest->push_back(df_path + CONFIG_PATH + "scripts"); if (df::global::world && isWorldLoaded()) { - string save = World::ReadWorldFolder(); + std::string save = World::ReadWorldFolder(); if (save.size()) dest->push_back(df_path + "/save/" + save + "/scripts"); } @@ -481,13 +480,13 @@ void Core::getScriptPaths(std::vector *dest) } -string Core::findScript(string name) +std::string Core::findScript(std::string name) { - vector paths; + std::vector paths; getScriptPaths(&paths); for (auto it = paths.begin(); it != paths.end(); ++it) { - string path = *it + "/" + name; + std::string path = *it + "/" + name; if (Filesystem::isfile(path)) return path; } @@ -497,7 +496,7 @@ string Core::findScript(string name) bool loadScriptPaths(color_ostream &out, bool silent = false) { using namespace std; - string filename(CONFIG_PATH + "script-paths.txt"); + std::string filename(CONFIG_PATH + "script-paths.txt"); ifstream file(filename); if (!file) { @@ -505,7 +504,7 @@ bool loadScriptPaths(color_ostream &out, bool silent = false) out.printerr("Could not load %s\n", filename.c_str()); return false; } - string raw; + std::string raw; int line = 0; while (getline(file, raw)) { @@ -516,7 +515,7 @@ bool loadScriptPaths(color_ostream &out, bool silent = false) if (!(ss >> ch) || ch == '#') continue; ss >> ws; // discard whitespace - string path; + std::string path; getline(ss, path); if (ch == '+' || ch == '-') { @@ -565,7 +564,7 @@ static std::string sc_event_name (state_change_event id) { return "SC_UNKNOWN"; } -void help_helper(color_ostream &con, const string &entry_name) { +void help_helper(color_ostream &con, const std::string &entry_name) { CoreSuspender suspend; auto L = Lua::Core::State; Lua::StackUnwinder top(L); @@ -583,7 +582,7 @@ void help_helper(color_ostream &con, const string &entry_name) { } } -void tags_helper(color_ostream &con, const string &tag) { +void tags_helper(color_ostream &con, const std::string &tag) { CoreSuspender suspend; auto L = Lua::Core::State; Lua::StackUnwinder top(L); @@ -601,11 +600,11 @@ void tags_helper(color_ostream &con, const string &tag) { } } -void ls_helper(color_ostream &con, const vector ¶ms) { - vector filter; +void ls_helper(color_ostream &con, const std::vector ¶ms) { + std::vector filter; bool skip_tags = false; bool show_dev_commands = false; - string exclude_strs = ""; + std::string exclude_strs = ""; bool in_exclude = false; for (auto str : params) { @@ -641,7 +640,7 @@ void ls_helper(color_ostream &con, const vector ¶ms) { } } -command_result Core::runCommand(color_ostream &con, const std::string &first_, vector &parts) +command_result Core::runCommand(color_ostream &con, const std::string &first_, std::vector &parts) { std::string first = first_; CommandDepthCounter counter; @@ -717,7 +716,7 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v { if (p->size() && (*p)[0] == '-') { - if (p->find('a') != string::npos) + if (p->find('a') != std::string::npos) all = true; } } @@ -876,7 +875,7 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v } con << parts[0]; bool builtin = is_builtin(con, parts[0]); - string lua_path = findScript(parts[0] + ".lua"); + std::string lua_path = findScript(parts[0] + ".lua"); Plugin *plug = plug_mgr->getPluginByCommand(parts[0]); if (builtin) { @@ -933,31 +932,31 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v { std::vector list = ListKeyBindings(parts[1]); if (list.empty()) - con << "No bindings." << endl; + con << "No bindings." << std::endl; for (size_t i = 0; i < list.size(); i++) - con << " " << list[i] << endl; + con << " " << list[i] << std::endl; } else { - con << "Usage:" << endl - << " keybinding list " << endl - << " keybinding clear [@context]..." << endl - << " keybinding set [@context] \"cmdline\" \"cmdline\"..." << endl - << " keybinding add [@context] \"cmdline\" \"cmdline\"..." << endl - << "Later adds, and earlier items within one command have priority." << endl - << "Supported keys: [Ctrl-][Alt-][Shift-](A-Z, 0-9, F1-F12, `, or Enter)." << endl - << "Context may be used to limit the scope of the binding, by" << endl - << "requiring the current context to have a certain prefix." << endl - << "Current UI context is: " << endl - << join_strings("\n", Gui::getCurFocus(true)) << endl; + con << "Usage:" << std::endl + << " keybinding list " << std::endl + << " keybinding clear [@context]..." << std::endl + << " keybinding set [@context] \"cmdline\" \"cmdline\"..." << std::endl + << " keybinding add [@context] \"cmdline\" \"cmdline\"..." << std::endl + << "Later adds, and earlier items within one command have priority." << std::endl + << "Supported keys: [Ctrl-][Alt-][Shift-](A-Z, 0-9, F1-F12, `, or Enter)." << std::endl + << "Context may be used to limit the scope of the binding, by" << std::endl + << "requiring the current context to have a certain prefix." << std::endl + << "Current UI context is: " << std::endl + << join_strings("\n", Gui::getCurFocus(true)) << std::endl; } } else if (first == "alias") { if (parts.size() >= 3 && (parts[0] == "add" || parts[0] == "replace")) { - const string &name = parts[1]; - vector cmd(parts.begin() + 2, parts.end()); + const std::string &name = parts[1]; + std::vector cmd(parts.begin() + 2, parts.end()); if (!AddAlias(name, cmd, parts[0] == "replace")) { con.printerr("Could not add alias %s - already exists\n", name.c_str()); @@ -977,15 +976,15 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v auto aliases = ListAliases(); for (auto p : aliases) { - con << p.first << ": " << join_strings(" ", p.second) << endl; + con << p.first << ": " << join_strings(" ", p.second) << std::endl; } } else { - con << "Usage: " << endl - << " alias add|replace " << endl - << " alias delete|clear " << endl - << " alias list" << endl; + con << "Usage: " << std::endl + << " alias add|replace " << std::endl + << " alias delete|clear " << std::endl + << " alias list" << std::endl; } } else if (first == "fpause") @@ -1038,8 +1037,8 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v } else { - con << "Usage:" << endl - << " script " << endl; + con << "Usage:" << std::endl + << " script " << std::endl; return CR_WRONG_USAGE; } } @@ -1065,13 +1064,13 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v { if (parts.empty() || parts[0] == "help" || parts[0] == "?") { - con << "Usage: sc-script add|remove|list|help SC_EVENT [path-to-script] [...]" << endl; - con << "Valid event names (SC_ prefix is optional):" << endl; + con << "Usage: sc-script add|remove|list|help SC_EVENT [path-to-script] [...]" << std::endl; + con << "Valid event names (SC_ prefix is optional):" << std::endl; for (int i = SC_WORLD_LOADED; i <= SC_UNPAUSED; i++) { std::string name = sc_event_name((state_change_event)i); if (name != "SC_UNKNOWN") - con << " " << name << endl; + con << " " << name << std::endl; } return CR_OK; } @@ -1081,7 +1080,7 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v parts.push_back(""); if (parts[1].size() && sc_event_id(parts[1]) == SC_UNKNOWN) { - con << "Unrecognized event name: " << parts[1] << endl; + con << "Unrecognized event name: " << parts[1] << std::endl; return CR_WRONG_USAGE; } for (auto it = state_change_scripts.begin(); it != state_change_scripts.end(); ++it) @@ -1100,13 +1099,13 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v { if (parts.size() < 3 || (parts.size() >= 4 && parts[3] != "-save")) { - con << "Usage: sc-script add EVENT path-to-script [-save]" << endl; + con << "Usage: sc-script add EVENT path-to-script [-save]" << std::endl; return CR_WRONG_USAGE; } state_change_event evt = sc_event_id(parts[1]); if (evt == SC_UNKNOWN) { - con << "Unrecognized event: " << parts[1] << endl; + con << "Unrecognized event: " << parts[1] << std::endl; return CR_FAILURE; } bool save_specific = (parts.size() >= 4 && parts[3] == "-save"); @@ -1115,7 +1114,7 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v { if (script == *it) { - con << "Script already registered" << endl; + con << "Script already registered" << std::endl; return CR_FAILURE; } } @@ -1126,13 +1125,13 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v { if (parts.size() < 3 || (parts.size() >= 4 && parts[3] != "-save")) { - con << "Usage: sc-script remove EVENT path-to-script [-save]" << endl; + con << "Usage: sc-script remove EVENT path-to-script [-save]" << std::endl; return CR_WRONG_USAGE; } state_change_event evt = sc_event_id(parts[1]); if (evt == SC_UNKNOWN) { - con << "Unrecognized event: " << parts[1] << endl; + con << "Unrecognized event: " << parts[1] << std::endl; return CR_FAILURE; } bool save_specific = (parts.size() >= 4 && parts[3] == "-save"); @@ -1145,13 +1144,13 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v } else { - con << "Unrecognized script" << endl; + con << "Unrecognized script" << std::endl; return CR_FAILURE; } } else { - con << "Usage: sc-script add|remove|list|help SC_EVENT [path-to-script] [...]" << endl; + con << "Usage: sc-script add|remove|list|help SC_EVENT [path-to-script] [...]" << std::endl; return CR_WRONG_USAGE; } } @@ -1173,13 +1172,13 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v if (!svc) continue; - file << "// Plugin: " << plug->getName() << endl; + file << "// Plugin: " << plug->getName() << std::endl; svc->dumpMethods(file); } } else { - con << "Usage: devel/dump-rpc \"filename\"" << endl; + con << "Usage: devel/dump-rpc \"filename\"" << std::endl; return CR_WRONG_USAGE; } } @@ -1196,8 +1195,8 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v } else if (res == CR_NOT_IMPLEMENTED) { - string completed; - string filename = findScript(first + ".lua"); + std::string completed; + std::string filename = findScript(first + ".lua"); bool lua = filename != ""; if ( !lua ) { filename = findScript(first + ".rb"); @@ -1234,22 +1233,22 @@ command_result Core::runCommand(color_ostream &con, const std::string &first_, v return CR_OK; } -bool Core::loadScriptFile(color_ostream &out, string fname, bool silent) +bool Core::loadScriptFile(color_ostream &out, std::string fname, bool silent) { if(!silent) { INFO(script,out) << "Loading script: " << fname << std::endl; - cerr << "Loading script: " << fname << std::endl; + std::cerr << "Loading script: " << fname << std::endl; } - ifstream script(fname.c_str()); + std::ifstream script(fname.c_str()); if ( !script.good() ) { if(!silent) out.printerr("Error loading script: %s\n", fname.c_str()); return false; } - string command; + std::string command; while(script.good()) { - string temp; + std::string temp; getline(script,temp); bool doMore = false; if ( temp.length() > 0 ) { @@ -1333,18 +1332,18 @@ void fIOthread(void * iodata) while (true) { - string command = ""; + std::string command = ""; int ret; while ((ret = con.lineedit("[DFHack]# ",command, main_history)) == Console::RETRY); if(ret == Console::SHUTDOWN) { - cerr << "Console is shutting down properly." << endl; + std::cerr << "Console is shutting down properly." << std::endl; return; } else if(ret == Console::FAILURE) { - cerr << "Console caught an unspecified error." << endl; + std::cerr << "Console caught an unspecified error." << std::endl; continue; } else if(ret) @@ -1405,7 +1404,7 @@ Core::Core() : void Core::fatal (std::string output) { errorstate = true; - stringstream out; + std::stringstream out; out << output ; if (output[output.size() - 1] != '\n') out << '\n'; @@ -1421,7 +1420,7 @@ void Core::fatal (std::string output) out << "Check file stderr.log for details\n"; MessageBox(0,out.str().c_str(),"DFHack error!", MB_OK | MB_ICONERROR); #else - cout << "DFHack fatal error: " << out.str() << std::endl; + std::cout << "DFHack fatal error: " << out.str() << std::endl; #endif bool is_headless = bool(getenv("DFHACK_HEADLESS")); @@ -1459,16 +1458,16 @@ bool Core::Init() // this is handled as appropriate in Console-posix.cpp fprintf(stdout, "dfhack: redirecting stdout to stdout.log (again)\n"); if (!freopen("stdout.log", "w", stdout)) - cerr << "Could not redirect stdout to stdout.log" << endl; + std::cerr << "Could not redirect stdout to stdout.log" << std::endl; #endif fprintf(stderr, "dfhack: redirecting stderr to stderr.log\n"); if (!freopen("stderr.log", "w", stderr)) - cerr << "Could not redirect stderr to stderr.log" << endl; + std::cerr << "Could not redirect stderr to stderr.log" << std::endl; Filesystem::init(); - cerr << "DFHack build: " << Version::git_description() << "\n" - << "Starting with working directory: " << Filesystem::getcwd() << endl; + std::cerr << "DFHack build: " << Version::git_description() << "\n" + << "Starting with working directory: " << Filesystem::getcwd() << std::endl; // find out what we are... #ifdef LINUX_BUILD @@ -1477,7 +1476,7 @@ bool Core::Init() const char * path = "hack\\symbols.xml"; #endif auto local_vif = dts::make_unique(); - cerr << "Identifying DF version.\n"; + std::cerr << "Identifying DF version.\n"; try { local_vif->loadFile(path); @@ -1518,8 +1517,8 @@ bool Core::Init() "recompile.\n" "More details can be found in stderr.log in this folder.\n" ); - cout << msg << endl; - cerr << msg << endl; + std::cout << msg << std::endl; + std::cerr << msg << std::endl; fatal("Not a known DF version - XML version mismatch (see console or stderr.log)"); } else @@ -1529,13 +1528,13 @@ bool Core::Init() errorstate = true; return false; } - cerr << "Version: " << vinfo->getVersion() << endl; + std::cerr << "Version: " << vinfo->getVersion() << std::endl; p = std::move(local_p); // Init global object pointers df::global::InitGlobals(); - cerr << "Initializing Console.\n"; + std::cerr << "Initializing Console.\n"; // init the console. bool is_text_mode = (init && init->display.flag.is_set(init_display_flags::TEXT)); bool is_headless = bool(getenv("DFHACK_HEADLESS")); @@ -1551,29 +1550,29 @@ bool Core::Init() } else { - cerr << "endwin(): bind failed" << endl; + std::cerr << "endwin(): bind failed" << std::endl; } } else { - cerr << "Headless mode requires PRINT_MODE:TEXT" << endl; + std::cerr << "Headless mode requires PRINT_MODE:TEXT" << std::endl; } #else - cerr << "Headless mode not supported on Windows" << endl; + std::cerr << "Headless mode not supported on Windows" << std::endl; #endif } if (is_text_mode && !is_headless) { - cerr << "Console is not available. Use dfhack-run to send commands.\n"; + std::cerr << "Console is not available. Use dfhack-run to send commands.\n"; if (!is_text_mode) { - cout << "Console disabled.\n"; + std::cout << "Console disabled.\n"; } } else if(con.init(false)) - cerr << "Console is running.\n"; + std::cerr << "Console is running.\n"; else - cerr << "Console has failed to initialize!\n"; + std::cerr << "Console has failed to initialize!\n"; /* // dump offsets to a file std::ofstream dump("offsets.log"); @@ -1642,19 +1641,19 @@ bool Core::Init() return false; } - cerr << "Binding to SDL.\n"; + std::cerr << "Binding to SDL.\n"; if (!DFSDL::init(con)) { fatal("cannot bind SDL libraries"); return false; } - cerr << "Initializing textures.\n"; + std::cerr << "Initializing textures.\n"; Textures::init(con); - // create mutex for syncing with interactive tasks - cerr << "Initializing plugins.\n"; + // create std::mutex for syncing with interactive tasks + std::cerr << "Initializing plugins.\n"; // create plugin manager plug_mgr = new PluginManager(this); plug_mgr->init(); - cerr << "Starting the TCP listener.\n"; + std::cerr << "Starting the TCP listener.\n"; auto listen = ServerMain::listen(RemoteClient::GetDefaultPort()); IODATA *temp = new IODATA; temp->core = this; @@ -1662,7 +1661,7 @@ bool Core::Init() if (!is_text_mode || is_headless) { - cerr << "Starting IO thread.\n"; + std::cerr << "Starting IO thread.\n"; // create IO thread d->iothread = std::thread{fIOthread, (void*)temp}; } @@ -1672,19 +1671,19 @@ bool Core::Init() d->iothread = std::thread{fInitthread, (void*)temp}; } - cerr << "Starting DF input capture thread.\n"; + std::cerr << "Starting DF input capture thread.\n"; // set up hotkey capture d->hotkeythread = std::thread(fHKthread, (void *) temp); started = true; modstate = 0; if (!listen.get()) - cerr << "TCP listen failed.\n"; + std::cerr << "TCP listen failed.\n"; if (df::global::game) { - vector args; - const string & raw = df::global::game->command_line.original; + std::vector args; + const std::string & raw = df::global::game->command_line.original; size_t offset = 0; while (offset < raw.size()) { @@ -1698,7 +1697,7 @@ bool Core::Init() else { size_t next = raw.find(" ", offset); - if (next == string::npos) + if (next == std::string::npos) { args.push_back(raw.substr(offset)); offset = raw.size(); @@ -1712,12 +1711,12 @@ bool Core::Init() } for (auto it = args.begin(); it != args.end(); ) { - const string & first = *it; + const std::string & first = *it; if (first.length() > 0 && first[0] == '+') { - vector cmd; + std::vector cmd; for (it++; it != args.end(); it++) { - const string & arg = *it; + const std::string & arg = *it; if (arg.length() > 0 && arg[0] == '+') { break; @@ -1727,12 +1726,12 @@ bool Core::Init() if (runCommand(con, first.substr(1), cmd) != CR_OK) { - cerr << "Error running command: " << first.substr(1); + std::cerr << "Error running command: " << first.substr(1); for (auto it2 = cmd.begin(); it2 != cmd.end(); it2++) { - cerr << " \"" << *it2 << "\""; + std::cerr << " \"" << *it2 << "\""; } - cerr << "\n"; + std::cerr << "\n"; } } else @@ -1742,7 +1741,7 @@ bool Core::Init() } } - cerr << "DFHack is running.\n"; + std::cerr << "DFHack is running.\n"; onStateChange(con, SC_CORE_INITIALIZED); @@ -1761,7 +1760,7 @@ bool Core::setHotkeyCmd( std::string cmd ) /// removes the hotkey command and gives it to the caller thread std::string Core::getHotkeyCmd( bool &keep_going ) { - string returner; + std::string returner; std::unique_lock lock(HotkeyMutex); HotkeyCond.wait(lock, [this]() -> bool {return this->hotkey_set;}); if (hotkey_set == SHUTDOWN) { @@ -1871,20 +1870,20 @@ void Core::doUpdate(color_ostream &out) // if the world changes if (new_wdata != last_world_data_ptr) { - // we check for map change too + // we check for std::map change too bool had_map = isMapLoaded(); last_world_data_ptr = new_wdata; last_local_map_ptr = new_mapdata; - // and if the world is going away, we report the map change first + // and if the world is going away, we report the std::map change first if(had_map) onStateChange(out, SC_MAP_UNLOADED); - // and if the world is appearing, we report map change after that + // and if the world is appearing, we report std::map change after that onStateChange(out, new_wdata ? SC_WORLD_LOADED : SC_WORLD_UNLOADED); if(isMapLoaded()) onStateChange(out, SC_MAP_LOADED); } - // otherwise just check for map change... + // otherwise just check for std::map change... else if (new_mapdata != last_local_map_ptr) { bool had_map = isMapLoaded(); @@ -1986,22 +1985,22 @@ void getFilesWithPrefixAndSuffix(const std::string& folder, const std::string& p return; } -size_t loadScriptFiles(Core* core, color_ostream& out, const vector& prefix, const std::string& folder) { - static const string suffix = ".init"; - vector scriptFiles; +size_t loadScriptFiles(Core* core, color_ostream& out, const std::vector& prefix, const std::string& folder) { + static const std::string suffix = ".init"; + std::vector scriptFiles; for ( size_t a = 0; a < prefix.size(); a++ ) { getFilesWithPrefixAndSuffix(folder, prefix[a], ".init", scriptFiles); } std::sort(scriptFiles.begin(), scriptFiles.end(), - [&](const string &a, const string &b) { - string a_base = a.substr(0, a.size() - suffix.size()); - string b_base = b.substr(0, b.size() - suffix.size()); + [&](const std::string &a, const std::string &b) { + std::string a_base = a.substr(0, a.size() - suffix.size()); + std::string b_base = b.substr(0, b.size() - suffix.size()); return a_base < b_base; }); size_t result = 0; for ( size_t a = 0; a < scriptFiles.size(); a++ ) { result++; - string path = ""; + std::string path = ""; if (folder != ".") path = folder + "/"; core->loadScriptFile(out, path + scriptFiles[a], false); @@ -2012,10 +2011,10 @@ size_t loadScriptFiles(Core* core, color_ostream& out, const vector namespace DFHack { namespace X { typedef state_change_event Key; - typedef vector Val; - typedef pair Entry; - typedef vector EntryVector; - typedef map InitVariationTable; + typedef std::vector Val; + typedef std::pair Entry; + typedef std::vector EntryVector; + typedef std::map InitVariationTable; EntryVector computeInitVariationTable(void* none, ...) { va_list list; @@ -2030,7 +2029,7 @@ namespace DFHack { const char *v = va_arg(list, const char *); if (!v || !v[0]) break; - val.push_back(string(v)); + val.push_back(std::string(v)); } result.push_back(Entry(key,val)); } @@ -2165,7 +2164,7 @@ void Core::onStateChange(color_ostream &out, state_change_event event) if (event == SC_WORLD_LOADED && Version::is_prerelease()) { runCommand(out, "gui/prerelease-warning"); - std::cerr << "loaded map in prerelease build" << std::endl; + std::cerr << "loaded std::map in prerelease build" << std::endl; } if (event == SC_WORLD_LOADED) @@ -2425,7 +2424,7 @@ bool Core::SelectHotkey(int sym, int modifiers) if (!binding.focus.empty()) { if (!Gui::matchFocusString(binding.focus)) { std::vector focusStrings = Gui::getCurFocus(true); - DEBUG(keybinding).print("skipping keybinding due to focus string mismatch: '%s' !~ '%s'\n", + DEBUG(keybinding).print("skipping keybinding due to focus std::string mismatch: '%s' !~ '%s'\n", join_strings(", ", focusStrings).c_str(), binding.focus.c_str()); continue; } @@ -2647,8 +2646,8 @@ bool Core::RunAlias(color_ostream &out, const std::string &name, return false; } - const string &first = aliases[name][0]; - vector parts(aliases[name].begin() + 1, aliases[name].end()); + const std::string &first = aliases[name][0]; + std::vector parts(aliases[name].begin() + 1, aliases[name].end()); parts.insert(parts.end(), parameters.begin(), parameters.end()); result = runCommand(out, first, parts); return true; From 87e06cf96038fe55e3b49a2251d4c7a39e8ec893 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Sat, 25 Feb 2023 02:42:28 -0600 Subject: [PATCH 10/12] deoops --- library/Core.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/library/Core.cpp b/library/Core.cpp index fd7626f17..abd5a05f6 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -1648,7 +1648,7 @@ bool Core::Init() } std::cerr << "Initializing textures.\n"; Textures::init(con); - // create std::mutex for syncing with interactive tasks + // create mutex for syncing with interactive tasks std::cerr << "Initializing plugins.\n"; // create plugin manager plug_mgr = new PluginManager(this); @@ -1883,7 +1883,7 @@ void Core::doUpdate(color_ostream &out) if(isMapLoaded()) onStateChange(out, SC_MAP_LOADED); } - // otherwise just check for std::map change... + // otherwise just check for map change... else if (new_mapdata != last_local_map_ptr) { bool had_map = isMapLoaded(); @@ -2029,7 +2029,7 @@ namespace DFHack { const char *v = va_arg(list, const char *); if (!v || !v[0]) break; - val.push_back(std::string(v)); + val.emplace_back(v); } result.push_back(Entry(key,val)); } @@ -2164,7 +2164,7 @@ void Core::onStateChange(color_ostream &out, state_change_event event) if (event == SC_WORLD_LOADED && Version::is_prerelease()) { runCommand(out, "gui/prerelease-warning"); - std::cerr << "loaded std::map in prerelease build" << std::endl; + std::cerr << "loaded map in prerelease build" << std::endl; } if (event == SC_WORLD_LOADED) @@ -2424,7 +2424,7 @@ bool Core::SelectHotkey(int sym, int modifiers) if (!binding.focus.empty()) { if (!Gui::matchFocusString(binding.focus)) { std::vector focusStrings = Gui::getCurFocus(true); - DEBUG(keybinding).print("skipping keybinding due to focus std::string mismatch: '%s' !~ '%s'\n", + DEBUG(keybinding).print("skipping keybinding due to focus string mismatch: '%s' !~ '%s'\n", join_strings(", ", focusStrings).c_str(), binding.focus.c_str()); continue; } From 0a65c423cef63f0dc3dc17dea3e37e3135aeb47f Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Sat, 25 Feb 2023 04:07:24 -0600 Subject: [PATCH 11/12] a squirrel distracted me --- library/Core.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/Core.cpp b/library/Core.cpp index abd5a05f6..af048d9c2 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -1870,15 +1870,15 @@ void Core::doUpdate(color_ostream &out) // if the world changes if (new_wdata != last_world_data_ptr) { - // we check for std::map change too + // we check for map change too bool had_map = isMapLoaded(); last_world_data_ptr = new_wdata; last_local_map_ptr = new_mapdata; - // and if the world is going away, we report the std::map change first + // and if the world is going away, we report the map change first if(had_map) onStateChange(out, SC_MAP_UNLOADED); - // and if the world is appearing, we report std::map change after that + // and if the world is appearing, we report map change after that onStateChange(out, new_wdata ? SC_WORLD_LOADED : SC_WORLD_UNLOADED); if(isMapLoaded()) onStateChange(out, SC_MAP_LOADED); From c7f6ee57d7d4f2e567ff3cb905ab4cdd759dd472 Mon Sep 17 00:00:00 2001 From: Myk Date: Sat, 25 Feb 2023 11:00:51 -0800 Subject: [PATCH 12/12] Update library/Core.cpp --- library/Core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/Core.cpp b/library/Core.cpp index af048d9c2..3cccd15f1 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -239,7 +239,7 @@ void fHKthread(void * iodata) bool keep_going = true; while(keep_going) { - std::string stuff = core->getHotkeyCmd(keep_going); // waits on std::mutex! + std::string stuff = core->getHotkeyCmd(keep_going); // waits on mutex! if(!stuff.empty()) { color_ostream_proxy out(core->getConsole());