Crusader Kings II. Дневник разработчиков №7. Портреты персонажей и моддинг

Источник: http://forum.paradoxplaza.com/forum/showthread.php?530197

Поскольку после публикации последнего дневника разработчиков на форуме развернулись ожесточенные дискуссии, и появилось много любопытных, я решил сделать небольшой перерыв и рассказать вам, как работает система портретов персонажей. Если у вас будут вопросы касательно графики, то на них, возможно, ответит Danevang, который ею в игре и занимается. Я же сосредоточусь на технических аспектах. Учтите только, что все портреты и картинки ещё находятся в процессе, далеки от завершения и многое ещё может поменяться.

Основа

То, как персонажи выглядят, зависит от двух вещей: 1) генетики, то есть унаследованных от родителей черт (мы называем это DNA, то есть ДНК); 2) других факторов (мы называем их свойствами). Ваша ДНК создаётся в момент рождения, и изменить её уже нельзя. Она представляет собой комбинацию ДНК ваших родителей и небольшой «вероятности мутации». Это одновременное воспроизводит гены ваших предков и в то же время даёт возможность персонажам выглядеть чуть-чуть по-другому, без необходимости рисовать миллион разных персонажей. С другой стороны, свойства (второй фактор) изменяются в течение всей жизни персонажа в зависимости от его характеристик, социального статуса и т.п.

К примеру, ДНК может рассказать об огромном носе «картошкой» и светлых волосах, унаследованных вами от отца (и если этого не будет, то в народе наверняка возникнут подозрения о том, что же ваша маменька делала, пока ваш папенька ходил в Крестовый поход), тогда как свойства опишут, какую причёску вы предпочитаете и какие модные одежды вы носите, будучи королем своей страны.

В данный момент у нас 11 генов ДНК и 6 свойства для каждого персонажа, но мы наверняка ещё увеличим эти числа в процессе работы над проектом.

На представленной ниже картинке вы можете видеть линию наследования от деда к внукам в одной династии. К сожалению, женские портреты пока ещё не готовы, поэтому я покажу вам только мужскую линию.

Crusader Kings II. Линия наследования

На этом рисунке вы также можете видеть и эффект от свойств: персонаж в середине является королем, и вы видите у него на голове корону. Один из его сыновей пошел по церковной стезе, и стал епископом. На этом рисунке также виден и эффект возраста персонажей. В данный момент у нас есть четыре возрастных уровня для портретов, так что вы легко заметите в игре, как ваши персонажи стареют, ведь они станут, к примеру, лысеть а их волосы седеть.

ДНК можно сохранять в файлах истории персонажей; это полезно на тот случай, если мы хотим сделать кого-то похожим на свой исторический прототип. После начала игры эта заскриптованная ДНК начнет распространяться по миру посредством других, не заскриптованных персонажей, появившихся уже после старта, но несущих изначально прописанные гены предков.

Эй, вы говорили, это касается моддинга, а не биологии?

Да-да, давайте взглянем на код и я вам покажу, как персонажи могут изменяться.

Портреты персонажей прописаны в двух файлах, один отвечает за графику, а второй за логику работы свойства.

Графическая составляющая

# 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 }
    }
}

Название этого типа портретов говорит о том, что оно используется для скандинавской культурной группы, и что это мужчина среднего возраста (цифра в конце устанавливает возраст). Этот портрет сделан из 18 слоев (эта цифра может изменяться в зависимости от возраста и культуры так, как мы хотим); на описание каждого слоя отведена одна строка. Возьмем, к примеру, строку «GFX_western_male_beard_midage:p4:h». Она определяет, что мы должны использовать рисунок GFX_western_male_beard_midage из файла иконок (он указан выше в коде). Что мы должны использовать свойство 4 (:p4) персонажа, чтобы определить, как будет выглядеть внешне его борода. Наконец, код «:h» означает, что эта борода должна быть окрашена в цвет волос персонажа. Если бы мы хотели использовать ДНК вместо свойств (например, для носа), то тогда нам следовало бы написать «:d4» вместо «:p4».

Указанные слои можно свободно соотносить с одним и тем же свойством, и это довольно важно для одежд или бороды/волос, которые необходимо показывать одновременно как за, так и перед другими слоями. К примеру, вот так выглядит GFX_western_male_clothes для первых трех вариантов:

Crusader Kings II. Одежда персонажей

Далее описываются цвета волос и глаз персонажей. Для волос у нас есть 3 цвета на каждое свойство, так что мы легко можем делать цвет волос отличным от базового цвета.

Свойства

Отдельный файл «portrait_properties.txt» определяет, какие свойства могут иметь персонажи. Эти свойства обновляются в результате каких-то глобальных изменений в персонаже, вроде получения новой черты характера, получения нового титула или просто из-за случайной флуктуации. Прописанные свойства выглядят так, как в коде ниже, и любое неупомянутое свойство будет иметь случайную характеристику. Например, если мы ничего не запишем о бороде персонажа, то тогда он получит случайным образом выбранную бороду.

# 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 }
        }
    }
}

Верхний уровень — это свойство, так что «3» это то же самое, что и «:p3» в графическом файле, о котором говорилось выше. Следующий уровень внутри тройки определяет, какую иконку в ряду выбирать. Данный скрипт выбирает между тремя вариантами: кольчуга, модная рубашка или же церковное облачение. Указанные факторы — это простые проценты, но если какой из них имеет значение в 100 или выше, то это всегда пересиливает остальные значения и варианты.

Надеюсь, это все достаточно просто. Давайте рассмотрим на примере. Мы хотим добавить на наш портрет новый слой, связанный со свойством номер 6. Сначала мы объявляем графический спрайт и ссылаемся на него в описании портрета в самом конце как
«GFX_western_male_props:p6». Затем мы добавляем правило в скрипт свойств подобным образом:

# 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
        }
    }
}

Это значит, что если у нашего персонажа есть характерная черта «Клёвый», и мы правильно сделали изменений, то наш портрет персонажа станет выглядеть вот так:

Crusader Kings II. Крутой персонаж

Эти мы завершаем наш дневник разработчиков. 🙂

Запись опубликована в рубрике Crusader Kings II. Добавьте в закладки постоянную ссылку.