PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Crusader Kings II - Dev Diary 7 - Character Portraits and Modding



Kadur
09.04.11, 12:03
Since there was some discussions and curious people in the last dev diary thread I thought I should take a break from HOI3: For the Motherland and describe how the character portrait system works. If there are any art questions perhaps Danevang who is doing the actual art can answer those for you, I will focus more on the technical aspects. Remember that all of these pictures are still very much in progress and things will change and a lot of things will be added.


The primordial goo

The way a character looks is based on two things: inheritance (we call this DNA) and other factors (we call these properties). Your DNA is created when you are born and cant be changed. Its a mix of your characters parents DNA plus a small "mutation chance" to simulate genes from ancestors and to make people look different despite not having millions of characters. Properties on the other hand change during a characters lifetime depending on traits, social status etc.

For example DNA will tell if you inherited the big 'ol family potato nose and blond hair (and if not it might cast some suspicions on what your mom was up to while your dad was busy crusading) and properties will tell what kind of hair style you prefer and if you are likely to wear a crown because you're king and how fancy your clothes are.
Currently there are 11 DNA genes and 6 properties for each character, but its not unlikely that we will increase these during the project.

Below is a picture showing inheritance, sadly none of our female portraits are ready for showing yet so I'v shown only the male line:

http://forum.paradoxplaza.com/forum/attachment.php?attachmentid=34343&d=1300027853

You can also see the effects of properties, our character in the middle is a king with a crown and one of his sons is a bishop, above him is his late father. This picture also shows the effect of aging. We currently have 4 age levels for the portraits so you will see your characters grow wrinklier, get bigger ears and their hair thinning and becoming white.

The DNA is scriptable in history files for character if we want to make someone look like their historic counter part (arguably this was more important in EU: Rome because the romans were pretty good at making statues so we could see what people looked like), then during startup the game will run through characters outwards from scripted ones and propagate their genes for a plausible result for all the ones not scripted.


Hey, you said this was about modding not biology!

ok ok, lets see some code and I'll show you how characters can be modded.
Character portraits are described in two files, one for the graphics and one for scripting logic around properties.

Graphical portrait setup


# portraits.gfx
# graphical look of character portraits

# middle age
portraitType = {
name = "PORTRAIT_norsegfx_male1"
effectFile = "gfx\\FX\\portrait.fx"
layer = { # GFX_TYPE:[d|p]INDEX:COLOR_LINK
"GFX_character_western_background:p0"
"GFX_western_male_clothes_behind:p3"
"GFX_western_male_headgear_behind:p5"
"GFX_western_male_beard_behind_midage:p4:h"
"GFX_western_male_base_midage:p2"
"GFX_western_male_neck:d0"
"GFX_western_male_chin:d1"
"GFX_western_male_mouth_midage:d2"
"GFX_western_male_nose_midage:d3"
"GFX_western_male_cheeks_midage:d4"
"GFX_western_male_head:d5"
"GFX_western_male_eyes_midage:d6"
"GFX_western_male_eyes2:d6:e"
"GFX_western_male_clothes:p3"
"GFX_western_male_beard_midage:p4:h"
"GFX_western_male_ear_midage:d7"
"GFX_western_male_clothes_infront:p3"
"GFX_western_male_headgear:p5"
}

hair_color_index = 8 # which DNA gene sets hair color
hair_color = { # dark, base, highlight
{ 15 8 0 } { 173 158 102 } { 255 255 255 }
{ 10 10 10 } { 125 100 82 } { 255 255 255 }
{ 30 22 18 } { 194 132 97 } { 255 255 255 }
}

eye_color_index = 9 # which DNA gene sets eye color
eye_color = {
{ 58 109 193}
{ 120 74 46 }
{ 34 103 36 }
}
}
The name for the portrait type specifies that this is used for the norse graphical culture group and that he is male and middle aged (the number at the end sets age). The portrait is made up of 18 layers (this can change between ages and cultures as well if wanted) and each layer has a string describing it. Lets use "GFX_western_male_beard_midage:p4:h" as an example. This specifies that it should use an image from the GFX_western_male_beard_midage icon strip (specified higher up in the file), that it should use property 4 (:p4) from the character to decide which beard to pick and the last ":h" means that it should be colored using the characters Hair color. If we had wanted to connect to DNA instead of a property (like for the nose) we would write :d4 instead of p4.

Layers are free to connect to the same property and this is done quite a bit for clothes and beard/hair etc that needs to show both behind and in front of other layers. This is what GFX_western_male_clothes looks like for the first 3 options:

http://forum.paradoxplaza.com/forum/attachment.php?attachmentid=34342&d=1300024730

Further down are hair and eye colors specified. For hair there is 3 colors for each property so we can tint hair highlights differently from base colors etc.

Property scripting
A separate file "portrait_properties.txt" specifies what properties a character should have. These are updated on major changes on the character like a new trait, a new title etc and also randomly once in a while. Scripting properties looks like this this, any property not mentioned will basically have a random value picked (so if we don't specify anything for hair/beards you will just get a random beard):


# p3 clothes
3 = {
0 = { # mail armour
factor = 1
modifier = {
factor = 2.0
martial = 5
}
modifier = {
factor = 100.0
has_job_title = job_marshal
OR = {
is_ruler = no
is_theocracy = no
NOT = { religion_group = christian }
}
}
}
1 = { # fancy shirt
factor = 5
modifier = {
factor = 10.0
OR = {
has_job_title = job_treasurer
has_job_title = job_chancellor
}
}
}
2 = { # Catholic vestments
factor = 100
modifier = {
factor = 0
NOT = { religion_group = christian }
}
modifier = {
factor = 0
OR = {
is_ruler = no
is_theocracy = no
}
NOT = { has_job_title = job_spiritual }
}
}
}
The top level is the property, so 3 is the same as :p3 in the graphical description we showed above. The next level in specifies which entry among the icons to pick, this script basically selects between 3 options: chain mail, fancy shirt and a more spiritual outfit. The factors you see are just percentages, but if something is specified with a value of 100 or above it always overrules any other option after it.

Alright, hopefully that was clear. So lets test this with an example. We want to add another layer connected to property 6 to our portrait. lets call it "props" so first we declare a sprite like normally in our gfx file and refer to it in the portrait description at the very end with "GFX_western_male_props:p6". Then we add a rule in the properties script like so:


# p6 props
6 = {
0 = { # empty, dont use props, this is default
factor = 1
}
1 = { # new prop. overrule all if character qualifies
factor = 100
modifier = {
factor = 0
trait = cool
}
}
}
This means that if our character gains the "cool" trait and we have done our modding correctly his portrait will be changed to something like this:

http://forum.paradoxplaza.com/forum/attachment.php?attachmentid=34341&d=1300027346

Looks like this
*puts on sunglasses*
wraps up this developer diary.

YEAAAAAAAAAAAAAH!

(disclaimer: there probably wont be any sunglasses in the real game)

http://forum.paradoxplaza.com/forum/showthread.php?530197-Crusader-Kings-II-Dev-Diary-7-Character-Portraits-and-Modding&p=12258577#post12258577

Der junge Fritz
09.04.11, 14:45
Mal wieder was nettes!