summaryrefslogtreecommitdiff
path: root/scripts/gui/mechanisms.lua
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/gui/mechanisms.lua')
-rw-r--r--scripts/gui/mechanisms.lua129
1 files changed, 129 insertions, 0 deletions
diff --git a/scripts/gui/mechanisms.lua b/scripts/gui/mechanisms.lua
new file mode 100644
index 00000000..d1e8ec80
--- /dev/null
+++ b/scripts/gui/mechanisms.lua
@@ -0,0 +1,129 @@
+-- Shows mechanisms linked to the current building.
+
+local utils = require 'utils'
+local gui = require 'gui'
+local guidm = require 'gui.dwarfmode'
+
+function listMechanismLinks(building)
+ local lst = {}
+ local function push(item, mode)
+ if item then
+ lst[#lst+1] = {
+ obj = item, mode = mode,
+ name = utils.getBuildingName(item)
+ }
+ end
+ end
+
+ push(building, 'self')
+
+ if not df.building_actual:is_instance(building) then
+ return lst
+ end
+
+ local item, tref, tgt
+ for _,v in ipairs(building.contained_items) do
+ item = v.item
+ if df.item_trappartsst:is_instance(item) then
+ tref = dfhack.items.getGeneralRef(item, df.general_ref_type.BUILDING_TRIGGER)
+ if tref then
+ push(tref:getBuilding(), 'trigger')
+ end
+ tref = dfhack.items.getGeneralRef(item, df.general_ref_type.BUILDING_TRIGGERTARGET)
+ if tref then
+ push(tref:getBuilding(), 'target')
+ end
+ end
+ end
+
+ return lst
+end
+
+MechanismList = defclass(MechanismList, guidm.MenuOverlay)
+
+MechanismList.focus_path = 'mechanisms'
+
+function MechanismList:init(info)
+ self:assign{
+ links = {}, selected = 1
+ }
+ self:fillList(info.building)
+end
+
+function MechanismList:fillList(building)
+ local links = listMechanismLinks(building)
+
+ self.old_viewport = self:getViewport()
+ self.old_cursor = guidm.getCursorPos()
+
+ if #links <= 1 then
+ links[1].mode = 'none'
+ end
+
+ self.links = links
+ self.selected = 1
+end
+
+local colors = {
+ self = COLOR_CYAN, none = COLOR_CYAN,
+ trigger = COLOR_GREEN, target = COLOR_GREEN
+}
+local icons = {
+ self = 128, none = 63, trigger = 27, target = 26
+}
+
+function MechanismList:onRenderBody(dc)
+ dc:clear()
+ dc:seek(1,1):string("Mechanism Links", COLOR_WHITE):newline()
+
+ for i,v in ipairs(self.links) do
+ local pen = { fg=colors[v.mode], bold = (i == self.selected) }
+ dc:newline(1):pen(pen):char(icons[v.mode])
+ dc:advance(1):string(v.name)
+ end
+
+ local nlinks = #self.links
+
+ if nlinks <= 1 then
+ dc:newline():newline(1):string("This building has no links", COLOR_LIGHTRED)
+ end
+
+ dc:newline():newline(1):pen(COLOR_WHITE)
+ dc:string("Esc", COLOR_LIGHTGREEN):string(": Back, ")
+ dc:string("Enter", COLOR_LIGHTGREEN):string(": Switch")
+end
+
+function MechanismList:changeSelected(delta)
+ if #self.links <= 1 then return end
+ self.selected = 1 + (self.selected + delta - 1) % #self.links
+ self:selectBuilding(self.links[self.selected].obj)
+end
+
+function MechanismList:onInput(keys)
+ if keys.SECONDSCROLL_UP then
+ self:changeSelected(-1)
+ elseif keys.SECONDSCROLL_DOWN then
+ self:changeSelected(1)
+ elseif keys.LEAVESCREEN then
+ self:dismiss()
+ if self.selected ~= 1 then
+ self:selectBuilding(self.links[1].obj, self.old_cursor, self.old_view)
+ end
+ elseif keys.SELECT_ALL then
+ if self.selected > 1 then
+ self:fillList(self.links[self.selected].obj)
+ end
+ elseif keys.SELECT then
+ self:dismiss()
+ elseif self:simulateViewScroll(keys) then
+ return
+ end
+end
+
+if not string.match(dfhack.gui.getCurFocus(), '^dwarfmode/QueryBuilding/Some') then
+ qerror("This script requires the main dwarfmode view in 'q' mode")
+end
+
+local list = MechanismList{ building = df.global.world.selected_building }
+list:show()
+list:changeSelected(1)