Add a script to wake up units and stop breaks & parties.

develop
Alexander Gavrilov 2012-09-22 21:00:13 +04:00
parent 6f67a71e00
commit 825d21c91a
3 changed files with 118 additions and 0 deletions

@ -30,6 +30,7 @@ DFHack v0.34.11-r2 (UNRELEASED)
New scripts:
- fixnaked: removes thoughts about nakedness.
- setfps: set FPS cap at runtime, in case you want slow motion or speed-up.
- siren: wakes up units, stops breaks and parties - but causes bad thoughts.
- fix/population-cap: run after every migrant wave to prevent exceeding the cap.
- fix/stable-temp: counts items with temperature updates; does instant one-shot stable-temp.
New GUI scripts:

@ -1539,6 +1539,14 @@ setfps
Run ``setfps <number>`` to set the FPS cap at runtime, in case you want to watch
combat in slow motion or something :)
siren
=====
Wakes up sleeping units, cancels breaks and stops parties either everywhere,
or in the burrows given as arguments. In return, adds bad thoughts about
noise and tiredness. Also, the units with interrupted breaks will go on
break again a lot sooner.
growcrops
=========
Instantly grow seeds inside farming plots.

@ -0,0 +1,109 @@
-- Wakes up the sleeping, breaks up parties and stops breaks.
local utils = require 'utils'
local args = {...}
local burrows = {}
local bnames = {}
if not dfhack.isMapLoaded() then
qerror('Map is not loaded.')
end
for _,v in ipairs(args) do
local b = dfhack.burrows.findByName(v)
if not b then
qerror('Unknown burrow: '..v)
end
table.insert(bnames, v)
table.insert(burrows, b)
end
function is_in_burrows(pos)
if #burrows == 0 then
return true
end
for _,v in ipairs(burrows) do
if dfhack.burrows.isAssignedTile(v, pos) then
return true
end
end
end
function add_thought(unit, code)
for _,v in ipairs(unit.status.recent_events) do
if v.type == code then
v.age = 0
return
end
end
unit.status.recent_events:insert('#', { new = true, type = code })
end
function wake_unit(unit)
local job = unit.job.current_job
if not job or job.job_type ~= df.job_type.Sleep then
return
end
if job.completion_timer > 0 then
unit.counters.unconscious = 0
add_thought(unit, df.unit_thought_type.SleepNoiseWake)
elseif job.completion_timer < 0 then
add_thought(unit, df.unit_thought_type.Tired)
end
job.pos:assign(unit.pos)
job.completion_timer = 0
unit.path.dest:assign(unit.pos)
unit.path.path.x:resize(0)
unit.path.path.y:resize(0)
unit.path.path.z:resize(0)
unit.counters.job_counter = 0
end
function stop_break(unit)
local counter = dfhack.units.getMiscTrait(unit, df.misc_trait_type.OnBreak)
if counter then
counter.id = df.misc_trait_type.TimeSinceBreak
counter.value = 100800 - 30*1200
add_thought(unit, df.unit_thought_type.Tired)
end
end
-- Stop rest
for _,v in ipairs(df.global.world.units.active) do
local x,y,z = dfhack.units.getPosition(v)
if x and not dfhack.units.isDead(v) and is_in_burrows(xyz2pos(x,y,z)) then
wake_unit(v)
stop_break(v)
end
end
-- Stop parties
for _,v in ipairs(df.global.ui.parties) do
local pos = utils.getBuildingCenter(v.location)
if is_in_burrows(pos) then
v.timer = 0
for _, u in ipairs(v.units) do
add_thought(unit, df.unit_thought_type.Tired)
end
end
end
local place = 'the halls and tunnels'
if #bnames > 0 then
if #bnames == 1 then
place = bnames[1]
else
place = table.concat(bnames,', ',1,#bnames-1)..' and '..bnames[#bnames]
end
end
dfhack.gui.showAnnouncement(
'A loud siren sounds throughout '..place..', waking the sleeping and startling the awake.',
COLOR_BROWN, true
)