User:Andux/Scripts

From Dwarf Fortress Wiki
Jump to navigation Jump to search

A collection of scripts for DFHack.

Fortress mode[edit]

Name generator[edit]

Based on Aerval's; changes:

  • Expanded selection of name parts.
  • Uses the world's name seed instead of the dwarf race index.
  • Better handling of historical figures.
--Nameparts by http://jtevans.kilnar.com/rpg/dnd/tools/dwarf.php, Aerval, and Andux
local firstnamepart = {
	"ad", "ak", "an", "ar", "ash", "at",
	"ba", "bal", "bar", "bel", "ber", "bil", "bof", "bol", "bro", "bul",
	"cal", "chal",
	"da", "das", "dal", "dim", "dor", "dru", "dur", "dwe", "dwin",
	"el",
	"fal", "far", "fash", "fel", "fim", "ful", "fun",
	"gal", "gar", "ger", "gil", "gim", "gom", "gol", "gri", "gro", "gru", "grun",
	"ha", "hal", "ham", "har", "hel", "her", "ho", "hol", "hor", "hul",
	"ing", "in", "ir",

	"kal", "kas", "ket", "kha", "khor", "kil", "kin", "ko", "kor", "kul",
	"lam", "lar", "lon", "lun",
	"mag", "mal", "mar", "mor", "mun",
	"nal", "nar", "nil", "nor",
	"ol", "or", "ov",

	"rag", "ral", "ram", "rim", "ron", "run", 
	"sal", "sar", "shal", "shar", "shor", "sim", "sor", "stal", "stav", "sven",
	"tan", "tha", "thal", "thin", "thor", "thra", "thu", 
	"um", "ur",
	"val", "van",
	"wil",

	"yar",
	"za", "zir", "zul"
};
local female_secondpart = {
	"a", "ada", "ala", "ana", "ani", "atha",
	"bari", "bina", "bine", "bura", 
	"cha", "chi",
	"da", "dana", "dani", "dili", "dina", "dola", "dora", "dri", "dria", 
	"edi", "ena", "eta", "eva", "eza",
	"fani", "fi",
	"ga", "gana", "gari", "gela", "gina", "gini", "goli", "grima", 

	"i", "ia", "ida", "ila", "ilda", "ili", "ika", "ina", "iri",

	"ka", "ki", "kia", "kona", "kuni",
	"la", "lani", "leda", "lena", "lia", "lina", "lona",
	"ma", "mani", "mela", "mina", "moda", "modi",
	"na", "neva", "ni", "nia", "nomi",
	"ola", "olga", "ona", "ondi", "oti", "ova",

	"ra", "raka", "rana", "ravi", "ri", "ria", "rimi", "rinda", "rundi", 
	"sha", "shi", "si", "ska",
	"ta", "tha", "ti", "tila", "tri", "tria", 
	"umma", "undi", "unga", "unni", 
	"vala", "vali", "vara", "vari", "vina",

	"ya",
	"zadi", "zani", "zara", "zi"
};
local male_secondpart = {
	"aim", "ain", "ak", "ald", "am", "ar", "ard", "ash", 
	"bain", "bald", "ban", "bar", "bash", "brun", "bur", 

	"dain", "dall", "dar", "din", "dok", "dol", "dor", "dum", "dun", "dur",
	"eff", "esh", "ev",
	"far", "fath", "feb",
	"gan", "gar", "gath", "gin", "gor", "grim", 

	"ik", "il", "im", "in", "ip", "isch", 

	"kad", "kar", "kash", "keld", "kesh", "kon", 
	"lek", "lem", "lesh", "let", "leth", "lin", "lor", 
	"mar", "mek", "min", "mok", "mon", "moth", "mund", 
	"nar", "nek", "nir", "nod", "nor", 
	"od", "oin", "ok", "old", "on", "ond", "or", 

	"rak", "ram", "rik", "rim", "rin", "ros", "roth", "rund", 
	"skal", "skar",
	"tar", "tek", "til", "tok", "tul",
	"um", "und", "unn", "ur", "urd",
	"val", "van", "var", "vath", "vek", "ven", "vesh", "veth", "vin", "von",

	"zad", "zar", "zek", "zim", "zin"
};

local dwarfRace = df.global.ui.race_id;

