Trait modding

From CK3 Wiki
Jump to navigation Jump to search

Traits are possessed by characters in the game and can modify their attributes, opinions, personality and other parameters.

Vanilla personality traits[edit | edit source]

The list of vanilla traits can be found in /Crusader Kings III/common/traits.

  • lustful
  • chaste
  • gluttonous
  • temperate
  • greedy
  • generous
  • lazy
  • diligent
  • wrathful
  • calm
  • patient
  • impatient
  • arrogant
  • humble
  • deceitful
  • honest
  • craven
  • brave
  • shy
  • gregarious
  • ambitious
  • content
  • arbitrary
  • just
  • cynical
  • zealous
  • paranoid
  • trusting
  • compassionate
  • callous
  • sadistic
  • stubborn
  • fickle
  • vengeful
  • forgiving

Creating a trait[edit | edit source]

Traits are defined in .txt files in the directory /Crusader Kings III/common/traits.

Example trait:

my_new_trait = {
	index = 0 # A unique numerical identifier for the trait
	education = yes #yes/no to define whether this is an Education trait
	# Flags and modifiers
        ... # Flags and modifiers
        ... # Flags and modifiers

Special trait flags[edit | edit source]

Name Description Usage
index Numerical identifier used in save files. Can be at most 65535 index = X
health Changes actual health value health = X.X
fertility Percentage modifier on fertility fertility = X.X
inherit_chance Chance of passing on the trait to children inherit_chance = X
birth How many characters out of 100 are born with this trait (when not inherited). Can have decimals birth = X
random_creation How many characters out of 100 are created with this trait? (As opposed to actually being born; this is for things like generated characters, script characters, etc.) random_creation = X
triggered_opinion Applied if the associated conditions are fulfilled
triggered_opinion = {
	opinion_modifier = opinion_modifier_key	

	# Everything below is optional
	parameter = doctrine_parameter_key 	
	check_missing = yes			
	same_faith = yes			
	same_dynasty = yes			
	ignore_opinion_value_if_same_trait = yes	
	male_only = yes	
	female_only = yes
compatibility This is not a opinion modifier, but can be used by 'compatibility_modifier' and 'trait_compatibility' trigger. Compatibility is checked for the trait holder vs the listed traits (of another character.)
compatibility = {
	gluttonous = 20
	drunkard = @pos_compat_low
parent_inheritance_sex specifies whether the trait can be inherited from male/female/all parents (all by default) parent_inheritance_sex = male/female/all
child_inheritance_sex specifies whether the trait can be inherited by male/female/all children (all by default) child_inheritance_sex = male/female/all
valid_sex Defaults to all, trait can only be had by characters of this sex valid_sex = male/female/all
genetic If set to yes (no by default), the inheritance will follow the following rules: The trait can be inactive. Children can inherit the trait from both active and inactive parent traits.

An active trait is inherited with 100% chance, an inactive trait with a 50% chance. If the trait is successfully inherited from both parents, it becomes active. If it's inherited only from one parent, it's inactive.

genetic = yes/no
inherit_from_real_father Should the trait be inherited from the real (biological) father? (yes by default) inherit_from_real_father = yes/no
enables_inbred This trait enables the children of the character to be considered for the inbred trait (no by default).

It only enables the inbred chance if there are common ancestors of the parents, so there is no risk of 'inbred' if the parents are not related. If inbred is not enabled by parents' traits, but there are common ancestors, there's a chance (same as for inbred trait when it's enabled) the child will get a random trait with enables_inbred = yes.

enables_inbred = yes/no
good marks this trait as good (default no) good = yes/no
genetic_constraint_all This genetic constraint will be applied when gaining the trait. To add a new genetic constraint, further modifications in gfx\portraits\trait_portrait_modifiers are needed before setting ranges in common\ethnicities genetic_constraint_all = beauty
forced_portrait_age_index The character will use this portrait age index instead of one of the age sub-genes marked as "generic". You can specify more than one such index if you want to randomize between them. If multiple traits force indexes, it randomizes between all of them forced_portrait_age_index = 1
forced_portrait_age_index Example showing that you can define more than one index forced_portrait_age_index = 2
portrait_extremity_shift When gaining this trait, every single morph gene will be shifted by this percentage towards 0 or 1; whichever it is closest to. E.G., 0.4 will shift 25% towards 0, resulting in 0.3 portrait_extremity_shift = 0.25
potential List of triggers which are required for a character to get this trait.
potential = {
   exists = dynasty.dynast
   faith =
immortal Will stop visual aging, and make the character immune to natural death. Can still be killed by script. Fertility will match visual age. You can use set_immortal_age to change the visual age immortal = yes
physical Marks the trait as physical physical = yes
health_trait Marks the trait as health related health_trait = yes
fame Marks the trait as fame related fame = yes
trait_exclusive_if_realm_contains A list of terrain types that are taken into consideration when commander traits are randomly assigned to commanders. These traits are only assigned/considered if the commander's culture contains a province that has one of the terrain types specified in the list trait_exclusive_if_realm_contains = {}
shown_in_ruler_designer Defaults to yes, determines whether trait can be selected from the Ruler Designer shown_in_ruler_designer = yes/no

Creating immortal traits[edit | edit source]

As with the previous game, traits that grant immortality are not present in the game at launch but are already programmed and can be easily created. It only requires adding the following parameter to a trait: immortal = yes

For your immortals to look forever young, you can use the effect immortal age. Such as, set_immortal_age = 30

Localization[edit | edit source]

By default, the name key is trait_<key>, and the desc key is trait_<key>_desc.

Icon[edit | edit source]

The default icon path is gfx/interface/icons/traits/<trait>.dds.

These can be overridden with dynamic descriptions. E.G., name = some_loc_key Or name = { first_valid = { ... } }

The parameters are: name, desc, icon.

The root scope is the character. Note that in some cases there may be no root, so make sure your first check is a fallback for "NOT = { exists = this }" if you add dynamic names, descs, or icons.

An example:

icon = {
	first_valid = {
		triggered_desc = {
			trigger = { NOT = { exists = this } }
			desc = "gfx/interface/icons/traits/"
		triggered_desc = {
			trigger = { gold > 1000 }
			desc = "gfx/interface/icons/traits/"
		desc = "gfx/interface/icons/traits/"

Unique Numerical Identifier List[edit | edit source]

To avoid possible conflicts there is a Google Sheets document to overview which Trait IDs are already used by the community. The list is not complete, but editable by anyone. Please edit carefully, since there are formulas in use, and if possible only add input into the columns "Name", "Author(s)" and "Link". Green background indicates that the Numerical Identifier (column A, blue background) is most likely not used by another person's mod already.

Community document of traits