CAFE

CK 모드 게시판

[CK2 모딩 팁]내멋대로 쓰는 Crusader King 2 모딩 매뉴얼 (21) 참사회 및 참사회 임무 모딩 (2015/03/12 수정)

작성자tacitus|작성시간15.02.26|조회수1,587 목록 댓글 11

내멋대로 쓰는 Crusader Kings 2 모딩 매뉴얼

14. 참사회 모딩

(1) 서설

네. 그만 쓴다더니 별 쓸데없는 데를 다 쓸고 다닙니다.

참사회.. 제 경우는 참사회 기능을 제대로 써 본 기억이 별로 없습니다. 클레임 위조, 기술 훔치기, 건설 감독, 첩보, 관계 개선, 개종, 반란 예방... 말이 그렇지 그럭저럭 제법 써왔네요? 그러나, 그 중에서도 각각 플레이어의 성향에 따라서 잘 안 쓰는 기능들이 꼭 하나 정도는 있을 겁니다. 그리고 있을지는 모르겠지만, 참사회 기능 중에 이런 게 있었으면 좋겠다고 생각하시는 기능들이 하나 정도는 있을지도.. 예를 들면, 첩보관의 임무 중에 특정한 자를 납치해오는 임무라던가, 특정한 자를 암살하는 임무라던가... -_-;;; 네. 타겟의 설정만 가능하다면, 이런 모딩도 가능합니다.

기본적으로, 참사회 멤버의 자격을 변경하거나, 참사회 임무 목록을 변경하거나, 참사회 임무의 구체적인 동작을 변경하는 등의 모딩이 당연히 가능합니다. 게다가, 기본 5인 참사회원 이외에 새로운 참사회원을 추가하는 것도 가능합니다. (초판에는 이 부분이 불가능하다고 되어 있었습니다만, 사실 가능합니다.) 다만 기본적으로 정의되어 있는 참사회원과 비교할 때에 약간 제약이 따르긴 합니다.

중요한 것은, 참사회원의 인원 구성과 관련된 부분에는 potential = { } 섹션을 사용할 수 없기 때문에, 플레이어냐 AI냐에 따라서 해당 참사회원 요소를 사용할지 말지를 차별할 수가 없습니다. 즉, 플레이어가 편하자고 사기적인 요소를 막 집어넣으면 그 요소들을 AI 들도 막 쓸 거라는 겁니다. 잘못 집어넣으면 제 꾀에 제가 넘어갈 수 있습니다.

다만, 꼼수를 써서 AI 가 새로 만들어 넣은 참사회 구성원을 임명하지 못하도록 하거나, 임명은 하지만 임무는 못 준다 식으로 돌려막기를 하는 방법은 있습니다.

그래서 이번에는 참사회의 이벤트 쪽을 다 파헤쳐 볼 겁니다.

(2) 참사회 데이터 및 이벤트의 구조

기본적으로 참사회 이벤트들은 다음과 같은 구조를 가지고 있습니다.

  • /common/job_titles.txt : 참사회 멤버가 되기 위한 조건을 규정하는 파일
  • /common/job_actions.txt : 참사회 멤버의 임무 이벤트를 총괄적으로 규정하는 파일
  • /interface/domestic_court.gfx : 참사회 멤버의 임무 선택 아이콘을 지정하는 파일
  • /interface/avatars.gfx : 참사회 멤버가 임무를 수행 중인 경우 맵상에 그려주는 참사회원의 아바타를 정의하는 파일

참사회 관련한 것들을 건드리려면 기본적으로 위의 세 개의 파일을 건드리게 됩니다. 물론 실제 이벤트를 실행하는 이벤트 파일, 그리고 아이콘 이미지 파일은 당연히 추가적으로 생각해야겠죠. 만약 새로운 참사회 멤버를 구성하는 데까지 이른다면 네 번째의 파일의 수정까지도 필요해집니다.

(3) 참사회 타이틀

