diff options
Diffstat (limited to 'scripts/gui/mechanisms.lua')
| -rw-r--r-- | scripts/gui/mechanisms.lua | 129 |
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) |
