Use debugfilter; remove redundant changelog entries

develop
Ryan Williams 2022-05-16 18:41:47 -07:00 committed by GitHub
parent 14afcc2b0a
commit ce34ac8f33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 295 additions and 233 deletions

@ -69,7 +69,7 @@ jobs:
- name: Download DF
run: |
sh ci/download-df.sh
- name: Build DFHack
- name: Configure DFHack
env:
CC: gcc-${{ matrix.gcc }}
CXX: g++-${{ matrix.gcc }}
@ -85,6 +85,8 @@ jobs:
-DBUILD_STONESENSE:BOOL=${{ matrix.plugins == 'all' }} \
-DBUILD_SUPPORTED:BOOL=1 \
-DCMAKE_INSTALL_PREFIX="$DF_FOLDER"
- name: Build DFHack
run: |
ninja -C build-ci install
- name: Run tests
id: run_tests

@ -1,5 +1,6 @@
ci:
autofix_prs: false
autoupdate_schedule: monthly
repos:
# shared across repos:
- repo: https://github.com/pre-commit/pre-commit-hooks

@ -81,11 +81,11 @@ def check_file(fname):
def main():
"""Check that all DFHack scripts include documentation"""
err = 0
exclude = set(['internal', 'test'])
exclude = {'.git', 'internal', 'test'}
for root, dirs, files in os.walk(SCRIPT_PATH, topdown=True):
dirs[:] = [d for d in dirs if d not in exclude]
for f in files:
if f[-3:] in {'.rb', 'lua'}:
if f.split('.')[-1] in {'rb', 'lua'}:
err += check_file(join(root, f))
return err

@ -1,7 +1,9 @@
library/xml master
scripts master
plugins/stonesense master
plugins/isoworld dfhack
depends/libzip dfhack
depends/libexpat dfhack
depends/xlsxio dfhack
depends/luacov dfhack
depends/jsoncpp-sub dfhack

@ -1,12 +1,34 @@
[
{
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"amount_left" : 150,
"amount_total" : 150,
"frequency" : "Monthly",
"id" : 0,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
[
{
"condition" : "LessThan",
"flags" :
[
"unrotten"
],
"item_type" : "FOOD",
"value" : 400
}
],
"job" : "PrepareMeal",
"meal_ingredients" : 2
},
{
"amount_left" : 10,
"amount_total" : 10,
"frequency" : "Daily",
"id" : 1,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
[
{
"condition" : "AtLeast",
@ -25,7 +47,7 @@
"unrotten",
"cookable"
],
"value" : 15
"value" : 500
},
{
"condition" : "AtMost",
@ -35,6 +57,15 @@
],
"item_type" : "FOOD",
"value" : 3500
},
{
"condition" : "AtLeast",
"flags" :
[
"unrotten"
],
"item_type" : "FOOD",
"value" : 400
}
],
"job" : "PrepareMeal",
@ -44,7 +75,7 @@
"amount_left" : 2,
"amount_total" : 2,
"frequency" : "Daily",
"id" : 1,
"id" : 2,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -81,7 +112,7 @@
"amount_left" : 2,
"amount_total" : 2,
"frequency" : "Daily",
"id" : 2,
"id" : 3,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -118,7 +149,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 3,
"id" : 4,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -139,7 +170,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 4,
"id" : 5,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -174,7 +205,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 5,
"id" : 6,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -206,7 +237,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 6,
"id" : 7,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -238,7 +269,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 7,
"id" : 8,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -260,7 +291,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 8,
"id" : 9,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -293,7 +324,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 9,
"id" : 10,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -324,7 +355,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 10,
"id" : 11,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -357,7 +388,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 11,
"id" : 12,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -397,7 +428,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 12,
"id" : 13,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -423,7 +454,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 13,
"id" : 14,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -458,7 +489,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 14,
"id" : 15,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -493,7 +524,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 15,
"id" : 16,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -528,7 +559,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 16,
"id" : 17,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -559,7 +590,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 17,
"id" : 18,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -589,7 +620,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 18,
"id" : 19,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -613,7 +644,6 @@
],
"item_subtype" : "ITEM_TOOL_LARGE_POT",
"item_type" : "TOOL",
"material" : "INORGANIC",
"value" : 25
}
],
@ -625,7 +655,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 19,
"id" : 20,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -649,7 +679,6 @@
],
"item_subtype" : "ITEM_TOOL_JUG",
"item_type" : "TOOL",
"material" : "INORGANIC",
"value" : 10
}
],
@ -661,7 +690,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 20,
"id" : 21,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -690,7 +719,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 21,
"id" : 22,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -718,7 +747,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 22,
"id" : 23,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -746,7 +775,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 23,
"id" : 24,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -776,7 +805,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 24,
"id" : 25,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -806,7 +835,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 25,
"id" : 26,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -835,7 +864,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 26,
"id" : 27,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -866,7 +895,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 27,
"id" : 28,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -902,7 +931,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 28,
"id" : 29,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -938,7 +967,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 29,
"id" : 30,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -974,7 +1003,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 30,
"id" : 31,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -993,7 +1022,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 31,
"id" : 32,
"is_active" : false,
"is_validated" : true,
"item_conditions" :
@ -1019,7 +1048,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 32,
"id" : 33,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -1041,7 +1070,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 33,
"id" : 34,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -1067,7 +1096,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 34,
"id" : 35,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -1093,7 +1122,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 35,
"id" : 36,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -1119,7 +1148,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 36,
"id" : 37,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -1152,7 +1181,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 37,
"id" : 38,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -1191,7 +1220,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 38,
"id" : 39,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -1225,7 +1254,7 @@
"amount_left" : 4,
"amount_total" : 4,
"frequency" : "Daily",
"id" : 39,
"id" : 40,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -1248,7 +1277,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 40,
"id" : 41,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -1272,7 +1301,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 41,
"id" : 42,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -1306,7 +1335,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 42,
"id" : 43,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -1335,7 +1364,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 43,
"id" : 44,
"is_active" : false,
"is_validated" : false,
"item_conditions" :
@ -1364,7 +1393,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 44,
"id" : 45,
"is_active" : false,
"is_validated" : true,
"item_conditions" :
@ -1395,7 +1424,7 @@
"amount_left" : 1,
"amount_total" : 1,
"frequency" : "Daily",
"id" : 45,
"id" : 46,
"is_active" : false,
"is_validated" : false,
"item_conditions" :