math.randomseed(tonumber(df.global.world.worldgen.worldgen_parms.name_seed,36));
for index,unit in pairs(df.global.world.history.figures) do --Renaming all the historical dwarves
	if ( unit.race == dwarfRace ) then
		if (unit.sex ~= 0) then
			unit.name.first_name = firstnamepart[math.random(#firstnamepart)]..male_secondpart[math.random(#male_secondpart)];
		else
			unit.name.first_name = firstnamepart[math.random(#firstnamepart)]..female_secondpart[math.random(#female_secondpart)];
		end
	end
end
for index,unit in pairs(df.global.world.units.all) do --Renaming pretty much everyone else
	if ( unit.race == dwarfRace ) then
		if unit.flags1.important_historical_figure or unit.flags2.important_historical_figure then
			--Use the same name as the histfig data
			unit.name.first_name = df.historical_figure.find(unit.hist_figure_id).name.first_name;
		else
			if (unit.sex ~= 0) then
				unit.name.first_name = firstnamepart[math.random(#firstnamepart)]..male_secondpart[math.random(#male_secondpart)];
			else
				unit.name.first_name = firstnamepart[math.random(#firstnamepart)]..female_secondpart[math.random(#female_secondpart)];
			end
		end
	end
end
print("firstnamepart: "..#firstnamepart.."\nfemale: "..#female_secondpart.."\nmale: "..#male_secondpart);

Adventure mode[edit]

Item material changer[edit]

Roughly equivalent to changeitem m, but works better in adventure mode.

local r=nil
local top=dfhack.gui.getCurViewscreen()
print(top.parent,top)
local cvstype=dfhack.gui.getFocusString(top)
print(dfhack.gui.getFocusString(top.parent).."/"..cvstype)
if cvstype=="dungeon_monsterstatus" then
	print("  inventory size: "..#top.inventory)
	print("  inventory_cursor: "..top.inventory_cursor)
	r=top.inventory[top.inventory_cursor].item
elseif cvstype=="item" then
	-- override getSelectedItem()'s default behaviour for containers
	r=top.item
else
	r=dfhack.gui.getSelectedItem()
end

if r then
	local m=...
	if not m then
		print("no material")
		return
	end

	r.mat_type=dfhack.matinfo.find(m).type
	r.mat_index=dfhack.matinfo.find(m).index
	r.flags.weight_computed=0

	printall(r)
end

Urbanizer[edit]

For older versions of Dwarf Fortress--converts all forest retreats to visitable towns.

for k,v in pairs(df.global.world.world_data.sites) do
	if v.type==4 then
		v.type=5
		print('Site #'..k..': '..dfhack.TranslateName(v.name)..', "'..dfhack.TranslateName(v.name,1)..'", converted to town.')
	end
end

General[edit]

GoodAsNew[edit]

Removes all wear from the selected item.

local r=nil
local top=dfhack.gui.getCurViewscreen()
print(top.parent,top)
local cvstype=dfhack.gui.getFocusString(top)
print(dfhack.gui.getFocusString(top.parent).."/"..cvstype)
if cvstype=="dungeon_monsterstatus" then
	print("  inventory size: "..#top.inventory)
	print("  inventory_cursor: "..top.inventory_cursor)
	r=top.inventory[top.inventory_cursor].item
else
	r=dfhack.gui.getSelectedItem()
end

if r then
	r.wear=0
	r.wear_timer=0
	printall(r)
end

Kinsey[edit]

-- View or change the sexual orientation of the selected unit.

--[====[

kinsey
======
View or change the sexual orientation of the selected unit. Usage:

:kinsey:
    Print the unit's orientation flags.
:kinsey -asexual:
    Change flags so that the unit will not romance or marry anyone.
:kinsey -rf:
    Allow the unit to romance females.
:kinsey -rm:
    Allow the unit to romance males.
:kinsey -mf:
    Allow the unit to marry females.
:kinsey -mm:
    Allow the unit to marry males.
:kinsey -indeterminate:
    Mark the unit's orientation as indeterminate (default for adventurers).

Apart from the -asexual flag, any of the options above can be used together;
for example, ``kinsey -rm -mf`` will allow a unit to romance either sex, but
only marry females.

]====]

local utils = require('utils')

local validArgs = utils.invert({
    'asexual',
    'rf',
    'rm',
    'mf',
    'mm',
    'indeterminate',
    'help',
})

local args = utils.processArgs({...}, validArgs)

if args.help then
	print(dfhack.script_help())
	return
end

local unit = dfhack.gui.getSelectedUnit()
if not unit then
	qerror('Error: please select a unit.')
end

local hf = df.historical_figure.find(unit.hist_figure_id)
if not hf then
	print("Warning: Couldn't find histfig data for this unit.")
end

if unit then
	if args.asexual then
		unit.status.current_soul.orientation_flags.indeterminate = false
		unit.status.current_soul.orientation_flags.romance_male = false
		unit.status.current_soul.orientation_flags.marry_male = false
		unit.status.current_soul.orientation_flags.romance_female = false
		unit.status.current_soul.orientation_flags.marry_female = false
		print("Unit orientation flags cleared.")
		if hf then
			hf.orientation_flags.indeterminate = false
			hf.orientation_flags.romance_male = false
			hf.orientation_flags.marry_male = false
			hf.orientation_flags.romance_female = false
			hf.orientation_flags.marry_female = false
			print("Changes propagated to histfig data.")
		end

	elseif args.indeterminate or args.rm or args.mm or args.rf or args.mf then
		unit.status.current_soul.orientation_flags.indeterminate = (args.indeterminate~=nil)
		unit.status.current_soul.orientation_flags.romance_male = (args.rm~=nil)
		unit.status.current_soul.orientation_flags.marry_male = (args.mm~=nil)
		unit.status.current_soul.orientation_flags.romance_female = (args.rf~=nil)
		unit.status.current_soul.orientation_flags.marry_female = (args.mf~=nil)
		print("Unit orientation flags updated.")
		if hf then
			hf.orientation_flags.indeterminate = unit.status.current_soul.orientation_flags.indeterminate
			hf.orientation_flags.romance_male = unit.status.current_soul.orientation_flags.romance_male
			hf.orientation_flags.marry_male = unit.status.current_soul.orientation_flags.marry_male
			hf.orientation_flags.romance_female = unit.status.current_soul.orientation_flags.romance_female
			hf.orientation_flags.marry_female = unit.status.current_soul.orientation_flags.marry_female
			print("Histfig data updated to match.")
		end
	end

	print("Current orientation flags:")
	print("  indeterminate: ", unit.status.current_soul.orientation_flags.indeterminate)
	print("  romance_male:  ", unit.status.current_soul.orientation_flags.romance_male)
	print("  marry_male:    ", unit.status.current_soul.orientation_flags.marry_male)
	print("  romance_female:", unit.status.current_soul.orientation_flags.romance_female)
	print("  marry_female:  ", unit.status.current_soul.orientation_flags.marry_female)
end