From f2afb5c562829340daeec085f273978d2bd63c7f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 25 Nov 2023 13:46:59 -0800 Subject: [PATCH] add "agitated" and trained levels to getReadableName --- docs/changelog.txt | 1 + docs/dev/Lua API.rst | 5 +++-- library/modules/Units.cpp | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/docs/changelog.txt b/docs/changelog.txt index 17fab5301..59351dc90 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -59,6 +59,7 @@ Template for new versions: ## Fixes ## Misc Improvements +- wherever units are listed in DFHack tools, properties like "agitated" or (-trained-) are now shown ## Documentation diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 6863fc409..378f7ed68 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -1614,8 +1614,9 @@ Units module * ``dfhack.units.getReadableName(unit)`` Returns a string that includes the language name of the unit (if any), the - race of the unit, whether it is trained for war or hunting, and any - syndrome-given descriptions (such as "necromancer"). + race of the unit, whether it is trained for war or hunting, any + syndrome-given descriptions (such as "necromancer"), and the training level + (if tame). * ``dfhack.units.getStressCategory(unit)`` diff --git a/library/modules/Units.cpp b/library/modules/Units.cpp index ff36481b7..b7cb39709 100644 --- a/library/modules/Units.cpp +++ b/library/modules/Units.cpp @@ -1273,6 +1273,36 @@ static string get_caste_name(df::unit* unit) { return raw->caste[caste]->caste_name[0]; } +// must subtract 1 from animal_training_level value to index this array +static const char * training_quality_table[] = { + "trained", // Trained + "-trained-", // WellTrained + "+trained+", // SkilfullyTrained + "*trained*", // ExpertlyTrained + "\xF0trained\xF0", // (≡) ExceptionallyTrained + "\x0Ftrained\x0F" // (☼) MasterfullyTrained +}; + +static const char * getTameTag(df::unit *unit) { + int32_t level = unit->training_level; + switch (level) { + case df::animal_training_level::SemiWild: + return "semi-wild"; + case df::animal_training_level::Trained: + case df::animal_training_level::WellTrained: + case df::animal_training_level::SkilfullyTrained: + case df::animal_training_level::ExpertlyTrained: + case df::animal_training_level::ExceptionallyTrained: + case df::animal_training_level::MasterfullyTrained: + return training_quality_table[level-1]; + case df::animal_training_level::Domesticated: + return "tame"; + case df::animal_training_level::WildUntamed: + default: + return "wild"; + } +} + string Units::getReadableName(df::unit* unit) { string race_name = isBaby(unit) ? getRaceBabyName(unit) : (isChild(unit) ? getRaceChildName(unit) : get_caste_name(unit)); @@ -1282,6 +1312,8 @@ string Units::getReadableName(df::unit* unit) { race_name = "hunter " + race_name; if (isWar(unit)) race_name = "war " + race_name; + if (unit->flags4.bits.agitated_wilderness_creature) + race_name = "agitated " + race_name; string name = Translation::TranslateName(getVisibleName(unit), false); if (name.empty()) { name = race_name; @@ -1302,6 +1334,11 @@ string Units::getReadableName(df::unit* unit) { break; } } + if (isTame(unit)) { + name += " ("; + name += getTameTag(unit); + name += ")"; + } return name; }