diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 08b20e1b3..f29df78c6 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -1525,6 +1525,11 @@ Units module Computes the effective attribute value, including curse effect. +* ``dfhack.units.casteFlagSet(race, caste, flag)`` + + Returns whether the given ``df.caste_raw_flags`` flag is set for the given + race and caste. + * ``dfhack.units.getMiscTrait(unit, type[, create])`` Finds (or creates if requested) a misc trait object with the given id. diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index 9dc86b526..beaf50579 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -1816,6 +1816,7 @@ static const LuaWrapper::FunctionReg dfhack_units_module[] = { WRAPM(Units, getNemesis), WRAPM(Units, getPhysicalAttrValue), WRAPM(Units, getMentalAttrValue), + WRAPM(Units, casteFlagSet), WRAPM(Units, getMiscTrait), WRAPM(Units, getAge), WRAPM(Units, getKillCount), diff --git a/plugins/lua/zone.lua b/plugins/lua/zone.lua index b30ba3a5c..29859e419 100644 --- a/plugins/lua/zone.lua +++ b/plugins/lua/zone.lua @@ -450,7 +450,9 @@ end local function get_unit_disposition(unit) local disposition = DISPOSITION.NONE - if dfhack.units.isPet(unit) then + if dfhack.units.isInvader(unit) or dfhack.units.isOpposedToLife(unit) then + disposition = DISPOSITION.HOSTILE + elseif dfhack.units.isPet(unit) then disposition = DISPOSITION.PET elseif dfhack.units.isDomesticated(unit) then disposition = DISPOSITION.TAME @@ -458,8 +460,6 @@ local function get_unit_disposition(unit) disposition = DISPOSITION.TRAINED elseif dfhack.units.isTamable(unit) then disposition = DISPOSITION.WILD_TRAINABLE - elseif dfhack.units.isInvader(unit) or dfhack.units.isOpposedToLife(unit) then - disposition = DISPOSITION.HOSTILE else disposition = DISPOSITION.WILD_UNTRAINABLE end @@ -467,8 +467,21 @@ local function get_unit_disposition(unit) end local function get_item_disposition(item) - -- TODO - return DISPOSITION.TAME.value + local disposition = DISPOSITION.NONE + if dfhack.units.casteFlagSet(item.race, item.caste, df.caste_raw_flags.OPPOSED_TO_LIFE) then + disposition = DISPOSITION.HOSTILE + -- elseif dfhack.units.isPet(unit) then + -- disposition = DISPOSITION.PET + -- elseif dfhack.units.isDomesticated(unit) then + -- disposition = DISPOSITION.TAME + elseif dfhack.units.casteFlagSet(item.race, item.caste, df.caste_raw_flags.PET) or + dfhack.units.casteFlagSet(item.race, item.caste, df.caste_raw_flags.PET_EXOTIC) + then + disposition = DISPOSITION.WILD_TRAINABLE + else + disposition = DISPOSITION.WILD_UNTRAINABLE + end + return disposition.value end local function is_assignable_unit(unit)