112 lines
2.3 KiB
Lua
112 lines
2.3 KiB
Lua
local _ENV = mkmodule('plugins.sort.units')
|
|
|
|
local utils = require('utils')
|
|
|
|
orders = orders or {}
|
|
|
|
-- Relies on NULL being auto-translated to NULL, and then sorted
|
|
orders.exists = {
|
|
key = function(unit)
|
|
return 1
|
|
end
|
|
}
|
|
|
|
orders.name = {
|
|
key = function(unit)
|
|
local name = dfhack.units.getVisibleName(unit)
|
|
if name and name.has_name then
|
|
return dfhack.TranslateName(name)
|
|
end
|
|
end,
|
|
compare = utils.compare_name
|
|
}
|
|
|
|
orders.age = {
|
|
key = function(unit)
|
|
return dfhack.units.getAge(unit)
|
|
end
|
|
}
|
|
|
|
-- This assumes that units are added to active in arrival order
|
|
orders.arrival = {
|
|
key_table = function(units)
|
|
local size = units.n or #units
|
|
local lookup={}
|
|
for i=1,size do
|
|
if units[i] then
|
|
lookup[units[i].id] = i
|
|
end
|
|
end
|
|
local idx={}
|
|
for i,v in ipairs(df.global.world.units.active) do
|
|
if lookup[v.id] then
|
|
idx[lookup[v.id]] = i
|
|
end
|
|
end
|
|
return idx
|
|
end
|
|
}
|
|
|
|
local function findRaceCaste(unit)
|
|
local rraw = df.creature_raw.find(unit.race)
|
|
return rraw, safe_index(rraw, 'caste', unit.caste)
|
|
end
|
|
|
|
orders.noble = {
|
|
key = function(unit)
|
|
local info = dfhack.units.getNoblePositions(unit)
|
|
if info then
|
|
return info[1].position.precedence
|
|
end
|
|
end
|
|
}
|
|
|
|
orders.profession = {
|
|
key = function(unit)
|
|
local cp = dfhack.units.getProfessionName(unit)
|
|
if cp and cp ~= '' then
|
|
return string.lower(cp)
|
|
end
|
|
end
|
|
}
|
|
|
|
orders.profession_class = {
|
|
key = function(unit)
|
|
local pid = unit.profession
|
|
local parent = df.profession.attrs[pid].parent
|
|
if parent >= 0 then
|
|
return parent
|
|
else
|
|
return pid
|
|
end
|
|
end
|
|
}
|
|
|
|
orders.race = {
|
|
key = function(unit)
|
|
local rraw = findRaceCaste(unit)
|
|
if rraw then
|
|
return rraw.name[0]
|
|
end
|
|
end
|
|
}
|
|
|
|
orders.squad = {
|
|
key = function(unit)
|
|
local sidx = unit.military.squad_index
|
|
if sidx >= 0 then
|
|
return sidx
|
|
end
|
|
end
|
|
}
|
|
|
|
orders.squad_position = {
|
|
key = function(unit)
|
|
local sidx = unit.military.squad_index
|
|
if sidx >= 0 then
|
|
return sidx * 1000 + unit.military.squad_position
|
|
end
|
|
end
|
|
}
|
|
|
|
return _ENV |