diff --git a/NEWS b/NEWS index 73ac6bde9..c7a259674 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ DFHack Future burial: sets all unowned coffins to allow burial ("-pets" to allow pets too) fix-ster: changes fertility/sterility of animals or dwarves view-item-info: adds information and customisable descriptions to item viewscreens + warn-starving: check for starving, thirsty, or very drowsy units and pause with warning if any are found New tweaks Fixes Plugins with vmethod hooks can now be reloaded on OS X diff --git a/Readme.rst b/Readme.rst index 3870635ce..eb03ea813 100644 --- a/Readme.rst +++ b/Readme.rst @@ -2629,6 +2629,12 @@ of items. Individual descriptions can be added or overridden by a similar script ``raw/scripts/more-item-descriptions.lua``. Both work as sparse lists, so missing items simply go undescribed if not defined in the fallback. +warn-starving +============= +If any (live) units are starving, very thirsty, or very drowsy, the game will +be paused and a warning shown. Use with the ``repeat`` command for regular +checks. + ======== modtools ======== diff --git a/scripts/warn-starving.lua b/scripts/warn-starving.lua new file mode 100644 index 000000000..16748a0a2 --- /dev/null +++ b/scripts/warn-starving.lua @@ -0,0 +1,62 @@ +-- Pauses the game with a warning if a creature is starving, dehydrated, or very drowsy. +-- By Meneth32, and PeridexisErrant + +starvingUnits = starvingUnits or {} +dehydratedUnits = dehydratedUnits or {} +sleepyUnits = sleepyUnits or {} + +local units = df.global.world.units.active + +local function findRaceCaste(unit) + local rraw = df.creature_raw.find(unit.race) + return rraw, safe_index(rraw, 'caste', unit.caste) +end + +local function getSexString(sex) + local sexStr = "" + if sex==0 then sexStr=string.char(12) + elseif sex==1 then sexStr=string.char(11) + end + return string.char(40)..sexStr..string.char(41) +end + +local function nameOrSpeciesAndNumber(unit) + if unit.name.has_name then + return dfhack.TranslateName(dfhack.units.getVisibleName(unit))..' '..getSexString(unit.sex),true + else + return 'Unit #'..unit.id..' ('..df.creature_raw.find(unit.race).caste[unit.caste].caste_name[0]..' '..getSexString(unit.sex)..')',false + end +end + +local function checkVariable(var, limit, description, map, unit) + local rraw = findRaceCaste(unit) + local species = rraw.name[0] + local name = nameOrSpeciesAndNumber(unit) + if var > limit then + if not map[unit.id] then + map[unit.id] = true + return species.." "..name.." is "..description.."!" + end + else + map[unit.id] = false + end +end + +local function doCheck() + local msg + for i=#units-1, 0, -1 do + local unit = units[i] + local rraw = findRaceCaste(unit) + if rraw and not unit.flags1.dead and not dfhack.units.isOpposedToLife(unit) then + msg = checkVariable(unit.counters2.hunger_timer, 75000, 'starving', starvingUnits, unit) + msg = msg or checkVariable(unit.counters2.thirst_timer, 50000, 'dehydrated', dehydratedUnits, unit) + msg = msg or checkVariable(unit.counters2.sleepiness_timer, 150000, 'very drowsy', sleepyUnits, unit) + end + end + if msg then + df.global.pause_state = true + dfhack.gui.showPopupAnnouncement(msg, 7, true) + end +end + +doCheck()