I have hatched kea men and king snake men, and I have also read of experiments of other people who have hatched many animal people to start a fort.
I'll try to make the explanation as simple as possible:
1) When a non gelded male creature is next to a female creature, the female will get pregnant.
2) In the case of [INTELLIGENT] beings, they also need to be married for the impregnation to happen. They are not mindless animals that breed with anyone.
3) Normally, pregnant creatures will go about their lives as normal until
*POP* a baby comes out. If it's an [INTELLIGENT] being, it'll pick up the baby, carry it around and automatically feed it.
4) Pregnant egg layers will find a nestbox and lay eggs. The eggs, if fertile, have a timer that steadily decreases while the mother sits on them, and when it reaches 0 the babies will hatch. As is known from the elk bird, animal mothers don't leave the nestbox to eat and may starve to death (other egg laying animals don't even need to eat). However, this is no concern for an [INTELLIGENT] creature: the mother will leave to eat, drink and sleep, with no issues to the development of the eggs.
That's the basics. Now off to the real topic:
acquiring animal people citizens1) the mod way: capture some
savages wild animal folk and save the game. Find their raws (in that specific world, not the game's files) and add the tag [PET_EXOTIC]. Now you can train them and keep them around until they petition for citizenship. After they've all petitioned, just remove the [PET_EXOTIC] tag and you can control them like any other regular dwarf. Protip: train them once with a specific trainer and let them go wild, nothing bad will happen and they'll stick around; after they go wild remove the training assignment. You can't do this while they're trained because their names will disappear from the animal list, due to them being [INTELLIGENT]. DON'T LET GREMLINS GO WILD, THOUGH. They'll try to sneak around and pull levers, but most likely will just be immediately spotted and run away, never to be seen again.
2) the 'Armok wants it' way: start a fort, retire, generate a bunch of adventurers of the desired species from the SAME CIV AND SAME SITE, and retire them there. Then you'll have to get them married:
method a) Use DFhack to actually give them a sexual preference other than indeterminate (not just the unit, the histfig also), and set up their marriage (read the wiki on marriage, it's a bit of work but quite fun and rewarding when it works).
method b) Use the gui/family-affairs script to outright marry them and skip the work.
3) the manifest destiny way: no cages or anything needed, just use this script and they're yours.
local utils = require 'gui'
function addcitizen()
local unit
local hf
unit=dfhack.gui.getSelectedUnit()
if unit==nil then
qerror("No unit selected")
return
end
if unit.hist_figure_id ~= -1 then
qerror(dfhack.TranslateName(dfhack.units.getVisibleName(unit)).." isn't interested.")
return
end
-- create histfig
hf=df.historical_figure:new()
hf.id=df.global.hist_figure_next_id
df.global.hist_figure_next_id=df.global.hist_figure_next_id+1
hf.race=unit.race
hf.caste=unit.caste
hf.profession = unit.profession
hf.sex = unit.sex
hf.orientation_flags:assign(unit.status.current_soul.orientation_flags)
hf.appeared_year = df.global.cur_year
hf.born_year = unit.birth_year
hf.born_seconds = unit.birth_time
hf.curse_year = unit.curse_year
hf.curse_seconds = unit.curse_time
hf.birth_year_bias = unit.birth_year_bias
hf.birth_time_bias = unit.birth_time_bias
hf.old_year = unit.old_year
hf.old_seconds = unit.old_time
hf.died_year = -1
hf.died_seconds = -1
hf.name:assign(unit.name) -- Probably no name, though
hf.civ_id = df.global.ui.civ_id
hf.population_id = hf.civ_id
hf.breed_id = -1
hf.cultural_identity = -1
hf.family_head_id = hf.id
hf.flags[16]=true
hf.unit_id = unit.id
hf.nemesis_id = unit.id
-- These will need to be adjusted as DFhack gets updated
hf.unk4 = 0
hf.unk_v47_3 = 0
hf.unk_v47_4 = 0
hf.unk_v4019_1 = -1
hf.anon_1 = -1
-- make the links to your civilization
hf.entity_links:insert("#",{new=df.histfig_entity_link_memberst,entity_id=df.global.ui.civ_id,link_strength=100})
hf.entity_links:insert("#",{new=df.histfig_entity_link_memberst,entity_id=df.global.ui.group_id,link_strength=100})
-- explicitly state in the hf info that it settled in your site
hf.info = df.historical_figure_info:new()
hf.info.whereabouts = df.historical_figure_info.T_whereabouts:new()
hf.info.whereabouts.whereabouts_type = 1 -- (1) settler
hf.info.whereabouts.site = df.global.ui.site_id
hf.info.whereabouts.region_id = -1
hf.info.whereabouts.underground_region_id = -1
hf.info.whereabouts.army_id = -1
hf.info.whereabouts.death_condition = 0
hf.info.whereabouts.death_condition_parameter_1 = -1
hf.info.whereabouts.death_condition_parameter_1 = -1
hf.info.whereabouts.year = df.global.cur_year
hf.info.whereabouts.year_tick = df.global.cur_year_tick
-- let's forge some historical events, just for completion sake
local hf_event_id = df.global.hist_event_next_id
df.global.hist_event_next_id=df.global.hist_event_next_id+1
-- Became a member of your civilization
df.global.world.history.events:insert("#",{new=df.history_event_add_hf_entity_linkst,
year=df.global.cur_year,
seconds=df.global.cur_year_tick,
id=hf_event_id,
civ=df.global.ui.civ_id,
histfig=hf.id,
link_type=0})
hf_event_id = df.global.hist_event_next_id
df.global.hist_event_next_id=df.global.hist_event_next_id+1
-- Settled in your site
df.global.world.history.events:insert("#",{new=df.history_event_change_hf_statest,
year=df.global.cur_year,
seconds=df.global.cur_year_tick, -- Are these 'seconds' the same as yearticks? Comparing natural values form random events were inconclusive.
id=hf_event_id,
hfid=hf.id,
state = 1,
reason = -1,
site = df.global.ui.site_id,
region = -1,
layer = -1})
-- TODO: set the histfig personality to match the unit's soul
-- TODO: generate a name and apply it on the soul, the unit and the histfig
-- TODO: check for [INTELLIGENT] or similar attributes before attempting to claim a unit. Perhaps check for other things such as [EVIL]
-- insert the histfig
df.global.world.history.figures:insert("#",hf)
-- unit: set the appropriate flags (some are left over from the original script)
unit.flags1.important_historical_figure = true
unit.flags2.important_historical_figure = true
unit.hist_figure_id = hf.id
unit.hist_figure_id2 = hf.id
unit.civ_id = df.global.ui.civ_id
unit.population_id = df.global.ui.civ_id
unit.flags1.merchant=false
unit.flags1.forest=false
unit.flags1.diplomat=false
unit.flags2.visitor=false
unit.flags2.roaming_wilderness_population_source = false
unit.flags2.roaming_wilderness_population_source_not_a_map_feature = false
unit.flags3.unk31=false
local color=_G["COLOR_YELLOW"]
dfhack.gui.showAnnouncement(dfhack.TranslateName(dfhack.units.getVisibleName(unit)).."has joined our fortress!", color)
end
addcitizen()
You'll still have to make whatever you caught marry though, and for some reason the script works oddly with Dwarf Therapist.