summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorAlexander Gavrilov2012-09-22 21:00:13 +0400
committerAlexander Gavrilov2012-09-22 21:00:13 +0400
commit825d21c91a24f7f95bf05ad10b54845054a36411 (patch)
tree8cd80ba2ed1bbb16456d396c6360003508651837 /scripts
parent6f67a71e00fb319cd257f89f61af368958488664 (diff)
downloaddfhack-825d21c91a24f7f95bf05ad10b54845054a36411.tar.gz
dfhack-825d21c91a24f7f95bf05ad10b54845054a36411.tar.bz2
dfhack-825d21c91a24f7f95bf05ad10b54845054a36411.tar.xz
Add a script to wake up units and stop breaks & parties.
Diffstat (limited to 'scripts')
-rw-r--r--scripts/siren.lua109
1 files changed, 109 insertions, 0 deletions
diff --git a/scripts/siren.lua b/scripts/siren.lua
new file mode 100644
index 00000000..5371e3d7
--- /dev/null
+++ b/scripts/siren.lua
@@ -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
+)