203 lines
6.9 KiB
Lua
203 lines
6.9 KiB
Lua
-- Adjust all attributes of all dwarves to an ideal
|
|
-- by vjek
|
|
--[[=begin
|
|
|
|
armoks-blessing
|
|
===============
|
|
Runs the equivalent of `rejuvenate`, `elevate-physical`, `elevate-mental`, and
|
|
`brainwash` on all dwarves currently on the map. This is an extreme change,
|
|
which sets every stat to an ideal - legendary skills, great traits, and
|
|
easy-to-satisfy preferences.
|
|
|
|
Without arguments, all attributes, age & personalities are adjusted.
|
|
Arguments allow for skills to be adjusted as well.
|
|
|
|
=end]]
|
|
function rejuvenate(unit)
|
|
if unit==nil then
|
|
print ("No unit available! Aborting with extreme prejudice.")
|
|
return
|
|
end
|
|
|
|
local current_year=df.global.cur_year
|
|
local newbirthyear=current_year - 20
|
|
if unit.relations.birth_year < newbirthyear then
|
|
unit.relations.birth_year=newbirthyear
|
|
end
|
|
if unit.relations.old_year < current_year+100 then
|
|
unit.relations.old_year=current_year+100
|
|
end
|
|
|
|
end
|
|
-- ---------------------------------------------------------------------------
|
|
function brainwash_unit(unit)
|
|
if unit==nil then
|
|
print ("No unit available! Aborting with extreme prejudice.")
|
|
return
|
|
end
|
|
|
|
local profile ={75,25,25,75,25,25,25,99,25,25,25,50,75,50,25,75,75,50,75,75,25,75,75,50,75,25,50,25,75,75,75,25,75,75,25,75,25,25,75,75,25,75,75,75,25,75,75,25,25,50}
|
|
local i
|
|
|
|
for i=1, #profile do
|
|
unit.status.current_soul.personality.traits[i-1]=profile[i]
|
|
end
|
|
|
|
end
|
|
-- ---------------------------------------------------------------------------
|
|
function elevate_attributes(unit)
|
|
if unit==nil then
|
|
print ("No unit available! Aborting with extreme prejudice.")
|
|
return
|
|
end
|
|
|
|
local ok,f,t,k = pcall(pairs,unit.status.current_soul.mental_attrs)
|
|
if ok then
|
|
for k,v in f,t,k do
|
|
v.value=v.max_value
|
|
end
|
|
end
|
|
|
|
local ok,f,t,k = pcall(pairs,unit.body.physical_attrs)
|
|
if ok then
|
|
for k,v in f,t,k do
|
|
v.value=v.max_value
|
|
end
|
|
end
|
|
end
|
|
-- ---------------------------------------------------------------------------
|
|
-- this function will return the number of elements, starting at zero.
|
|
-- useful for counting things where #foo doesn't work
|
|
function count_this(to_be_counted)
|
|
local count = -1
|
|
local var1 = ""
|
|
while var1 ~= nil do
|
|
count = count + 1
|
|
var1 = (to_be_counted[count])
|
|
end
|
|
count=count-1
|
|
return count
|
|
end
|
|
-- ---------------------------------------------------------------------------
|
|
function make_legendary(skillname,unit)
|
|
local skillnamenoun,skillnum
|
|
|
|
if unit==nil then
|
|
print ("No unit available! Aborting with extreme prejudice.")
|
|
return
|
|
end
|
|
|
|
if (df.job_skill[skillname]) then
|
|
skillnamenoun = df.job_skill.attrs[df.job_skill[skillname]].caption_noun
|
|
else
|
|
print ("The skill name provided is not in the list.")
|
|
return
|
|
end
|
|
|
|
if skillnamenoun ~= nil then
|
|
utils = require 'utils'
|
|
skillnum = df.job_skill[skillname]
|
|
utils.insert_or_update(unit.status.current_soul.skills, { new = true, id = skillnum, rating = 20 }, 'id')
|
|
print (unit.name.first_name.." is now a Legendary "..skillnamenoun)
|
|
else
|
|
print ("Empty skill name noun, bailing out!")
|
|
return
|
|
end
|
|
end
|
|
-- ---------------------------------------------------------------------------
|
|
function BreathOfArmok(unit)
|
|
|
|
if unit==nil then
|
|
print ("No unit available! Aborting with extreme prejudice.")
|
|
return
|
|
end
|
|
local i
|
|
|
|
local count_max = count_this(df.job_skill)
|
|
utils = require 'utils'
|
|
for i=0, count_max do
|
|
utils.insert_or_update(unit.status.current_soul.skills, { new = true, id = i, rating = 20 }, 'id')
|
|
end
|
|
print ("The breath of Armok has engulfed "..unit.name.first_name)
|
|
end
|
|
-- ---------------------------------------------------------------------------
|
|
function LegendaryByClass(skilltype,v)
|
|
unit=v
|
|
if unit==nil then
|
|
print ("No unit available! Aborting with extreme prejudice.")
|
|
return
|
|
end
|
|
|
|
utils = require 'utils'
|
|
local i
|
|
local skillclass
|
|
local count_max = count_this(df.job_skill)
|
|
for i=0, count_max do
|
|
skillclass = df.job_skill_class[df.job_skill.attrs[i].type]
|
|
if skilltype == skillclass then
|
|
print ("Skill "..df.job_skill.attrs[i].caption.." is type: "..skillclass.." and is now Legendary for "..unit.name.first_name)
|
|
utils.insert_or_update(unit.status.current_soul.skills, { new = true, id = i, rating = 20 }, 'id')
|
|
end
|
|
end
|
|
end
|
|
-- ---------------------------------------------------------------------------
|
|
function PrintSkillList()
|
|
local count_max = count_this(df.job_skill)
|
|
local i
|
|
for i=0, count_max do
|
|
print("'"..df.job_skill.attrs[i].caption.."' "..df.job_skill[i].." Type: "..df.job_skill_class[df.job_skill.attrs[i].type])
|
|
end
|
|
print ("Provide the UPPER CASE argument, for example: PROCESSPLANTS rather than Threshing")
|
|
end
|
|
-- ---------------------------------------------------------------------------
|
|
function PrintSkillClassList()
|
|
local i
|
|
local count_max = count_this(df.job_skill_class)
|
|
for i=0, count_max do
|
|
print(df.job_skill_class[i])
|
|
end
|
|
print ("Provide one of these arguments, and all skills of that type will be made Legendary")
|
|
print ("For example: Medical will make all medical skills legendary")
|
|
end
|
|
-- ---------------------------------------------------------------------------
|
|
function adjust_all_dwarves(skillname)
|
|
for _,v in ipairs(df.global.world.units.all) do
|
|
if v.race == df.global.ui.race_id then
|
|
print("Adjusting "..dfhack.TranslateName(dfhack.units.getVisibleName(v)))
|
|
brainwash_unit(v)
|
|
elevate_attributes(v)
|
|
rejuvenate(v)
|
|
if skillname then
|
|
if skillname=="Normal" or skillname=="Medical" or skillname=="Personal" or skillname=="Social" or skillname=="Cultural" or skillname=="MilitaryWeapon" or skillname=="MilitaryAttack" or skillname=="MilitaryDefense" or skillname=="MilitaryMisc" then
|
|
LegendaryByClass(skillname,v)
|
|
elseif skillname=="all" then
|
|
BreathOfArmok(v)
|
|
else
|
|
make_legendary(skillname,v)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
-- ---------------------------------------------------------------------------
|
|
-- main script operation starts here
|
|
-- ---------------------------------------------------------------------------
|
|
local opt = ...
|
|
local skillname
|
|
|
|
if opt then
|
|
if opt=="list" then
|
|
PrintSkillList()
|
|
return
|
|
end
|
|
if opt=="classes" then
|
|
PrintSkillClassList()
|
|
return
|
|
end
|
|
skillname = opt
|
|
else
|
|
print ("No skillname supplied, no skills will be adjusted. Pass argument 'list' to see a skill list, 'classes' to show skill classes, or use 'all' if you want all skills legendary.")
|
|
end
|
|
|
|
adjust_all_dwarves(skillname)
|