2012-08-20 13:04:01 -06:00
|
|
|
-- Shows mechanisms linked to the current building.
|
|
|
|
|
2012-08-21 01:35:39 -06:00
|
|
|
local utils = require 'utils'
|
2012-08-20 13:04:01 -06:00
|
|
|
local gui = require 'gui'
|
|
|
|
local guidm = require 'gui.dwarfmode'
|
|
|
|
|
|
|
|
function listMechanismLinks(building)
|
|
|
|
local lst = {}
|
|
|
|
local function push(item, mode)
|
|
|
|
if item then
|
2012-08-22 12:28:52 -06:00
|
|
|
lst[#lst+1] = {
|
|
|
|
obj = item, mode = mode,
|
2012-08-24 03:49:22 -06:00
|
|
|
name = utils.getBuildingName(item)
|
2012-08-22 12:28:52 -06:00
|
|
|
}
|
2012-08-20 13:04:01 -06:00
|
|
|
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
|
|
|
|
|
2012-08-21 01:35:39 -06:00
|
|
|
MechanismList = defclass(MechanismList, guidm.MenuOverlay)
|
2012-08-20 13:04:01 -06:00
|
|
|
|
|
|
|
MechanismList.focus_path = 'mechanisms'
|
|
|
|
|
2012-09-18 10:30:25 -06:00
|
|
|
function MechanismList:init(info)
|
|
|
|
self:assign{
|
2012-08-24 03:28:34 -06:00
|
|
|
links = {}, selected = 1
|
2012-08-20 13:04:01 -06:00
|
|
|
}
|
2012-09-18 10:30:25 -06:00
|
|
|
self:fillList(info.building)
|
2012-08-21 10:34:15 -06:00
|
|
|
end
|
|
|
|
|
2012-08-24 03:28:34 -06:00
|
|
|
function MechanismList:fillList(building)
|
2012-08-21 10:34:15 -06:00
|
|
|
local links = listMechanismLinks(building)
|
|
|
|
|
2012-08-24 03:49:22 -06:00
|
|
|
self.old_viewport = self:getViewport()
|
|
|
|
self.old_cursor = guidm.getCursorPos()
|
|
|
|
|
2012-08-21 01:35:39 -06:00
|
|
|
if #links <= 1 then
|
|
|
|
links[1].mode = 'none'
|
|
|
|
end
|
2012-08-21 10:34:15 -06:00
|
|
|
|
|
|
|
self.links = links
|
|
|
|
self.selected = 1
|
2012-08-20 13:04:01 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
local colors = {
|
2012-08-21 01:35:39 -06:00
|
|
|
self = COLOR_CYAN, none = COLOR_CYAN,
|
|
|
|
trigger = COLOR_GREEN, target = COLOR_GREEN
|
2012-08-20 13:04:01 -06:00
|
|
|
}
|
|
|
|
local icons = {
|
2012-08-21 01:35:39 -06:00
|
|
|
self = 128, none = 63, trigger = 27, target = 26
|
2012-08-20 13:04:01 -06:00
|
|
|
}
|
|
|
|
|
2012-08-21 01:35:39 -06:00
|
|
|
function MechanismList:onRenderBody(dc)
|
|
|
|
dc:clear()
|
|
|
|
dc:seek(1,1):string("Mechanism Links", COLOR_WHITE):newline()
|
2012-08-20 13:04:01 -06:00
|
|
|
|
|
|
|
for i,v in ipairs(self.links) do
|
|
|
|
local pen = { fg=colors[v.mode], bold = (i == self.selected) }
|
2012-08-21 01:35:39 -06:00
|
|
|
dc:newline(1):pen(pen):char(icons[v.mode])
|
|
|
|
dc:advance(1):string(v.name)
|
2012-08-20 13:04:01 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
local nlinks = #self.links
|
|
|
|
|
|
|
|
if nlinks <= 1 then
|
2012-08-21 01:35:39 -06:00
|
|
|
dc:newline():newline(1):string("This building has no links", COLOR_LIGHTRED)
|
2012-08-20 13:04:01 -06:00
|
|
|
end
|
|
|
|
|
2012-08-21 01:35:39 -06:00
|
|
|
dc:newline():newline(1):pen(COLOR_WHITE)
|
2012-10-02 05:25:59 -06:00
|
|
|
dc:key('LEAVESCREEN'):string(": Back, ")
|
|
|
|
dc:key('SELECT'):string(": Switch")
|
2012-08-20 13:04:01 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
function MechanismList:changeSelected(delta)
|
2012-08-20 13:59:54 -06:00
|
|
|
if #self.links <= 1 then return end
|
2012-08-20 13:04:01 -06:00
|
|
|
self.selected = 1 + (self.selected + delta - 1) % #self.links
|
2012-08-24 03:49:22 -06:00
|
|
|
self:selectBuilding(self.links[self.selected].obj)
|
2012-08-20 13:04:01 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
function MechanismList:onInput(keys)
|
2012-08-22 12:28:52 -06:00
|
|
|
if keys.SECONDSCROLL_UP then
|
2012-08-20 13:04:01 -06:00
|
|
|
self:changeSelected(-1)
|
2012-08-22 12:28:52 -06:00
|
|
|
elseif keys.SECONDSCROLL_DOWN then
|
2012-08-20 13:04:01 -06:00
|
|
|
self:changeSelected(1)
|
|
|
|
elseif keys.LEAVESCREEN then
|
2012-08-21 01:35:39 -06:00
|
|
|
self:dismiss()
|
2012-08-20 13:04:01 -06:00
|
|
|
if self.selected ~= 1 then
|
2012-08-24 03:49:22 -06:00
|
|
|
self:selectBuilding(self.links[1].obj, self.old_cursor, self.old_view)
|
2012-08-20 13:04:01 -06:00
|
|
|
end
|
2012-08-21 10:34:15 -06:00
|
|
|
elseif keys.SELECT_ALL then
|
|
|
|
if self.selected > 1 then
|
2012-08-24 03:28:34 -06:00
|
|
|
self:fillList(self.links[self.selected].obj)
|
2012-08-21 10:34:15 -06:00
|
|
|
end
|
2012-08-20 13:04:01 -06:00
|
|
|
elseif keys.SELECT then
|
|
|
|
self:dismiss()
|
2012-08-22 12:28:52 -06:00
|
|
|
elseif self:simulateViewScroll(keys) then
|
|
|
|
return
|
2012-08-20 13:04:01 -06:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-09-08 03:46:02 -06:00
|
|
|
if not string.match(dfhack.gui.getCurFocus(), '^dwarfmode/QueryBuilding/Some') then
|
2012-08-24 03:20:08 -06:00
|
|
|
qerror("This script requires the main dwarfmode view in 'q' mode")
|
2012-08-20 13:04:01 -06:00
|
|
|
end
|
|
|
|
|
2012-09-18 10:30:25 -06:00
|
|
|
local list = MechanismList{ building = df.global.world.selected_building }
|
2012-08-20 13:59:54 -06:00
|
|
|
list:show()
|
|
|
|
list:changeSelected(1)
|