modtools/transform-unit.lua
parent
49bb468a0d
commit
09b8e9d66e
@ -0,0 +1,136 @@
|
||||
--modtools/transform-unit.lua
|
||||
--author expwnent
|
||||
--based on shapechange by Putnam
|
||||
|
||||
local utils = require 'utils'
|
||||
|
||||
normalRace = normalRace or {}
|
||||
|
||||
local function transform(unit,race,caste)
|
||||
unit.enemy.normal_race = race
|
||||
unit.enemy.normal_caste = caste
|
||||
unit.enemy.were_race = race
|
||||
unit.enemy.were_caste = caste
|
||||
end
|
||||
|
||||
validArgs = validArgs or utils.invert({
|
||||
'clear',
|
||||
'help',
|
||||
'unit',
|
||||
'duration',
|
||||
'setPrevRace',
|
||||
'keepInventory',
|
||||
'race',
|
||||
'caste',
|
||||
'suppressAnnouncement',
|
||||
'untransform',
|
||||
})
|
||||
|
||||
local args = utils.processArgs({...}, validArgs)
|
||||
|
||||
if args.help then
|
||||
--print help message
|
||||
return
|
||||
end
|
||||
|
||||
if args.clear then
|
||||
normalRace = {}
|
||||
end
|
||||
|
||||
if not args.unit then
|
||||
error 'Specify a unit.'
|
||||
end
|
||||
|
||||
if not args.duration then
|
||||
args.duration = 'forever'
|
||||
end
|
||||
|
||||
local raceIndex
|
||||
local race
|
||||
local caste
|
||||
if args.untransform then
|
||||
local unit = df.unit.find(tonumber(args.unit))
|
||||
raceIndex = normalRace[args.unit].race
|
||||
race = df.creature_raw.find(raceIndex)
|
||||
caste = normalRace[args.unit].caste
|
||||
normalRace[args.unit] = nil
|
||||
else
|
||||
if not args.race or not args.caste then
|
||||
error 'Specficy a target form.'
|
||||
end
|
||||
|
||||
--find race
|
||||
for i,v in ipairs(df.global.world.raws.creatures.all) do
|
||||
if v.creature_id == args.race then
|
||||
raceIndex = i
|
||||
race = v
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not race then
|
||||
error 'Invalid race.'
|
||||
end
|
||||
|
||||
for i,v in ipairs(race.caste) do
|
||||
if v.caste_id == args.caste then
|
||||
caste = i
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not caste then
|
||||
error 'Invalid caste.'
|
||||
end
|
||||
end
|
||||
|
||||
local unit = df.unit.find(tonumber(args.unit))
|
||||
local oldRace = unit.enemy.normal_race
|
||||
local oldCaste = unit.enemy.normal_caste
|
||||
if args.setPrevRace then
|
||||
normalRace[args.unit] = {}
|
||||
normalRace[args.unit].race = oldRace
|
||||
normalRace[args.unit].caste = oldCaste
|
||||
end
|
||||
transform(unit,raceIndex,caste,args.setPrevRace)
|
||||
|
||||
local inventoryItems = {}
|
||||
|
||||
local function getInventory()
|
||||
local result = {}
|
||||
for _,item in ipairs(unit.inventory) do
|
||||
table.insert(result, item:new());
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
local function restoreInventory()
|
||||
dfhack.timeout(1, 'ticks', function()
|
||||
for _,item in ipairs(inventoryItems) do
|
||||
dfhack.items.moveToInventory(item.item, unit, item.mode, item.body_part_id)
|
||||
item:delete()
|
||||
end
|
||||
inventoryItems = {}
|
||||
end)
|
||||
end
|
||||
|
||||
if args.keepInventory then
|
||||
inventoryItems = getInventory()
|
||||
end
|
||||
|
||||
if args.keepInventory then
|
||||
restoreInventory()
|
||||
end
|
||||
if args.duration and args.duration ~= 'forever' then
|
||||
--when the timeout ticks down, transform them back
|
||||
dfhack.timeout(tonumber(args.duration), 'ticks', function()
|
||||
if args.keepInventory then
|
||||
inventoryItems = getInventory()
|
||||
end
|
||||
transform(unit,oldRace,oldCaste)
|
||||
if args.keepInventory then
|
||||
restoreInventory()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
Loading…
Reference in New Issue