dfhack/plugins/lua/buildingplan.lua

133 lines
3.6 KiB
Lua

local _ENV = mkmodule('plugins.buildingplan')
--[[
Public native functions:
* bool isPlannableBuilding(df::building_type type, int16_t subtype, int32_t custom)
* bool isPlannedBuilding(df::building *bld)
* void addPlannedBuilding(df::building *bld)
* void doCycle()
* void scheduleCycle()
--]]
local argparse = require('argparse')
local inspector = require('plugins.buildingplan.inspectoroverlay')
local pens = require('plugins.buildingplan.pens')
local planner = require('plugins.buildingplan.planneroverlay')
require('dfhack.buildings')
local function process_args(opts, args)
if args[1] == 'help' then
opts.help = true
return
end
return argparse.processArgsGetopt(args, {
{'h', 'help', handler=function() opts.help = true end},
})
end
function parse_commandline(...)
local args, opts = {...}, {}
local positionals = process_args(opts, args)
if opts.help then
return false
end
local command = table.remove(positionals, 1)
if not command or command == 'status' then
printStatus()
elseif command == 'set' and positionals then
setSetting(positionals[1], positionals[2] == 'true')
elseif command == 'reset' then
resetFilters()
else
return false
end
return true
end
function get_num_filters(btype, subtype, custom)
local filters = dfhack.buildings.getFiltersByType({}, btype, subtype, custom)
return filters and #filters or 0
end
function get_job_item(btype, subtype, custom, index)
local filters = dfhack.buildings.getFiltersByType({}, btype, subtype, custom)
if not filters or not filters[index] then return nil end
local obj = df.job_item:new()
obj:assign(filters[index])
return obj
end
local function to_title_case(str)
str = str:gsub('(%a)([%w_]*)',
function (first, rest) return first:upper()..rest:lower() end)
str = str:gsub('_', ' ')
return str
end
function get_desc(filter)
local desc = 'Unknown'
if filter.has_tool_use and filter.has_tool_use > -1 then
desc = to_title_case(df.tool_uses[filter.has_tool_use])
elseif filter.flags2 and filter.flags2.screw then
desc = 'Screw'
elseif filter.item_type and filter.item_type > -1 then
desc = to_title_case(df.item_type[filter.item_type])
elseif filter.vector_id and filter.vector_id > -1 then
desc = to_title_case(df.job_item_vector_id[filter.vector_id])
elseif filter.flags2 and filter.flags2.building_material then
if filter.flags2.magma_safe then
desc = 'Magma-safe material'
elseif filter.flags2.fire_safe then
desc = 'Fire-safe material'
else
desc = 'Building material'
end
end
if desc:endswith('s') then
desc = desc:sub(1,-2)
end
if desc == 'Trappart' then
desc = 'Mechanism'
elseif desc == 'Wood' then
desc = 'Log'
end
return desc
end
function reload_pens()
pens.reload_pens()
end
function signal_reset()
planner.reset_counts_flag = true
inspector.reset_inspector_flag = true
end
-- for use during development to reload all buildingplan modules
function reload_modules()
-- ensure circular deps are refreshed
reload('plugins.buildingplan.pens')
reload('plugins.buildingplan')
reload('plugins.buildingplan.filterselection')
reload('plugins.buildingplan.itemselection')
reload('plugins.buildingplan.planneroverlay')
reload('plugins.buildingplan.inspectoroverlay')
reload('plugins.buildingplan')
end
OVERLAY_WIDGETS = {
planner=planner.PlannerOverlay,
inspector=inspector.InspectorOverlay,
}
return _ENV