[CK2 모딩 팁]내멋대로 쓰는 Crusader King 2 모딩 매뉴얼 (13) 트레잇 모딩 - 개정판 (2015/06/14 수정)
작성자tacitus작성시간15.02.16조회수6,672 목록 댓글 34내멋대로 쓰는 Crusader Kings 2 모딩 매뉴얼 - 개정판
7. 트레잇
(1) 서설 - 트레잇 추가 모딩 시 주의 사항
네. 그다지 영양가가 없었던 마이너 타이틀을 후딱 던져버리고, 그보다는 조금 낫지만 뭐 별거 없기는 똑같은, 그러나 쓰기에 따라서는 상당히 유용한 도구가 되는 트레잇 모딩을 진행해 보도록 하겠습니다.
트레잇 모딩을 하는 데 있어서는 한 가지 미리 알고 넘어가야 할 것이 있습니다. CKII 의 시스템상, 새로운 트레잇은 절대로 중간에 끼어들어서는 안 된다는 것입니다. 예를 들어, 트레잇 정의에 140개의 트레잇이 있다고 합시다. 여기에 트레잇을 하나 더 추가하고 싶습니다. 그러면 이 트레잇은 반드시 기존 트레잇의 뒤쪽에 와야 합니다. 중간에 끼어들면, 그 트레잇이 없었던 때의 기존 세이브 파일들을 로드하면 트레잇이 엉망진창으로 꼬여버립니다.
무슨 이야긴지 아시겠죠? 만약 A,B,D,E 트레잇이 순서대로 정의되어 있는데, C 트레잇을 새로 정의하고 싶다면, 반드시 E 뒤쪽에 정의해야 한다는 겁니다. 순서를 맞춘다거나, 관련된 트레잇끼리 모아서 정의한답시고 B와 D 사이에 C를 정의했다가는, 기존 세이브 파일을 열었을 때 D 트레잇을 갖고 있던 캐릭터가 C 트레잇을 갖게 되고, E 트레잇을 갖고 있던 캐릭터는 D 트레잇을 갖고 있게 되는 겁니다. C가 끼어들면서 줄줄이 밀린다는 거죠.
이것은 파일의 로드 순서와도 관계가 있습니다. CKII 는 기본적으로 하나의 폴더 내에 있는 데이터 파일들을 읽을 때 알파벳 순서로 정렬하여 읽습니다. 만약 모드 파일에 09_traits.txt 데이터 파일이 있었다고 합시다. 그 앞에 08_traits.txt 파일을 추가했습니다. 그럼 09_traits.txt 파일보다 08_traits.txt 파일이 먼저 읽히겠죠? 한마디로 기존 트레잇들보다 08_traits.txt 에 새로 정의한 트레잇들이 먼저 나오게 된다는 겁니다. 그 결과 트레잇이 줄줄이 밀리게 되죠.
아마도, CKII 의 시스템은 트레잇을 파일을 읽어들인 순서대로 트레잇 번호를 매기고, 그 번호를 가지고 핸들링을 하고 있는 것 같습니다. 번호로 트레잇을 관리하는 세이브 파일을 보면 이건 거의 확실한 것 같아요. 따라서, 모드 폴더에 생성하는 트레잇 정의 파일은 항상 기존 파일들의 뒤에 오도록 생성을 하시고, 모드 내에서도 새로 추가되는 트레잇은 파일의 뒤쪽에 붙여 넣으십시오. 혹 새 파일을 만드실 때는 항상 번호가 더 커지도록 - 그래서 나중에 읽히도록 해 주시기 바랍니다.
즉, 최신 버전인 2.3.6 버전을 기준으로 할 때, 원본에는 00, 01, 02 로 시작하는 데이터 파일이 존재하므로, 모드에 자신만의 트레잇을 추가해 넣고 싶다면 03, 혹은 그보다 더 큰 숫자로 시작하는 데이터 파일을 만드시면 된다는 겁니다. 그럼 항상 모드의 기존 트레잇보다 뒤쪽에 정렬될 테니까요.
기존 데이터와의 호환성을 위해서는 이 부분은 항상 주의해야 하므로, 문서의 앞 부분에서 특히 강조해 드렸습니다.
(2) 트레잇을 정의하고 출력하기 위해 필요한 파일들
하나의 트레잇을 사용하기 위해서는, 다음과 같은 파일 및 설정이 필요합니다.
- 우선, 트레잇 정의 파일, 즉 이 트레잇이 어떤 효과를 갖는지 정하는 파일은, common/traits 폴더에 00_traits.txt 부터 02_traits.txt 까지 3개의 파일로 구성되어 있습니다. 자세한 내용은 뒤에서 볼 겁니다.
왜 굳이 3개의 파일로 나누어 놓았는지는 모를 일입니다.
-
다음, 트레잇 아이콘 (이미지) 파일은, gfx/traits 폴더 내에 있습니다. 트레잇 아이콘 이미지 파일은 CKII 에서 사용하는 다른 대부분의 이미지들과 마찬가지로 .DDS 포맷으로 되어 있습니다. 파일 이름을 정하는 데에 일반적인 규칙은 존재하지 않지만, 대개는 트레잇의 이름과 같이 정하는 것이 혼동을 막을 수 있겠죠. 이 파일을 만들고 수정하는 것 역시 뒤에서 다시 확인하겠습니다.
-
트레잇 정의와, 트레잇 아이콘 파일이 있습니다. 이제 이들을 연결해 줄 연결 데이터가 필요하겠죠. 이 연결 데이터는 interface/traits.gfx 파일에 들어 있습니다. 자세한 내용은 마찬가지로 뒤에서 확인합니다.
이와 같이, 하나의 트레잇을 새로 만들어 넣기 위해서는 위 세 개의 데이터를 추가해 주어야 합니다. 물론, 기존에 존재하는 트레잇의 효과만을 수정하고 싶다면 제일 위에 있는 트레잇 정의 파일만 수정하면 되겠지요.
(3) 트레잇 정의 파일
■ 트레잇 정의의 구조
우선 트레잇 정의 파일을 봅시다. 어찌 보면 가장 핵심적인 파일이죠. 새로운 트레잇을 추가하시려면 앞에서 말씀드린 대로 02 보다 더 큰 숫자를 이용해서 모드 폴더의 같은 위치에 파일을 하나 임의로 추가하신 후 거기에서 편집을 하시면 되겠습니다.
설명을 위해서 원본 파일 중 하나를 아무거나 열어보겠습니다. 파일을 열어보시면, 아래와 같이 정말로 단순하기 그지없는 파일의 구조를 보실 수 있습니다.
amateurish_plotter = { education = yes intrigue = 1 stewardship = -1 } flamboyant_schemer = { education = yes intrigue = 3 stewardship = -1 } kind = { personality = yes opposites = { envious cruel } intrigue = -2 diplomacy = 2 vassal_opinion = 10 opposite_opinion = -10 same_opinion = 10 ai_honor = 10 male_insult = INSULT_SOFT male_compliment_adj = COMPL_KINDLY female_compliment_adj = COMPL_KINDHEARTED } heavy_infantry_leader = { leader = yes command_modifier = { heavy_infantry = 0.2 cavalry = -0.1 } }
처음 몇 개를 예시로 가져와봤습니다. 그냥 트레잇 이름(ID) 안쪽에 특별한 순서도 없이 효과와 속성을 한 줄씩 기록한 형태입니다. 따라서, 트레잇을 모딩하려는 플레이어는, 트레잇이 가질 수 있는 속성과 트레잇으로 가능한 효과의 목록만 잘 챙겨서 사용하면 된다는 거죠. 참 쉽죠? 이제 우리는 트레잇으로 무엇을 할 수 있는지만 알면 모든 게 끝나는 겁니다.
다른 이름과 마찬가지로, 트레잇 이름은 메시지 파일의 메시지 ID 로 사용되며, _desc 도 사용 가능합니다. 예쁘게 출력되도록 하려면 반드시 언어 파일에 설정해 주십시오. (트레잇의 언어 파일 정의에 대해서는 추가로 설명드릴 내용이 있어서, 뒤에서 다시 논의하겠습니다.)
■ 트레잇의 속성 항목들
위에서 트레잇 정의의 구조를 설명드리면서, 특별한 순서 없이 효과와 속성을 한 줄씩 기록했다고 말씀드렸습니다만, 그래도 대부분의 경우 해당 트레잇의 속성을 먼저 정의하고 그 아래에 효과들을 모아서 정의합니다. 막 뒤죽박죽 섞여 있으면 사람이 읽기가 어렵거든요. (막 섞어놓아도 컴퓨터는 알아서 잘 해석하긴 합니다.)
먼저 트레잇의 속성을 정의하는 예약어들을 먼저 알아보겠습니다. 꽤 많기 때문에, 유사한 기능을 하는 트레잇 속성 항목들끼리 그룹으로 묶어서 설명드릴게요. 그리고, 해당 종류의 트레잇과 관련된 명령어나 조건문이 있다면 함께 알아보겠습니다. 일부는 이미 설명드린 명령어나 조건문일 수도 있지만, 어떤 것은 여기서 처음 다루어지는 것일 수도 있습니다.
트레잇이 확장되어 온 역사는 CKII 의 시스템이 확장되어 온 역사와도 맞물려 있습니다. 캐릭터와 관련한 많은 기능들이 트레잇을 통하여 구현되어 왔기 때문에, 어떤 속성이 정의된 트레잇은 시스템상으로도 중요한 의미를 갖게 되는 경우가 있습니다. 이런 관점에서 아래 속성 항목들을 살펴보시면, 상당히 흥미로운 부분을 많이 발견하실 수 있을 것입ㄴ다.
1) 특정한 그룹으로 묶이는 트레잇
- education = yes : 이 트레잇은 교육 트레잇임을 의미합니다. 교육 트레잇은 해당 캐릭터가 미성년 시절 학습의 결과로 성년이 되면서 얻게 되는 트레잇으로, 캐릭터 당 1개의 트레잇만을 얻을 수 있습니다.
다 알고 계시겠지만, 원본에 정의된 교육 트레잇은 하나의 스탯에 대응되는 4단계의 트레잇으로 이루어져 있지요. 예를 들면 음모(Intrigue) 스탯의 경우, 서툰 음모가(Amateurish Plotter) - 현란한 모사꾼(Flamboyant Schemer) - 치밀한 설계자(Intricate Webweaver) - 수수께끼 환영(Elusive Shadow) 의 4단계로 구성되어 있습니다. 이 글은 모딩 가이드이므로 이 이상 자세한 설명은 하지 않습니다.
- lifestyle = yes : 라이프 스타일 트레잇입니다. Way of Life 에서는 각각의 삶의 방식의 선택을 통해서 이 범주의 트레잇을 랜덤하게 얻을 수 있고, 그 이전에는 랜덤한 연속적인 이벤트 체인을 통해 얻을 수 있었습니다. 이 트레잇 역시 원칙적으로 1개만 얻을 수 있고, 이미 가지고 있는 경우에는 원칙적으로 다른 라이프스타일 관련 이벤트가 발생하지 않습니다.
관련된 조건문으로, lifestyle_traits 가 있습니다. 이 조건문은 현재 스코프의 캐릭터가 가지고 있는 라이프스타일 트레잇의 갯수를 돌려주는 조건문입니다.
if = { limit = { NOT = { lifestyle_traits = 1 } } ... }
- personality = yes : 퍼스널리티 트레잇으로 주로 미성년 시절에 얻지만, 성인이 된 이후에도 평생동안 얻거나 상실할 수 있습니다. 이들 트레잇 간에는 상호간 상성이 있어서, 반대되는 상성의 트레잇에 대해서 마이너스 속성이 붙습니다. (서로 반대되는 속성은 한 캐릭터에 동시에 가질 수 없습니다.) 뭔지 모르시겠다고요? 게임 내의 일곱 가지 미덕 트레잇과 일곱 가지 악덕 트레잇 기억하시죠? 걔들 말입니다.
관련된 조건문으로, personality_traits 이 있습니다. 뭔지 벌써 아시겠죠? 퍼스널리티 트레잇의 갯수를 돌려주는 조건문입니다. 원본에선 제법 쓰이고 있지만, 모딩 과정에서 이 조건문을 쓸 일이 과연 있을지...
- is_health = yes : 캐릭터의 건강과 관련된 트레잇입니다. 스트레스(Stressed), 홀린(Possessed), 술주정뱅이(Drunkard) 과 같이 꼭 질병이 아니더라도 캐릭터의 건강과 관련되는 트레잇에는 이 속성이 붙어 있습니다.
다시 관련된 조건문. health_traits 조건문은 건강 트레잇의 갯수를 돌려주는 조건문입니다.
- is_illness = yes : 캐릭터가 앓고 있는 특정한 질병 트레잇들입니다. 단순히 아픈(ill) 것일 수도 있고, 어떤 특정한 질병(예를 들면 폐렴 같은)을 앓는 것일 수도 있습니다. 보통 게임 중에서는 일단 ill 단계에서 낫거나 다른 질병으로 악화되거나 둘 중 하나의 경로를 밟게 되죠.
is_ill 조건문(yes/no), has_disease 조건문(yes/no)으로 확인이 가능합니다. (이 두 조건문이 서로 범위가 같은 것인지 저도 잘 모르겠습니다.)
이 질병은 cure_illness = yes 명령으로 치료할 수 있습니다.
- is_epidemic = yes : 캐릭터가 앓고 있는 전염병입니다. 특정 지역에 어떤 전염병이 유행중인 경우, 그 지역에 있는 캐릭터들은 해당 전염병에 걸릴 수 있으며, 이는 플레이어도 예외가 아닙니다! 대개의 경우, 전염병은 치명적인 결과를 가져올 수 있죠.
has_epidemic 조건문(yes/no)으로 확인이 가능합니다. 원본의 is_epidemic 트레잇은 모두 is_illness 와 함께 다닙니다. (아마도 그렇기 때문에, is_epidemic 도 cure_illness = yes 명령으로 치료할 수 있을 것입니다.)
- leader = yes : 리더십(군사 지도자) 트레잇입니다. 전투시 자신이 지휘하는 부대의 전투력이나 사기 등에 영향을 줍니다. 가질 수 있는 리더십 트레잇의 갯수에는 제한이 있으며, 일정한 조건을 충족해야 합니다.
2) 트레잇의 획득 및 상속에 관련한 속성
-
agnatic = yes : 이 트레잇은 아버지로부터 이 트레잇을 물려받습니다. (부계를 따라 항상 상속이 이루어집니다.)
-
birth = N : 캐릭터 생성(탄생) 시, 이 트레잇을 얻을 확률을 정합니다. 숫자는 1만 명의 캐릭터가 태어났을 때 몇 명의 캐릭터가 이 트레잇을 얻는지의 확률입니다. (따라서 100=1%)
-
inherit_chance = N : 부모로부터 이 트레잇을 물려받을 확률을 정합니다. 만약 부모 양쪽에 모두 이 트레잇이 있다면, 해당 확률로 2회 시행하여 결과를 정합니다. (즉 명목상 확률은 2배가 됩니다.)
-
random = no : 이 트레잇은 랜덤으로 캐릭터에게 부여되지 않습니다. (이벤트 등을 통해서만 캐릭터에게 부여됩니다.)
따라서, 플레이어 전용으로 사용할 트레잇의 경우 반드시 이 옵션을 붙여 주십시오.
3) 룰러 디자이너 관련 설정
-
customizer = no : 이 트레잇은 룰러 디자이너를 통해 캐릭터에게 부여할 수 없습니다.
-
ruler_designer_cost = N : 룰러 디자이너에서 이 트레잇을 캐릭터에게 부여하는 경우, 얼마의 나이를 공제/합산할지를 결정합니다. 플러스 마이너스 값을 모두 가질 수 있죠.
4) 캐릭터에게 특수한 속성을 부여
-
cannot_inherit = yes : 이 캐릭터는 작위를 상속받을 수 없습니다. 따라서 이 트레잇을 가진 캐릭터는 승계 순위에서 제외됩니다. 원본에서는 수도자들에게 주어지는 트레잇에 이 속성이 달려 있죠.
-
cannot_marry = yes : 이 캐릭터는 결혼할 수 없습니다.
-
blinding = yes : 이 캐릭터는 감옥에서 영원히 눈이 멀었으며, 이에 따라 승계에서 제외되었습니다. 비잔틴의 눈뽑기 디시전에 당한 캐릭터가 얻는 트레잇에 이 설정이 있습니다.
단, 정말로 승계에서 제외되는지는 각 문화별로 차이가 있습니다. 이것은 뒤에 문화 모딩 파트에서 그 설정을 보게 됩니다.
-
immortal = yes : 이 캐릭터는 불사의 몸을 가졌기에, 자연사하지 않습니다. 네. 단지 "자연사하지 않는다"는 것 뿐입니다. 감옥에서 처형당하거나, 각종 이벤트의 결과로 인한 죽음은 당할 수 있습니다. 완벽히 죽음을 막아주는 트레잇 설정은 아닙니다.
-
in_hiding = yes : 현재 이 캐릭터는 은신 중입니다. 은신의 효과를 받습니다. 샤를마뉴(2.2.x) 이상에서 도입된 설정이지요.
-
inbred = yes : 이 캐릭터는 근친혼으로 출생했으며, 그에 따른 유전적 결함을 그대로 가지고 있습니다.
-
incapacitating = yes : 이 캐릭터는 병약하여 섭정을 필요로 합니다.
-
pilgrimage = yes : 이 캐릭터는 잠시 영지를 떠났으며 따라서 섭정을 필요로 하지만, 자신의 피후견인을 그대로 유지합니다.
게임 내에서는 일반적으로 성지순례를 떠난 경우에 이 트레잇을 사용합니다. 모딩 시 주의할 점은, 이 트레잇을 가지고 있다고 하더라도 게임 내에서 해당 캐릭터가 있는 장소를 체크할 경우 캐릭터가 있었던 그 홀딩을 가리킨다는 점입니다.
- rebel_inherited = yes : 반란군(농민반란, 종교반란)에게 붙는 트레잇 특성이지만, 구체적으로 어떤 내부적인 효과를 갖는지는 알려지지 않았습니다.
5) 캐릭터에게 종교적 특성을 부여하는 트레잇 속성
-
caste_tier = N : 이 트레잇은 카스트 트레잇으로, 해당 카스트의 몇 번째 순서인지를 정합니다. 인도 관련 종교 트레잇에 이 설정이 존재합니다.
-
priest = yes : 이 트레잇은 종교적인 교육을 받은 자를 의미합니다. 교육 트레잇 중 종교 관련 4개의 트레잇에 이 속성이 함께 걸려 있습니다.
조건문 is_priest (yes/no)을 사용할 수 있습니다.
-
religious = yes : 이 트레잇을 가진 자는 개종 시 이 트레잇을 자동으로 잃습니다. (파간의 개혁에 따라 변경되는 경우에도 동일합니다)
-
religious_branch = religion : 이 트레잇은 특정 종교의 분파를 나타냅니다.
-
prevent_decadence = yes : 이 트레잇은 무슬림 캐릭터를 데카당스로부터 차단합니다. (원본 트레잇 중에는 이 속성을 가진 트레잇은 없습니다.)
-
특정 종교에 대한 관용 : tolerates_christian, tolerates_jewish_group, tolerates_muslim, tolerates_pagan_group, tolerates_zoroastrian_group, tolerates_indian_group. (모두 yes/no 를 받는다.) 게임 상에서는 특정 종교였다가 개종한 경우, 원래의 개종 전 종교에 대해서 이 트레잇을 얻게 되곤 합니다.
6) 시스템 및 기타 속성
-
cached = yes : 이 트레잇을 가진 모든 캐릭터는 캐시가 이루어지며, 트리거 이벤트 시 더욱 효과적으로 실행될 수 있습니다. (캐릭터 수는 한정되어 있어야 합니다)
-
opposites : 이 트레잇의 반대 트레잇. 목록으로 나타냅니다.
opposites 라고 되어 있어서, 항상 서로 상극의 트레잇만 지정되는 것으로 오해할 수 있는데요. 꼭 그런 것만은 아닙니다. 단지 이들 트레잇과는 함께 지정되어서는 안된다는 의미일 뿐입니다. 따라서, 일곱 가지 미덕/악덕 트레잇에서처럼 서로간의 관계가 항상 마이너스가 되는 것은 아닙니다. (원본에서는 대부분 상극의 경우에 사용되긴 하지만요.) 바로 아래에서 보는 opposite_opinion 값을 어떻게 지정하느냐에 따라서 이들간의 오피니언 수치가 증가할지 감소할지를 결정합니다.
-
opposite_opinion = N : 반대 트레잇이 지정된 경우 해당 반대 트레잇의 소유자에 대한 오피니언 수치의 증감을 정할 수 있습니다.
-
same_opinion = N : 동일한 트레잇을 가진 자에 대한 오피니언 증감 수치를 정할 수 있습니다. 원본에서는 쌍둥이의 경우에 서로간의 오피니언 값이 증가하는 효과를 구현해 두고 있죠.
-
leadership_traits = N : 앞에서 leader = yes 설정을 말씀드리면서, 리더십 트레잇은 가질 수 있는 조건을 충족해야 얻을 수 있다고 말씀드렸지요. 거기서 말씀드린 그 "일정한 조건" 입니다. 이 속성이 부여된 트레잇을 얻은 자는 N 개의 리더십 트레잇을 얻을 수 있습니다.
원본에는 무력(Martial) 관련 교육 트레잇 중 최고(4단계)의 트레잇인 Brilliant strategist(뛰어난 전략가) 트레잇에만 1이 지정되어 있습니다. 따라서 원본 상태라면 이 트레잇을 획득했을 때 1개의 리더십 트레잇을 얻을 수 있습니다. 모두가 이 트레잇을 원하지만, 아시다시피 아이를 잘 키워서 16세에 뛰어난 전략가 트레잇을 획득하도록 하는 것은 어느 정도 운이 따라주어야 하는 일입니다.
이벤트 등에서 이 캐릭터가 리더십 트레잇을 추가로 얻을 수 있는지를 확인하려면 can_have_more_leadership_traits (yes/no) 조건문을 사용하시면 됩니다.
■ potential = { } 섹션 : 트레잇 획득을 위한 자격 조건의 설정
어떤 트레잇은 획득의 기본 자격이 설정되어 있는 경우가 있습니다. 예를 들면, 16세 미만의 미성년자만 획득할 수 있다거나, 특정한 성별의 경우에만 획득할 수 있다거나 등. 트레잇 정의 내에 potential = { } 섹션을 정의하면, 이런 의미로 동작하게 됩니다.
potential = { OR = { religion = norse_pagan religion = norse_pagan_reformed } }
단, 이 조건은 캐릭터가 랜덤으로 이 트레잇을 부여받을 때만 적용되며, 이벤트 등으로 해당 트레잇을 획득하는 경우에는 potential = { } 의 조건을 충족하지 못하였어도 획득이 가능합니다.
■ command_modifier = { } 섹션 : 전투 보정 모디파이어
이 트레잇을 가진 캐릭터가 전투 시 지휘관으로 나선 경우, 그가 지휘하는 부대의 각종 수치들 - 사기, 공격, 방어 수치 - 을 이 설정에 따라 보정하게 됩니다.
원본에서는 이 항목은 리더십 트레잇 쪽에 존재하는 경우가 많지만, 일반 트레잇 중에서도 이 항목을 가진 경우가 있습니다. (Brave 트레잇 등) 여기에 어떤 내용을 쓸 수 있는지는 다음 항목(효과 부분)에서 설명드리겠습니다.
■ 트레잇으로 부여 가능한 효과
트레잇을 통해 캐릭터에게 부여 가능한 효과는 상당 부분 캐릭터 모디파이어와 겹치지만, 일부 그 영역을 벗어나는 것이 있습니다. (목록으로 만들어 보면 생각보다 몇 개 안 됩니다)
이 내용은 위키에 명시된 내용 이외에, 원본의 트레잇 정의 파일을 분석하여 실제로 사용되고 있는 모든 항목을 추가한 것입니다.
1) 캐릭터 속성, 건강, 생식
캐릭터의 스탯, 건강, 생식력 등을 보정할 수 있습니다.
- diplomacy
- stewardship
- martial
- intrigue
- learning
- fertility
- health
2) 명성, 신앙심, 수입
매달 일정한 명성/신앙심/수입을 캐릭터가 얻게 해 줍니다.
- monthly_character_prestige
- monthly_character_piety
- monthly_character_wealth
3) 오피니언
각종 범주의 오피니언 수치를 보정할 수 있습니다.
- dynasty_opinion
- spouse_opinion
- twin_opinion
- vassal_opinion
- liege_opinion
- tribal_opinion
- same_opinion_if_same_religion
- same_opinion
- sex_appeal_opinion
- ambition_opinion
- same_religion_opinion
- infidel_opinion
- church_opinion
- muslim_opinion
- zoroastrian_opinion
- christian_church_opinion
4) 그 외
트레잇을 통해서 해당 캐릭터가 영주로서 가질 수 있는 직할령의 숫자를 늘릴 수 있다는 점이 특히 눈에 띄는군요.
- combat_rating
- global_tax_modifier
- demesne_size
5) AI 행동 경향
캐릭터 모디파이어 때에는 없었던 항목들이죠. 이 트레잇이 AI 에게 주어졌을 때 해당 AI 의 행동 경향을 보정합니다.
- ai_rationality : AI의 합리적 선택 경향
- ai_zeal : AI의 종교적 충돌에 의한 선택 경향
- ai_greed : AI의 금전적 고려에 의한 경향
- ai_honor : AI의 동맹/관계에 의한 경향
- ai_ambition : AI의 확장/호전적 경향
6) command_modifier 내에 쓸 수 있는 전투 지휘 보정 옵션
해당 캐릭터가 전투 지휘관으로 사용될 때에 그 부대에 적용될 모디파이어 항목들입니다. 원본에서는 리더십 트레잇에서 주로 정의되는 내용들이라고 말씀드렸었죠. 주요 내용들만 확인해보면 다음과 같습니다. 트레잇에서 이 항목들을 정의할 때에는 반드시 command_modifier = { } 내부에 기록되어야 합니다.
- morale_offence / morale_defence : 전투 시 아군의 사기 방어 / 적군의 사기 하락 정도를 보정합니다.
- damage / defence : 부대의 일반적인 공격력 / 방어력을 보정합니다.
- speed : 군대의 이동 속도를 보정합니다. 잽싸게 도망치고 날래게 추격합시다(?)
- 각 유닛 타입 (예: heavy_infantry) : 해당 유닛에 대해서 지휘 보너스를 얻습니다.
- siege : 공성 보너스. 공성에 소요되는 시간을 줄여줍니다.
- terrain = 지형(예: steppe, forest, plain, jungle, ...) : 지정한 지형에 대해서 지휘 보너스를 줍니다. (지휘 보너스 수치는 common/defines.lua 파일 내에 TERRAIN_SPEC_BONUS = 0.2 로 지정되어 있습니다. 즉 20%.)
- center / flank / narrow_flank : 중앙 또는 양 날개 부대를 지휘할 때에 얻는 지휘 보너스 수치를 정합니다. narrow_flank 의 경우 저도 설명이 조금 어려운데, 전투 중 가끔 좁은 측면이 뜰 때에 지휘 보너스를 받는 것이 아닌가 싶습니다.
- skirmish / melee / pursue : 전투 중 각 페이즈에 대해서 특정한 페이즈일 때에 얻게 되는 지휘 보너스를 정합니다.
그 외 나머지 모두에 대해서는 위키의 Command Modifiers 표를 참조하십시오.
command_modifier = { morale_defence = 0.1 center = 0.1 }
(4) 트레잇 아이콘 이미지 파일
모든 트레잇은 게임상에 표시하기 위한 트레잇 아이콘 이미지를 갖고 있어야 하죠. 앞에서도 말씀드렸듯이, 트레잇 아이콘 이미지는 gfx/traits 폴더 내에 모여 있습니다. 모드에서도 같은 위치가 되도록 폴더를 작성하시고 그 안에 이미지를 만들어 넣어주시면 됩니다. 파일 이름은 혼동을 막기 위해 보통은 해당 트레잇의 이름(ID)을 그대로 사용합니다만, 꼭 그래야 하는 것은 아닙니다.
아이콘 이미지는 다른 경우와 마찬가지로, 그 형식에 .DDS 형식을 사용합니다. 이미지 크기는 24x24 픽셀이며, 깔끔하게 보이도록 하기 위해 알파 채널이 설정되어 있어야 합니다. 이미 앞에서 디시전 아이콘을 만드는 방법을 설명드리면서 모두 한번씩 살펴봤던 내용이고, 이미지의 크기만 다를 뿐 디시전 아이콘을 만드는 것과 모든 내용이 동일합니다. 따라서 여기서는 별도로 설명드리지는 않습니다.
(5) 트레잇 아이콘 목록 파일
트레잇 정의 파일 이외에, 트레잇과 트레잇 아이콘을 연결해주는 트레잇 아이콘 목록 파일이 있습니다. 이 파일은 interface/traits.gfx 로 존재합니다. 아래는 그 일부분을 가져와 본 것입니다.
spriteTypes = { spriteType = { name = "GFX_trait_amateurish_plotter" texturefile = "gfx/traits/amateurish_plotter.tga" noOfFrames = 1 norefcount = yes effectFile = "gfx/FX/buttonstate.lua" } spriteType = { name = "GFX_trait_flamboyant_schemer" texturefile = "gfx/traits/flamboyant_schemer.tga" noOfFrames = 1 norefcount = yes effectFile = "gfx/FX/buttonstate.lua" } ... }
파일의 구조는 위와 같습니다. 이미 우리는 .gfx 파일을 다뤄본 적이 있기 때문에, 몇몇 항목은 눈에 익을 것입니다만, 지난번의 디시전 아이콘이나 이벤트 이미지 파일보다는 뭔가 설정 사항이 많아 보이죠? 다 신경쓸 필요 없이 그대로 적어주면 되고, 수정할 부분은 name 의 이름과 texturefile 의 파일 경로입니다.
- name 은 GFX_trait_ 뒤에 트레잇 이름을 적어줍니다. (예: GFX_trait_greedy)
- texturefile 은 실제 아이콘이 존재하는 경로를 적어줍니다. 일반적으로 트레잇 아이콘은 gfx/traits 폴더 내에 들어 있습니다.
- 아이콘 파일은 다른 파일과 마찬가지로 .DDS 파일 형식을 가지고 있습니다. (그런데 여기서도 .tga 로 적습니다.)
아이콘을 별도로 만들지 않으실 생각이라면, 위 아이콘 폴더에 가셔서 적당한 아이콘을 하나 고르신 후 새로 생성한 트레잇에 연결해 줘도 됩니다. (즉, 하나의 트레잇 아이콘에 여러 개의 트레잇이 연결되더라도 상관 없습니다. 플레이어가 헷갈리는 건 또 다른 문제지만.)
다른 .gfx 파일과 마찬가지로, 트레잇의 경우에도 새로운 항목을 추가하는 경우에는 원본의 파일 이름 대신 새로운 파일 이름을 사용하여 내용을 추가할 수 있습니다. 또한 위키에 의하면, .gfx 파일 내의 설정은 같은 name 값이 중복될 경우 무조건 나중에 읽혀진 값이 적용된다고 하므로, 기존의 내용을 모드에서 수정하는 경우에도 원본을 건드리지 않은 채 다른 파일에서 원본 값의 수정이 가능합니다. 원본의 해당 파일보다 모드의 파일이 나중에 읽히기만 한다면요. 이 내용은 1회에서 설명드린 내용이지만, 사실 좀 어려울 수 있는 내용입니다.
(6) 트레잇과 이벤트
트레잇의 이름은 그 자체로서 [그 트레잇을 가지고 있는 캐릭터] 라는 캐릭터 스코프로 사용할 수 있습니다. 만약 해당 트레잇이 cached = yes 옵션을 가지고 있다면 좀 더 효과적인 스코프 타겟팅이 가능합니다.
(7) 트레잇과 언어 파일
대개 언어 파일을 별도의 항목으로 다룰 때에는 뭔가 특별한 것이 있기 때문이었죠. 앞에서도 잠깐 언질을 드린 적이 있고요.
일단 - 다들 알고 계시겠지만 다시 한 번 말씀드리자면 - 트레잇도 다른 경우와 마찬가지로, 언어 파일에서 해당 트레잇과 연결하는 기준점은 이름입니다. 예를 들면, 용감한(Brave)의 경우, 언어 파일에 다음과 같이 정의되어 있지요.
brave;용감함;;;;;;;;;;;;x; brave_desc;이 자는 일신의 위험을 피하지 않습니다. 겁쟁이에게 질투를 받지만 (이하 생략).;;;;;;;;;;;;x;
트레잇 이름 뒤에 _desc 를 붙여서 그 설명을 붙이는 것까지 모두 동일합니다. 그러나, 트레잇의 경우 특별한 용법이 하나 있습니다. _death 라는 옵션이 그것입니다. 이미 11회에서 한 번 설명드린 적이 있긴 하지만, 특히 관련되는 내용이기에 간단하게 다시 한 번 설명드리겠습니다.
캐릭터가 사망할 때에는 사망의 이유가 있게 마련이고, CKII 에서도 사망의 이유가 항상 따라다닙니다. 캐릭터를 죽이는 명령어인 death = { } 에서도 사망의 이유(death_reason)를 정의하도록 하고 있고요. 그런데, 사망의 이유 중에서 death_trait 이 있었던 것을 기억하실지 모르겠습니다. 질병 또는 건강 수치를 급격히 줄이는 트레잇이 있는 상태에서 사망하는 경우, 해당 캐릭터는 그 이유로 사망한 것으로 처리되는데, 이것을 구현하는 것이 바로 사망 이유로서의 death_trait 이었습니다.
이를 활용하면 기존에 존재하는 사망 이유 이외에 새로운 사망 이유를 구현하는 것도 가능한데, 그 이유를 언어 파일에 정의할 때는, 트레잇 이름 뒤에 _death 를 붙여서 적습니다. 예를 들면 다음과 같습니다.
stressed_death;극심한 스트레스;;;;;;;;;;;;x; depressed_death;우울증;;;;;;;;;;;;x; ill_death;지병;;;;;;;;;;;;x; wounded_death;상처의 감염;;;;;;;;;;;;x;
예를 들면 폐렴(Pneumonic) 트레잇을 가지고 있는 상태에서 캐릭터가 사망하게 되면, 폐렴으로 사망했습니다 라고 사망 이유가 뜨게 되는 거죠.
(8) 경의와 모욕의 호칭
이 글을 시작하면서 처음에 보여드린 트레잇의 예시가 꽤 많았었죠. 거기에 나오는 모든 설정들을 지금까지 모두 설명을 해 드렸습니다만, 딱 한 가지를 빼놓은 게 있습니다. 위 예시 중 친절함(Kind) 트레잇의 설정에 보면 이런 부분이 있어요.
male_insult = INSULT_SOFT male_compliment_adj = COMPL_KINDLY female_compliment_adj = COMPL_KINDHEARTED
게임을 하면서 우리는 AI 로부터 수많은 편지를 받게 되는데 말입니다. 어떤 경우는 굉장히 정중한 편지를 받게 되는 경우도 있고, 선전포고의 편지처럼 매우 모욕적인 편지를 받게 되는 경우도 있습니다. 예를 들면 선전포고의 편지에서 플레이어를 호칭할 때에 모욕적인 수식어가 붙어 있는 경우가 많죠? 바로 그 부분인데, 특정한 트레잇을 가지고 있다면 특정한 모욕 또는 경의의 수식어를 붙인 편지가 날아오게 되는 겁니다.
형식은 매우 간단합니다. 일단 남성/여성에 따라서 male/female 을 앞에 붙이고, 그 뒤에 이것이 경의의 표현이라면 _compliment 를, 모욕의 표현이라면 _insult 를 붙이면 됩니다. _adj 를 뒤에 추가로 붙이면, compliment 는 긍정적인 수식어로, insult 는 부정적인 수식어로 쓰이게 됩니다. 값은 언어 파일의 메시지 ID 를 받으므로, 그 값을 메시지 ID 로 해서 언어 파일에 작성하면 됩니다.
예를 들면, 일곱 개의 미덕 중 첫 번째에 위치한 순결함(Chaste) 트레잇의 경우, 이렇게 되어 있습니다.
male_compliment_adj = COMPL_CHASTE female_compliment_adj = COMPL_CHASTE male_insult = INSULT_PRUDE female_insult = INSULT_PRUNE female_insult_adj = INSULT_PRUDISH
네. 미덕 트레잇이지만, 경의와 모욕이 모두 있네요. 남성의 경우 경의의(긍정적인) 수식어로 COMPL_CHASTE, 모욕적인 표현으로 INSULT_PRUDE 가 있고, 여성의 경우 경의의(긍정적인) 수식어로 COMPL_CHASTE, 모욕의(부정적인) 수식어로 INSULT_PRUDISH, 모욕적인 표현으로 INSULT_PRUNE 이 정의되어 있어요. 언어 파일을 열어 보시면 바로 감이 오실 겁니다.
COMPL_CHASTE;순결함;;;;;;;;;;;;x; INSULT_PRUDE;내숭떠는;;;;;;;;;;;;x; INSULT_PRUNE;얼간이;;;;;;;;;;;;x; INSULT_PRUDISH;고상한척하는;;;;;;;;;;;;x;
...같은 것을 보고도 참 다양한 해석이 가능하다는 걸 이런 데서도 느끼게 해 주네요.
댓글
댓글 리스트-
답댓글 작성자가필드 작성시간 16.11.28 그 과정이 저같은 까막눈에게는 토나오게 어려워보여서요...
설령 다 만든다고 쳐도 치트가 없는 이상 그걸 어떻게 캐릭터에게 입히는 지도 모르겠고...
아 근데 혹시 천재나 영재, 강인함 같은 유전적인 트레잇은 이벤트로 등장하지 않는 트레잇인가요?
이벤트로 등장하지 않는 트레잇을 수정한 다음에 birth = 0, random = no로 바꿔버리고 플레이어에게만 적용시킨다면 플레이어 고유의 트레잇이 되지 않을까요?
고수님의 의견을 묻고 싶습니다... -
답댓글 작성자tacitus 작성자 본인 여부 작성자 작성시간 16.11.28 0. 진짜 고수님들은 지금 다 숨어 계십니다. 전 중수의 중간쯤도 안 돼요.
1. random = no 를 사용한다면, birth = 0 은 굳이 붙일 필요 없습니다.
2. 지금 검색해보니, strong, quick, genius 를 부여하는 이벤트가 존재합니다. 대부분 최근 사신의 수확에서 집중적으로 추가되었으나, 이전에 추가된 이벤트도 있네요.
3. 플레이어에게 특정한 트레잇을 부여하는 이벤트는 간단히 작성할 수 있습니다만, 역시 모딩의 기본을 어느 정도 아시는 분들에게만 그럴 겁니다. 이 모딩 가이드는 따라하기 방식의 편한 가이드는 아니다 보니, 보시는 분들이 그런 어려움이 있다는 걸 어느 정도 인지는 하고 있습니다만.. 강좌 보강할 시간이.. ㅠㅠ -
답댓글 작성자tacitus 작성자 본인 여부 작성자 작성시간 16.11.28 그나마 최근에 조금 수정/개정한 게 네이버 쪽 가이드인데 (네이버 가이드 중에 가장 최근에 수정한 게 트레잇일 겁니다. 아마.) 그쪽은 최근에 쓴 것이다 보니 더 읽을거리가 많아서... ㅋㅋㅋ.... 제 성격상 "이대로 따라하시면 됩니다~ 참 쉽죠?~" 식의 따라하기 가이드는 쓰기가 힘들다 보니 참 어렵네요. 저처럼 본격적으로 모드를 만들고 유지하려는 게 아니라 소소하게 여기저기 수정해가면서 쓰실 분들에게 제 가이드는 상당히 불친절한 가이드일 수밖에 없나 봅니다.
-
답댓글 작성자가필드 작성시간 16.11.28 아니요! 설명은 정말 잘해주셨습니다. 제가 보기에도 이보다 더 설명 깔끔하게 하시는 분이 없을 것 같네요.
다만 제가 워낙 이런 방면에서 까막눈이라 어려워하는거지 다른 회원분들은 tacitus님의 글을 보고 많이 배우셨을겁니다.
저도 모딩에 대해서 완전 생초보였는데 그래도 tacitus님의 글을 보고 이렇게 트레잇 수정, 병종 수정, 이벤트 수정 등을 할 수 있게 되었으니까요.
귀찮으실텐데 친절한 답변까지 달아주시고 정말 감사합니다. 좋은 하루 보내세요. ^^ -
작성자샤른호스트 작성시간 18.08.03 오 정말 좋은 강좌네요. 감사합니다.