@ -12,10 +12,11 @@ endif()
add_subdirectory(tthread)
option(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" OFF)
option(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" OFF)
option(JSONCPP_BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." OFF)
option(JSONCPP_BUILD_OBJECT_LIBS "Build jsoncpp_lib as a object library." OFF)
option(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" OFF)
add_subdirectory(jsoncpp-sub EXCLUDE_FROM_ALL)
if(UNIX)
set_target_properties(jsoncpp_lib_static PROPERTIES COMPILE_FLAGS "-Wno-deprecated-declarations")
endif()
# build clsocket static and only as a dependency. Setting those options here overrides its own default settings.
option(CLSOCKET_SHARED "Build clsocket lib as shared." OFF)
option(CLSOCKET_DEP_ONLY "Build for use inside other CMake projects as dependency." ON)
@ -37,6 +38,7 @@ if(UNIX)
set_target_properties(expat PROPERTIES COMPILE_FLAGS "-Wno-maybe-uninitialized")
endif()
set(CMAKE_REQUIRED_QUIET ON)
set(LIBZIP_BUILD_DOC OFF CACHE BOOL "")
set(LIBZIP_BUILD_EXAMPLES OFF CACHE BOOL "")
set(LIBZIP_BUILD_REGRESS OFF CACHE BOOL "")

@ -1 +1 @@
Subproject commit ddabf50f72cf369bf652a95c4d9fe31a1865a781
Subproject commit ba5eac54136064af94ab4a923ac110d7534d4f83

@ -1 +1 @@
Subproject commit 3c0f2e86ce4e7a3a3b30e765087d02a68bba7e6f
Subproject commit 3e877cbb3c9bc8f22946053e70490d2e5431f4d5

@ -1 +1 @@
Subproject commit da0d18ae59ef2699013316b703cdc93809414c93
Subproject commit 081249cceb59adc857a72d67e60c32047680f787

@ -395,7 +395,7 @@ LUA_API size_t lua_rawlen (lua_State *L, int idx) {
case LUA_TSHRSTR: return tsvalue(o)->shrlen;
case LUA_TLNGSTR: return tsvalue(o)->u.lnglen;
case LUA_TUSERDATA: return uvalue(o)->len;
case LUA_TTABLE: return luaH_getn(hvalue(o));
case LUA_TTABLE: return size_t(luaH_getn(hvalue(o)));
default: return 0;
}
}

@ -1 +1 @@
Subproject commit 87d6ae018cb8d288d854f632e9d8d959d75d7db4
Subproject commit 99d06827848583232dd77afb34cd7ab589567086

@ -1 +1 @@
Subproject commit 4056226fe0df6bff4593ee2353cca07c2b7f327e
Subproject commit ab8fd7f3e9df457e8bc1b5cb31b78d57df0ac5a4

@ -32,6 +32,7 @@ billw2012 billw2012
BrickViking brickviking
brndd brndd burneddi
Caldfir caldfir
Cameron Ewell Ozzatron
Carter Bray Qartar
Chris Dombroski cdombroski
Chris Parsons chrismdp

@ -1015,7 +1015,7 @@ Fortress mode
``dfhack.gui.recenterViewscreen([zoom])``
Recenter the view on a position using a specific zoom type. If no position is given,
recenter on ``df.global.cursor``. Zoom types are ``df.report_zoom_type`` (0 = Generic, 1 = Item, 2 = Unit),
recenter on ``df.global.cursor``. Zoom types are ``df.report_zoom_type`` (see: `enum definition <https://github.com/DFHack/df-structures/blob/master/df.announcements.xml#L438>`_),
where ``Generic`` skips recentering and enforces valid view bounds (the same as x = -30000,) ``Item`` brings
the position onscreen without centering, and ``Unit`` centers the screen on the position. Default zoom type is Item.
@ -1088,15 +1088,14 @@ Announcements
Uses the type to look up options from announcements.txt, and calls the above
operations accordingly. The units are used to call ``addCombatReportAuto``.
* ``dfhack.gui.autoDFAnnouncement(report,text[,log_failures])``
``dfhack.gui.autoDFAnnouncement(type,pos,text,color[,is_bright,unit1,unit2,is_sparring,log_failures])``
* ``dfhack.gui.autoDFAnnouncement(report,text)``
``dfhack.gui.autoDFAnnouncement(type,pos,text,color[,is_bright,unit1,unit2,is_sparring])``
Takes a ``df.report_init`` (see: `structure definition <https://github.com/DFHack/df-structures/blob/master/df.announcements.xml#L451>`_)
and a string and processes them just like DF does. Sometimes this means the announcement won't occur.
Set ``log_failures`` to ``true`` to log the reason why to the dfhack console (e.g., unrevealed map or wrong gamemode.)
Can also be built from parameters instead of a ``report_init``. Setting ``is_sparring`` to ``true`` means the report
will be added to sparring logs (if applicable) rather than hunting or combat. Text uses ``&`` as an escape character, with ``&r`` being a newline,
``&&`` being just ``&``, and any other combination causing neither character to display.
will be added to sparring logs (if applicable) rather than hunting or combat. Text is parsed using ``&`` as an escape character, with ``&r``
being a newline, ``&&`` being just ``&``, and any other combination causing neither character to display.
Other
~~~~~

@ -10,6 +10,14 @@ work (e.g. links from the `changelog`).
:local:
:depth: 1
.. _devel/unforbidall:
devel/unforbidall
=================
Replaced by the `unforbid` script. Run ``unforbid all --quiet`` to match the
behavior of the original ``devel/unforbidall`` script.
.. _digfort:
digfort

@ -40,15 +40,14 @@ changelog.txt uses a syntax similar to RST, with a few special sequences:
## Fixes
## Misc Improvements
- `dfhack-examples-guide`: refine food preparation orders and fix conditions for making jugs and pots in the ``basic`` manager orders
## Documentation
- ``Lua API.rst``: added ``autoDFAnnouncement``, ``pauseRecenter``, ``recenterViewscreen``
## API
- add functions reverse-engineered from announcement code: ``Gui::parseReportString``, ``Gui::autoDFAnnouncement``, ``Gui::pauseRecenter``, ``Gui::recenterViewscreen``
## Lua
- ``dfhack.gui``: Lua wrappers for functions reverse-engineered from announcement code: ``autoDFAnnouncement``, ``pauseRecenter``, ``recenterViewscreen``
# 0.47.05-r5

@ -415,10 +415,10 @@ if(APPLE)
set_target_properties(dfhack PROPERTIES SOVERSION 1.0.0)
endif()
target_link_libraries(dfhack protobuf-lite clsocket lua jsoncpp_lib_static dfhack-version ${PROJECT_LIBS})
target_link_libraries(dfhack protobuf-lite clsocket lua jsoncpp_static dfhack-version ${PROJECT_LIBS})
set_target_properties(dfhack PROPERTIES INTERFACE_LINK_LIBRARIES "")
target_link_libraries(dfhack-client protobuf-lite clsocket jsoncpp_lib_static)
target_link_libraries(dfhack-client protobuf-lite clsocket jsoncpp_static)
target_link_libraries(dfhack-run dfhack-client)
if(APPLE)

@ -198,7 +198,7 @@ DebugCategory::cstring_ref DebugCategory::plugin() const noexcept
//! standards only provide runtime checks if an atomic type is lock free
struct failIfEnumAtomicIsNotLockFree {
failIfEnumAtomicIsNotLockFree() {
std::atomic<DebugCategory::level> test;
std::atomic<DebugCategory::level> test(DebugCategory::LINFO);
if (test.is_lock_free())
return;
std::cerr << __FILE__ << ':' << __LINE__

@ -1509,23 +1509,19 @@ static const LuaWrapper::FunctionReg dfhack_gui_module[] = {
static int gui_autoDFAnnouncement(lua_State *state)
{
int rv;
bool rv;
df::report_init *r = Lua::GetDFObject<df::report_init>(state, 1);
if (r)
{
std::string message = luaL_checkstring(state, 2);
if (lua_gettop(state) >= 3)
rv = Gui::autoDFAnnouncement(*r, message, lua_toboolean(state, 3));
else
rv = Gui::autoDFAnnouncement(*r, message);
}
else
{
df::coord pos;
int color = 0; //initialize these to prevent warning
bool bright = false, is_sparring = false, log_failures = false;
bool bright = false, is_sparring = false;
df::unit *unit1 = NULL, *unit2 = NULL;
auto type = (df::announcement_type)lua_tointeger(state, 1);
@ -1535,8 +1531,6 @@ static int gui_autoDFAnnouncement(lua_State *state)
switch (lua_gettop(state))
{
default:
case 9:
log_failures = lua_toboolean(state, 9);
case 8:
is_sparring = lua_toboolean(state, 8);
case 7:
@ -1554,9 +1548,6 @@ static int gui_autoDFAnnouncement(lua_State *state)
switch (lua_gettop(state))
{ // Use the defaults in Gui.h
default:
case 9:
rv = Gui::autoDFAnnouncement(type, pos, message, color, bright, unit1, unit2, is_sparring, log_failures);
break;
case 8:
rv = Gui::autoDFAnnouncement(type, pos, message, color, bright, unit1, unit2, is_sparring);
break;
@ -1577,7 +1568,7 @@ static int gui_autoDFAnnouncement(lua_State *state)
}
}
lua_pushinteger(state, rv);
lua_pushboolean(state, rv);
return 1;
}

@ -168,32 +168,58 @@ std::string to_search_normalized(const std::string &str)
return result;
}
bool word_wrap(std::vector<std::string> *out, const std::string &str, size_t line_length)
bool word_wrap(std::vector<std::string> *out, const std::string &str,
size_t line_length, bool collapse_whitespace)
{
out->clear();
std::istringstream input(str);
std::string out_line;
std::string word;
if (input >> word)
if (line_length == 0)
line_length = SIZE_MAX;
std::string line;
size_t break_pos = 0;
for (auto &c : str)
{
out_line += word;
// size_t remaining = line_length - std::min(line_length, word.length());
while (input >> word)
if (c == '\n')
{
if (out_line.length() + word.length() + 1 <= line_length)
out->push_back(line);
line.clear();
break_pos = 0;
continue;
}
if (isspace(c))
{
out_line += ' ';
out_line += word;
if (break_pos == line.length() && collapse_whitespace)
continue;
line.push_back(collapse_whitespace ? ' ' : c);
break_pos = line.length();
}
else {
line.push_back(c);
}
if (line.length() > line_length)
{
if (break_pos > 0)
{
// Break before last space, and skip that space
out->push_back(line.substr(0, break_pos - 1));
}
else
{
out->push_back(out_line);
out_line = word;
// Single word is too long, just break it
out->push_back(line.substr(0, line_length));
break_pos = line_length;
}
line = line.substr(break_pos);
break_pos = 0;
}
if (out_line.length())
out->push_back(out_line);
}
if (line.length())
out->push_back(line);
return true;
}

@ -326,7 +326,7 @@ public:
DFHack::DebugCategory::LDEBUG, ## __VA_ARGS__)
/*!
* Open a line for error level debug output if enabled
* Open a line for info level debug output if enabled
*
* Important debug messages when some rarely changed state changes. Example
* would be when a debug category filtering level changes.

@ -391,7 +391,8 @@ DFHACK_EXPORT std::string to_search_normalized(const std::string &str);
DFHACK_EXPORT bool word_wrap(std::vector<std::string> *out,
const std::string &str,
size_t line_length = 80);
size_t line_length = 80,
bool collapse_whitespace = false);
inline bool bits_match(unsigned required, unsigned ok, unsigned mask)
{

@ -129,9 +129,9 @@ namespace DFHack
DFHACK_EXPORT void showAutoAnnouncement(df::announcement_type type, df::coord pos, std::string message, int color = 7, bool bright = true, df::unit *unit1 = NULL, df::unit *unit2 = NULL);
// Process an announcement exactly like DF would, which might result in no announcement
DFHACK_EXPORT int autoDFAnnouncement(df::report_init r, std::string message);
DFHACK_EXPORT int autoDFAnnouncement(df::report_init r, std::string message, bool log_failures);
DFHACK_EXPORT int autoDFAnnouncement(df::announcement_type type, df::coord pos, std::string message, int color = 7, bool bright = true, df::unit *unit1 = NULL, df::unit *unit2 = NULL, bool is_sparring = false, bool log_failures = false);
DFHACK_EXPORT bool autoDFAnnouncement(df::report_init r, std::string message);
DFHACK_EXPORT bool autoDFAnnouncement(df::announcement_type type, df::coord pos, std::string message, int color = 7, bool bright = true,
df::unit *unit1 = NULL, df::unit *unit2 = NULL, bool is_sparring = false);
/*
* Cursor and window coords

@ -37,6 +37,7 @@ using namespace std;
#include "Error.h"
#include "ModuleFactory.h"
#include "Core.h"
#include "Debug.h"
#include "PluginManager.h"
#include "MiscUtils.h"
using namespace DFHack;
@ -112,6 +113,11 @@ using namespace DFHack;
#include "df/viewscreen_workshop_profilest.h"
#include "df/world.h"
namespace DFHack
{
DBG_DECLARE(core, gui, DebugCategory::LINFO);
}
using namespace df::enums;
using df::global::gamemode;
@ -1707,22 +1713,28 @@ void Gui::showAutoAnnouncement(
addCombatReportAuto(unit2, flags, id);
}
int Gui::autoDFAnnouncement(df::report_init r, string message)
bool Gui::autoDFAnnouncement(df::report_init r, string message)
{ // Reverse-engineered from DF announcement code
if (!world->unk_26a9a8) // TODO: world->show_announcements
return 1;
if (!world->allow_announcements)
{
DEBUG(gui).print("Skipped announcement because world->allow_announcements is false:\n%s\n", message.c_str());
return false;
}
df::announcement_flags a_flags;
if (is_valid_enum_item(r.type))
a_flags = df::global::d_init->announcements.flags[r.type];
else
return 2;
{
WARN(gui).print("Invalid announcement type:\n%s\n", message.c_str());
return false;
}
if (message.empty())
{
Core::printerr("Empty announcement %u\n", r.type); // DF would print this to errorlog.txt
return 3;
return false;
}
// Check if the announcement will actually be announced
@ -1737,28 +1749,41 @@ int Gui::autoDFAnnouncement(df::report_init r, string message)
if ((world->units.active.empty() || (r.unit1 != world->units.active[0] && r.unit2 != world->units.active[0])) &&
((Maps::getTileDesignation(r.pos)->whole & 0x10) == 0x0)) // Adventure mode uses this bit to determine current visibility
{
return 4;
DEBUG(gui).print("Adventure mode announcement not heard:\n%s\n", message.c_str());
return false;
}
}
}
else
{ // Dwarf mode (or arena?)
if ((r.unit1 != NULL || r.unit2 != NULL) && (r.unit1 == NULL || Units::isHidden(r.unit1)) && (r.unit2 == NULL || Units::isHidden(r.unit2)))
return 5;
{
DEBUG(gui).print("Dwarf mode announcement not heard:\n%s\n", message.c_str());
return false;
}
if (!a_flags.bits.D_DISPLAY)
{
if (a_flags.bits.UNIT_COMBAT_REPORT)
{
if (r.unit1 == NULL && r.unit2 == NULL)
return 6;
{
DEBUG(gui).print("Skipped UNIT_COMBAT_REPORT because it has no units:\n%s\n", message.c_str());
return false;
}
}
else
{
if (!a_flags.bits.UNIT_COMBAT_REPORT_ALL_ACTIVE)
return 7;
if (!recent_report_any(r.unit1) && !recent_report_any(r.unit2))
return 8;
{
DEBUG(gui).print("Skipped announcement not enabled for this game mode:\n%s\n", message.c_str());
return false;
}
else if (!recent_report_any(r.unit1) && !recent_report_any(r.unit2))
{
DEBUG(gui).print("Skipped UNIT_COMBAT_REPORT_ALL_ACTIVE because there's no active report:\n%s\n", message.c_str());
return false;
}
}
}
}
@ -1774,7 +1799,10 @@ int Gui::autoDFAnnouncement(df::report_init r, string message)
parseReportString(results, message, line_length);
if (results.empty())
return 9;
{
DEBUG(gui).print("Skipped announcement because it was empty after parsing:\n%s\n", message.c_str());
return false;
}
// Check for repeat report
int32_t repeat_count = check_repeat_report(results);
@ -1785,7 +1813,8 @@ int Gui::autoDFAnnouncement(df::report_init r, string message)
world->status.display_timer = r.display_timer;
Gui::writeToGamelog("x" + to_string(repeat_count + 1));
}
return 0;
DEBUG(gui).print("Announcement succeeded as repeat:\n%s\n", message.c_str());
return true;
}
bool success = false; // only print to gamelog if report was used
@ -1864,66 +1893,25 @@ int Gui::autoDFAnnouncement(df::report_init r, string message)
delete_old_reports();
if (/*debug_gamelog &&*/ success)
if (/*debug_gamelog &&*/ success) // TODO: Add debug_gamelog to globals?
{
DEBUG(gui).print("Announcement succeeded and printed to gamelog.txt:\n%s\n", message.c_str());
Gui::writeToGamelog(message);
else if (success)
return 10;
else
return 11;
return 0;
}
int Gui::autoDFAnnouncement(df::report_init r, string message, bool log_failures)
{ // Prints info about failed announcements to DFHack console if log_failures is true
int rv = autoDFAnnouncement(r, message);
if (log_failures)
/*else if (success)
{
switch (rv)
DEBUG(gui).print("Announcement succeeded but skipped printing to gamelog.txt because debug_gamelog is false:\n%s\n", message.c_str());
}*/
else
{
case 0:
break; // success
case 1:
Core::print("Skipped an announcement because world->show_announcements is false:\n%s\n", message.c_str());
break;
case 2:
Core::printerr("Invalid announcement type!\n");
break;
case 3:
break; // empty announcement, already handled
case 4:
Core::print("An adventure announcement occured, but nobody heard:\n%s\n", message.c_str());
break;
case 5:
Core::print("An announcement occured, but nobody heard:\n%s\n", message.c_str());
break;
case 6:
Core::print("Skipped a UNIT_COMBAT_REPORT because it has no units:\n%s\n", message.c_str());
break;
case 7:
Core::print("Skipped an announcement not enabled for this game mode:\n%s\n", message.c_str());
break;
case 8:
Core::print("Skipped an announcement because there's no active report:\n%s\n", message.c_str());
break;
case 9:
Core::print("Skipped an announcement because it was empty after parsing:\n%s\n", message.c_str());
break;
case 10:
Core::print("Report added but skipped printing to gamelog.txt because debug_gamelog is false.\n");
break;
case 11:
Core::print("Report added but didn't qualify to be displayed anywhere:\n%s\n", message.c_str());
break;
default:
Core::printerr("autoDFAnnouncement: Unexpected return value!\n");
DEBUG(gui).print("Announcement succeeded internally but didn't qualify to be displayed anywhere:\n%s\n", message.c_str());
}
}
return rv;
return true;
}
int Gui::autoDFAnnouncement(df::announcement_type type, df::coord pos, std::string message, int color, bool bright, df::unit *unit1, df::unit *unit2, bool is_sparring, bool log_failures)
bool Gui::autoDFAnnouncement(df::announcement_type type, df::coord pos, std::string message, int color,
bool bright, df::unit *unit1, df::unit *unit2, bool is_sparring)
{
auto r = df::report_init();
r.type = type;
@ -1937,7 +1925,7 @@ int Gui::autoDFAnnouncement(df::announcement_type type, df::coord pos, std::stri
if (Maps::isValidTilePos(pos))
r.zoom_type = report_zoom_type::Unit;
return autoDFAnnouncement(r, message, log_failures);
return autoDFAnnouncement(r, message);
}
df::viewscreen *Gui::getCurViewscreen(bool skip_dismissed)

@ -1 +1 @@
Subproject commit 7ec5d86996269df5e01d64ea5bae67d0c29afd77
Subproject commit 59075f42bbc77c354b5f815c5c1cce5bf48e76a5

@ -87,7 +87,7 @@ if(BUILD_SUPPORTED)
dfhack_plugin(autoclothing autoclothing.cpp)
dfhack_plugin(autodump autodump.cpp)
dfhack_plugin(autofarm autofarm.cpp)
dfhack_plugin(autogems autogems.cpp LINK_LIBRARIES jsoncpp_lib_static)
dfhack_plugin(autogems autogems.cpp LINK_LIBRARIES jsoncpp_static)
dfhack_plugin(autohauler autohauler.cpp)
dfhack_plugin(autolabor autolabor.cpp)
dfhack_plugin(automaterial automaterial.cpp LINK_LIBRARIES lua)
@ -109,7 +109,7 @@ if(BUILD_SUPPORTED)
dfhack_plugin(cursecheck cursecheck.cpp)
dfhack_plugin(cxxrandom cxxrandom.cpp LINK_LIBRARIES lua)
dfhack_plugin(deramp deramp.cpp)
dfhack_plugin(debug debug.cpp LINK_LIBRARIES jsoncpp_lib_static)
dfhack_plugin(debug debug.cpp LINK_LIBRARIES jsoncpp_static)
dfhack_plugin(dig dig.cpp)
dfhack_plugin(dig-now dig-now.cpp LINK_LIBRARIES lua)
dfhack_plugin(digFlood digFlood.cpp)
@ -143,7 +143,7 @@ if(BUILD_SUPPORTED)
dfhack_plugin(mode mode.cpp)
dfhack_plugin(mousequery mousequery.cpp)
dfhack_plugin(nestboxes nestboxes.cpp)
dfhack_plugin(orders orders.cpp LINK_LIBRARIES jsoncpp_lib_static)
dfhack_plugin(orders orders.cpp LINK_LIBRARIES jsoncpp_static)
dfhack_plugin(pathable pathable.cpp LINK_LIBRARIES lua)
dfhack_plugin(petcapRemover petcapRemover.cpp)
dfhack_plugin(plants plants.cpp)

@ -873,7 +873,7 @@ static void assign_labor(unit_labor::unit_labor labor,
}
int pool = labor_infos[labor].talent_pool();
if (pool < 200 && candidates.size() > 1 && abs(pool) < candidates.size())
if (pool < 200 && candidates.size() > 1 && size_t(abs(pool)) < candidates.size())
{
// Sort in descending order
std::sort(candidates.begin(), candidates.end(), [&](const int lhs, const int rhs) -> bool {

@ -1,23 +1,25 @@
//command-prompt a one line command entry at the top of the screen for quick commands
// command-prompt: A one-line command entry at the top of the screen for quick commands
#include "Core.h"
#include <ColorText.h>
#include <Console.h>
#include <Export.h>
#include <MiscUtils.h>
#include <PluginManager.h>
#include <ColorText.h>
#include <modules/Screen.h>
#include <modules/Gui.h>
#include <modules/Screen.h>
#include <set>
#include <list>
#include <set>
#include <string>
#include <utility>
#include <vector>
#include "df/enabler.h"
#include "df/graphic.h"
#include "df/interface_key.h"
#include "df/ui.h"
#include "df/graphic.h"
#include "df/enabler.h"
using namespace DFHack;
using namespace df::enums;
@ -36,7 +38,9 @@ class prompt_ostream:public buffered_color_ostream
protected:
void flush_proxy();
public:
prompt_ostream(viewscreen_commandpromptst* parent):parent_(parent){}
prompt_ostream(viewscreen_commandpromptst* parent)
: parent_(parent)
{}
bool empty() { return buffer.empty(); }
};
class viewscreen_commandpromptst : public dfhack_viewscreen {
@ -57,7 +61,8 @@ public:
df::plant* getSelectedPlant() { return Gui::getAnyPlant(parent); }
std::string getFocusString() { return "commandprompt"; }
viewscreen_commandpromptst(std::string entry):submitted(false), is_response(false)
viewscreen_commandpromptst(std::string entry)
: submitted(false), is_response(false)
{
show_fps = gps->display_frames;
gps->display_frames = 0;
@ -156,12 +161,18 @@ void viewscreen_commandpromptst::render()
parent->render();
if (is_response)
{
auto it=responses.begin();
for(int i=0;i<dim.y && it!=responses.end();i++,it++)
int y = 0;
for (auto &response : responses)
{
Screen::fillRect(Screen::Pen(' ', 7, 0),0,i,dim.x,i);
std::string cur_line=it->second;
Screen::paintString(Screen::Pen(' ',it->first,0),0,i,cur_line.substr(0,cur_line.size()-1));
std::vector<std::string> lines;
word_wrap(&lines, response.second, dim.x);
for (auto &line : lines)
{
Screen::fillRect(Screen::Pen(' ', 7, 0), 0, y, dim.x, y);
Screen::paintString(Screen::Pen(' ', response.first, 0), 0, y, line);
if (++y >= dim.y)
return;
}
}
}
else
@ -170,7 +181,7 @@ void viewscreen_commandpromptst::render()
Screen::fillRect(Screen::Pen(' ', 7, 0), 0, 0, dim.x, 0);
Screen::paintString(Screen::Pen(' ', 7, 0), 0, 0, "[DFHack]#");
std::string cursor = (frame < enabler->gfps / 2) ? "_" : " ";
if(cursor_pos < (dim.x - 10))
if (cursor_pos < dim.x - 10)
{
Screen::paintString(Screen::Pen(' ', 7, 0), 10, 0, entry);
if (int16_t(entry.size()) > dim.x - 10)
@ -333,8 +344,10 @@ bool hotkey_allow_all(df::viewscreen *top)
DFhackCExport command_result plugin_init(color_ostream &out, std::vector <PluginCommand> &commands)
{
commands.push_back(PluginCommand(
"command-prompt","Shows a command prompt on window.",show_prompt,hotkey_allow_all,
"command-prompt [entry] - shows a cmd prompt in df window. Entry is used for default prefix (e.g. ':lua')"
"command-prompt", "Shows a command prompt on window.",
show_prompt, hotkey_allow_all,
"command-prompt [entry] - shows a cmd prompt in df window."
" Entry is used for default prefix (e.g. ':lua')"
));
return CR_OK;
}

@ -1 +1 @@
Subproject commit e3c49ab017da2dcbeaadccd10e56d07d8f03b4ca
Subproject commit 3630c816df6962b4594d46d1ae75974c36c11629

@ -1 +1 @@
Subproject commit b808050d4a3885aa0e250e726708b2b28fe28260
Subproject commit e062237ee03a22d0d8b88b725ba3712e649f1bf6