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