133 lines
3.6 KiB
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
|