일단 참사회의 멤버가 되기 위한 조건을 규정하는 job_titles.txt 파일을 먼저 살펴보도록 하겠습니다. 이 파일은 열어보시면 아시겠지만, 과거에 본 적이 있는 마이너 타이틀 파일과 구조와 사용되는 명령어가 매우 비슷합니다. 아래의 예시는 job_titles.txt 에서 재상에 관한 부분만 잘라본 겁니다.

job_chancellor = {
  is_chancellor = yes
  attribute = diplomacy
  dignity = 0.33
  opinion_effect = 15
  
  monthly_salary = 0.1
  monthly_prestige = 0.015
  
  allow = {
    OR = {
      AND = {
        OR = {
          is_female = no
          AND = {
            religion = cathar
            liege = { religion = cathar }
          }
        }
        is_adult = yes
      }
      has_character_flag = special_chancellor
    }
    
    prisoner = no
    NOT = { trait = incapable }
    NOT = { trait = in_hiding }
  }
  gain_effect = {
  }
  lose_effect = {
    opinion = { who = FROM modifier = opinion_fired_from_council }
  }
  
  action = action_improve_relations
  action = action_fabricate_claims
  action = action_sow_dissent

  lift_fow = yes
}

어떤가요? 진짜로 구조가 똑같죠? 특징이 있다면, 첫 줄의 is_chancellor = yes, 둘째 줄의 attribute = diplomacy 항목. 그리고 아랫부분의 action = 라인, lift_fow = yes 항목. 그리고 보통 규정되지 않았던 lose_effect = { } 섹션에 규정이 있다는 것 정도겠네요. 그 외에는 마이너 타이틀의 모딩에서 이미 다 설명드렸던 내용입니다. 그 때 보지 않았던 내용들만 한번 확인해 볼까요.

  • is_chancellor = yes : 이 타이틀이 참사회의 재상 타이틀이라는 것을 다시 한 번 확인하는 줄입니다. 대장군의 경우 is_marshal = yes 와 같은 줄이 존재하는 것을 확인하실 수 있을 겁니다.

기존 5종 이외에 다른 참사회원을 구성하는 경우에는 이 줄은 제외하시면 됩니다.

  • attribute = diplomacy : 이 부분에 대해서 만족할만한 설명을 찾지는 못했습니다. 다만, 각 참사회의 멤버들은 각각 자기 자신의 능력치 중 일부를 국가 능력치에 더하게 되는데, 어떤 능력치를 더할지를 정하는 항목인 것 같습니다. (예를 들면 대장군의 경우 attribute = martial 이라고 되어 있죠.)

  • action = : 그 참사회 멤버가 할 수 있는 일들을 정합니다. 그 원 안에 세 개 나오는 임무들 있죠? 그것을 정하는 겁니다. 보면 3개를 넘는 경우도 있는데, 이런 경우는 일부 임무가 조건이 걸려 있는 경우입니다. 예를 들면 부족정인 경우에 사용할 수 있는 임무와 봉건제일 경우 사용할 수 임무가 구분되어 있는 경우가 있거든요(특히 Spiritual의 경우가 그러하죠).

  • lift_fow = yes : 맵에서 자신의 영토가 아닌 곳을 보면 안개 같은 걸로 뿌옇게 되어 있어서 보이지 않게 되어 있죠? 이런 경우에 이 참사회 멤버가 그 프로빈스에 임무를 하러 가면 그 프로빈스 부분의 안개가 걷혀서 들여다보이게 되는데, 이것을 설정하는 겁니다. 참사회 중 Spymaster 의 경우에는 lift_neighbor_fow = yes 라고 되어 있는데, 해당 프로빈스와 함께 그 이웃하는 프로빈스까지 밝히게 됩니다.

  • gain_effect = { } : 이미 아시는 대로, 여기에 적는 내용은 그 캐릭터가 참사회 멤버가 됐을 때에 얻게 되는 효과입니다. FROM 은 플레이어(임명권자), ROOT 는 참사회 멤버가 된 자죠.

  • lose_effect = { } : 이것도 마찬가지. 그 캐릭터가 참사회 멤버에서 잘리면 실행하게 되는 부분입니다. 보통은 참사회에서 잘렸을 때에 오피니언 수치가 깎이는 데, 이 내용이 정의되어 있습니다. 마찬가지로 FROM 은 플레이어, ROOT 는 참사회 멤버에서 잘린 자입니다.

