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