지금까지 길고 긴 여정을 함께 해오신 분들이라면 이 내용들이 전혀 낯설지도 어렵지도 않을 것입니다. 자, 그럼 이 파일들을 어떻게 모딩하면 좋을까요? 포인트는 두 군뎁니다. allow = { } 부분을 수정해서 참사회의 멤버가 될 자격을 변경하는 것, 그리고 action = 을 통해서 기존의 임무를 수정하거나 새로운 임무를 추가하는 것.

allow = 의 수정은, 일반적으로는 능력치가 높은 여성을 참사회의 멤버로 앉히고 싶은 경우에 주로 찾게 될 겁니다. 다만 주의할 점은, 여기서 설정하는 내용은 플레이어 뿐만 아니라 모든 AI 에게도 적용되는 부분입니다. 따라서, 조건을 만드실 때에 주의하실 필요가 있습니다.

여기서 특이점은, 모든 참사회 멤버의 자격 부분에 OR = { } 로 has_character_flag = special_chancellor 와 같이, 캐릭터 플래그로 특별 참사회 멤버 자격 플래그가 있다는 것입니다. 예를 들어 재상의 경우, special_chancellor 캐릭터 플래그를 가지고 있다면 여성이나 미성년자라도 재상이 될 수 있습니다. 비슷하게, 첩보관의 경우 special_spymaster 캐릭터 플래그를 가지고 있다면 다른 자격 요건에 관계 없이 첩보관이 될 수 있죠. 단지 특정 캐릭터를 특정 참사회 자리에 앉히고 싶은 것이라면, 조건 자체를 수정하는 것보다 해당 캐릭터에 대해서 special_ 플래그를 달아 주는 방법을 쓰는 것이 더 안전합니다.

다음은 새로운 임무를 추가하거나 기존 임무를 수정하는 것인데, 이에 대해서는 다음 절을 보시면 되겠습니다.

(4) 참사회 임무 파일

참사회 임무는 위에서 보셨다시피 job_titles.txt 에서 각 참사회 멤버마다 규정이 되어 있습니다. 그리고, 그 각각의 임무들은 다시 job_actions.txt 에서 세부적인 내용이 규정되어 있죠.

일단 무대포로 파일을 열어 보겠습니다. 아래의 예시는 재상의 임무 중 하나인 클레임 위조하기 임무의 예입니다.

action_fabricate_claims = {
  attribute = diplomacy
	
  trigger = {
    any_province_lord = {
      NOT = { character = FROM }
    }
    is_within_diplo_range = FROM
  }
	
  events = { 913 914 }
}

너무 단순해서 실망하셨죠? action_fabricate_claims 이라는 이름은 아까 job_titles.txt 에서 action = 뒤에 지정한 이름을 그대로 사용한 것입니다. 참고로 언어 파일에서 이 액션의 이름을 보여줄 때도 같이 씁니다. 아래는 그 예예요. 이런 식으로 쓰게 됩니다. 설명은 뒤에 _desc 붙이는 것까지 다 똑같습니다!

action_fabricate_claims;클레임을 날조하여 만들기;;;;;;;;;;;;x;
action_fabricate_claims_desc;[GetChancellorName]에게 토착 영주의 (이하생략).;;;;;;;;;;;;x;
  • is_within_diplo_range = FROM : 여기서 FROM 은 플레이어이므로 특별히 다룰 게 없고, 문제는 is_within_diplo_range 라는 조건문이 뭐 하는 조건문이냐 라는 게 문제겠네요. 정확한 내용을 다룬 문서는 존재하지 않습니다만, 기본적으로는 현재의 플레이어 수도로부터 일정한 거리 내에 있는 프로빈스에만 영향을 미치도록 하는 조건문입니다. 즉, 현재 플레이어로부터 지나치게 멀리 떨어진 곳에는 파견이 불가능하다는 이야기죠. 2.1 버전에서 투입된 트리거 조건문입니다.

그런데, 그럼 대체 실제 어떤 일이 벌어지는지는 어디에 있을까요? 비밀은 하단의 events = { } 에 있습니다. 여기에 기록되는 이벤트 ID 가 실제로 임무 중 실행되는 이벤트들이예요. 즉 913 과 914 이벤트 두 개가 이 임무 중에 실행이 된다는 이야깁니다. 결론적으로 구체적인 내용들은 모두 이벤트 파일에 떠넘긴다는 겁니다.

이처럼 모든 것을 이벤트 파일에 떠넘기는 형태 덕분에, 플레이어가 새로운 임무를 만들기도 상당히 쉽습니다. 그냥 지금까지 보아왔던 것처럼 설정하고 난 후 구체적인 실행은 이벤트에 맡기면 되거든요. 만약 해당 임무 때에 발생하는 이벤트를 더 추가하고 싶다면 별도의 이벤트를 작성한 후, events = { } 안에 해당 이벤트 번호를 추가하면 되는 겁니다.

(5) 참사회 개별 임무 이벤트 파일

각 참사회 멤버의 임무에 관한 개별 이벤트들은 원본의 다음 파일들에 지정되어 있습니다. (즉, 위에서 예를 든 913, 914 같은 이벤트들이 여기에 정의되어 있다는 겁니다.)

  • 재상(chancellor) : /events/job_chancellor.txt
  • 대장군(marshal) : /events/job_marshal.txt
  • 재무관(treasurer) : /events/job_steward.txt
  • 첩보관(spymaster) : /events/job_spymaster.txt
  • 예언자(spiritual) : /events/job_lord_spiritual.txt

해당 파일은 일반적인 이벤트의 형식으로 기록되어 있기 때문에, 특별히 설명에서 추가해야 할 내용은 없습니다. 다만, 현재 어떤 임무를 하고 있는지에 대한 조건문으로 has_job_action = 임무 ID 의 조건문이 있다는 점은 하나 짚고 넘어가겠습니다.

has_job_action = action_fabricate_claims

/events/job_chancellor.txt 파일을 열어서 EVENT 913 을 보시면, 대체 그놈의 재상이 왜 그렇게 클레임을 못 물어오는지 실감하실 수 있을 겁니다. 무려 MTTH 값이 months = 360 이예요. 즉 클레임 하나 물어오는데 기본 시간으로 설정된 값이 평균 30년.. Diplomacy 값이 10 이상이면 거기서 조금씩 줄어들기 시작해서, 최상급인 Diplomacy 값이 20 혹은 그 이상인 재상을 사용하는 경우 약 62.79(월), 그러니까 약 5년 하고 몇 개월까지 줄어든다는 거죠. 능력치 좋은 재상을 써야 하는 이유가 바로 나오죠? ^^

아, 이 참사회 임무의 개별 이벤트에서 첫 이벤트(예를 들면 위에서 913 914 같이 참사회 임무 파일에서 바로 이어지는 이벤트)의 ROOT 는 해당 참사회 멤버입니다. FROM 은 사용되지 않습니다.

(6) 참사회 임무 아이콘 설정 파일

참사회 임무를 선택하기 위해서 누르게 되는 버튼 아이콘 있죠? 그건 /interface/domestic_court.gfx 에 정의되어 있습니다. 위에서부터 몇 줄 내려오면, ### job buttons 이라고 주석이 있을 겁니다. 그 아래쪽의 내용들이 다 임무 아이콘들입니다. 구조는 많이 봤던 형식이죠?

  spriteType = {
    name = "GFX_action_fabricate_claims"
    texturefile = "gfx\\interface\\job_fabricate_claims.dds"
    noOfFrames = 2
  }

name 값은 GFX_ 뒤에 해당 임무의 ID 를 붙여서 입력하면 됩니다. 이것도 익숙한 거죠? 디시전 아이콘의 지정 방식과 똑같으니까요. noOfFrames 값이 2인 이유는, 아이콘이 눌렸을 때와 보통일 때, 두 가지의 아이콘이 필요하기 때문입니다. 그렇게 두 개의 아이콘이 한 파일에 저장되어 있는 구조, 낯설지 않으시죠?

(7) 참사회 임무 아이콘 파일

바로 위에 예를 든, gfx\interface\job_fabricate_claims.dds 파일을 XnView 나 지난 회에 소개한 Paint.NET 같은 프로그램으로 한번 열어보십시오. 이 파일을 열어보시면, 두 개의 아이콘이 하나의 파일 안에 붙어있는 것을 보실 수 있으실 것입니다. 하나의 아이콘은 40x40 사이즈이지만, 디자인이 원형이죠. 아이콘이 두 개 들어가므로, 하나의 파일의 크기는 80x40 사이즈로 구성되어 있습니다.

다른 아이콘과의 조화를 위해서, 이 파일은 완전히 새로 만드시는 것보다는, 기존 파일을 하나 읽어서 버튼 이미지를 수정하고 다른 이름으로 저장하는 방법으로 작업하시는 것이 좋겠습니다.

기본적으로 이 아이콘 파일의 수정과 관련해서는 특별히 추가해야 할 내용이 없습니다. 지난 회에 본 다른 아이콘의 수정 방법을 그대로 적용하면 됩니다.

(8) 참사회 아바타 정의 파일

만약 다섯 가지 기본 참사회 멤버 외에 다른 종류의 참사회 멤버를 구성하려는 경우, 위의 모든 것을 추가하는 것 이외에, 참사회원이 임무 중인 경우에 맵에 표시할 아바타 액션을 정의해줄 필요도 있습니다. (이게 정의되지 않으면 임무를 주는 순간 크래시가 발생합니다. 맵에 뿌려줄 유닛이 정의되지 않았기 때문이죠.)

이 내용이 정의되어 있는 interface/avatars.gfx 파일은 사실 전에 새로운 병종을 추가할 때 한 번 수정한 적이 있는 파일입니다. 이런 형식으로 추가되어 있죠. 아래는 Spymaster 의 예시입니다.

  EMFXActorType = {
    name = "westerngfx_job_spymaster"
    actorfile = "gfx\models\Mapindicators\Western_spymaster.xac"
		
    idle   = "gfx\models\Mapindicators\Western_spymaster_idle.xsm"
    scale = 1.0f
  }

마찬가지로 구체적인 모션은 .xac 파일, .xsm 파일을 수정해야 하는 일이라서, 일반적으로는 건드리기 어려운 파일입니다. 기존에 존재하는 5가지 멤버들 중에서 적당한 것 하나를 골라서 지정해 주시고, name 부분만 바꿔 주세요. 대개 western, eastern, muslim 이렇게 세 개 정도의 gfx 가 정의되어 있으니, 그 정도만 정의해 주시면 될 겁니다.

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
  • 답댓글 작성자tacitus 작성자 본인 여부 작성자 | 작성시간 16.03.15 allow = { } 에 liege = { ai = no } 를 지정하면 되긴 합니다. 그럼 AI 의 경우에는 임명할 수 있는 사람이 아무도 없게 되니까요. 다만 그렇게 했을 때에 AI 들에게 어떤 영향이 있을지는 저도 잘 모르겠습니다.
  • 답댓글 작성자연두별 | 작성시간 16.03.15 오 감사합니당... 한번 해봐야겠습니다
  • 작성자꽃길별길 | 작성시간 17.01.08 음, 그러면 저 mtth =360에서 360만 바꿔줘도 클레임 조작 확률이 올라갈까요?
  • 답댓글 작성자tacitus 작성자 본인 여부 작성자 | 작성시간 17.01.08 그렇습니다. 고아원 모드의 특수능력 고아(위조) 구현 부분을 참조하십시오.
  • 답댓글 작성자꽃길별길 | 작성시간 17.01.09 감사합니다!
댓글 전체보기

CK 모드 게시판 다른글

현재페이지 1234
맨위로

카페 검색

카페 검색어 입력폼