CAFE

CK 모드 게시판

[CK2 모딩 팁]내멋대로 쓰는 Crusader King 2 모딩 매뉴얼 (11) 변수, 분류별 주요 명령어 및 조건문 - 개정판 (2015/05/08 수정)

작성자tacitus|작성시간15.02.15|조회수3,868 목록 댓글 2

내멋대로 쓰는 Crusader Kings 2 모딩 매뉴얼 - 개정판

5. 이벤트 파일의 작성

(9) 변수

사실, 이 글을 쓰면서 변수에 대한 생각은 거의 하지 않고 있었습니다. 그 정도로 CKII 모드에서 사용자 지정 변수에 대한 지원은 극히 미약했습니다. 최근 버전에서 많이 보강되기는 했습니다만, 여전히 그 활용도는 많이 떨어집니다.

제가 생각하는 가장 큰 문제는, 이 변수의 숫자값을 다른 항목(예를 들면 wealth 라던가, piety 라던가...)에 바로 입력해 넣을 수가 없다는 것입니다. 단순히 어떠한 상태를 체크하는 내부용 변수로나 사용하는 정도로만 활용될 수 있는 실정이죠.

현재 원본에서는 이 사용자 변수의 사용은 거의 이루어지지 않고 있습니다. 일부 이벤트에서 내부 정보 확인용으로 사용되긴 해요.

다만, 2.3.0 버전에서부터, 이 사용자 변수의 내용을 Localisation 파일에서 출력할 수 있는 방법이 추가되었습니다. 이로 인해 조금은 그 활용 여지가 넓어질 여지가 생겼습니다. (이 내용은 위키에 문서화가 되어 있지 않으며, 원본에도 사용되지 않았습니다. 대체 왜 이런 중요한 기능이 문서화가 안 되어 있는 건지...)

■ 변수 값의 설정 및 증감

우선 변수는, 세 가지의 스코프에서 설정될 수 있습니다: 캐릭터, 프로빈스, 타이틀. 마치 플래그처럼 해당 캐릭터나 프로빈스, 타이틀 스코프를 통해서만 값을 읽을 수 있고요.

  • 값의 설정 : set_variable = { which = "variable_name" value = 0 }
    (변수 variable_name 의 값을 0으로 설정한다.)
  • 값의 증가 : change_variable = { which = "variable_name" value = 3 }
    (변수 variable_name 의 값에 3을 더한다.)
  • 값의 감소 : subtract_variable = { which = "variable_name" value = 1 }
    (변수 variable_name 의 값에서 1을 뺀다.)
  • 변수값의 곱셈 : multiply_variable = { which = "variable_name" value = 2 }
    (변수 variable_name 의 값에 2을 곱한다.)
  • 변수값의 나눗셈 : divide_variable = { which = "variable_name" value = 2 }
    (변수 variable_name 의 값을 2로 나눈다.)

■ 변수값의 확인

설정한 변수 내에 들어 있는 값은 두 종류의 조건문으로 확인이 가능합니다. 우선 일반적인 조건문으로, 다른 조건문에서와 마찬가지로 크거나 같다 연산으로 확인하는 방법입니다.

if = {
  limit = {
    check_variable = { which = "variable_name" value = 5 }
  }
  ...
}

위 코드는 변수 variable_name 의 값이 5보다 크거나 같은지 확인하는 구문입니다.

그런데 최근 버전에서, 일반적인 경우와 다르게 변수 값이 "정확히" 어떤 값인지를 확인하는 조건문이 추가되었습니다. 아래는 그 예제입니다.

if = {
  limit = {
    is_variable_equal = { which = "variable_name" value = 5 }
  }
  ...
}

위 코드는 변수 variable_name 의 값이 정확히 5인지를 확인합니다.

■ 언어 파일에서 변수값의 출력

2.3.0 버전에서부터 언어 파일에서 사용자 변수의 변수값을 이벤트나 툴팁 등의 메시지에 표시할 수 있도록 하는 명령어가 추가되었습니다. GetValue 인데요. 변수 이름.GetValue 와 같은 형식으로 사용합니다. 예를 들면..

# 변수의 이름은 위의 예에서 들었던 variable_name 으로 하겠습니다. 이 변수는 ROOT 캐릭터에 저장되어 있습니다.
EVT_TEST;테스트용 이벤트 변수의 값은 [Root.variable_name.GetValue] 입니다.

스코프는 Root, From, FromFrom 등, 해당 변수가 저장된 캐릭터의 스코프에 맞춰 쓰시면 됩니다. (이 기능이 추가되면서 변수의 활용도가 조금 넓어졌습니다. 단순한 내부용 변수라고 하더라도, 그 값을 사용자에게 보여줄 수 있는가의 여부에 따라서 활용도는 천지차이가 되니까요.)

(10) 분야별로 정리한 많이 쓰이는 조건문 및 명령어들

이제 이벤트와 관련하여 봐야 할 부분은 다 본 것 같습니다. 그런데 이대로 마무리하기는 뭔가 좀 아쉽네요. 무언가 덧붙일 만한 내용이 있을까 하고 생각하다가, 디시전과 이벤트를 다 봤으니, 여기에 사용할 수 있는 상황별 조건문 및 명령어들 중 자주 쓰일 만한 것들을 선별해서 한번 정리해 보는 것도 좋을 것 같았습니다.

앞에서 별도의 주제로 잡아서 자세히 다뤘던 명령어들이나 조건문들은 특별히 추가할 내용이 존재하지 않는 한 생략합니다.

다만 제가 사용해 보지 않은 명령어나 조건문들은 웬만해서는 소개하기 어려울 것 같고, 그런 부분은 직접 위키를 참조하시기 바랍니다.

  • 위키의 조건문 표 : 링크
  • 위키의 명령어 표 : 링크

표를 보는 법에 대해서 앞에서 간단히 설명은 드렸었습니다만, 다시 한 번 강조드립니다. 다음의 항목들을 항상 주의하면서 보십시오.

  • Used from scope : 이 명령어 또는 조건문을 "어떤 스코프 내에서" 사용할 수 있는가를 보여줍니다. 알맞은 스코프가 아니라면 명령어 또는 조건문이 동작하지 않으므로 주의하십시오.
  • Value type : 이 명령어 또는 조건문이 "어떤 값을 받을 수 있는지" 를 보여줍니다. 숫자를 받는지, 구를 받는지, Yes/No(BOOL)를 받는지에 맞추어 적절한 값을 적용해줘야 하겠죠.
  • Used in vanilla : 원본 게임에서도 사용하고 있는 명령어 또는 조건문인지를 알려줍니다. 체크되어 있지 않은 조건문 또는 명령어라면 사용하지 않는 것이 정신건강에 이롭습니다. (원본에서 사용되지 않은 조건문이나 명령어는 버그가 있는 경우가 종종 있습니다.)

참고로, 저걸 다 기억할 필요는 당연히 없습니다. 대충 이런 게 가능하다 정도만 알아두시면 필요할 때마다 찾아가면서 쓸 수 있잖아요? 안 그래도 기억할 게 많은데, 이런 걸로 두뇌에 스트레스를 가중시킬 필요는 없습니다. (근데 사실 몇 번 작성하다 보면 많이 쓰는 코드들은 그냥 손에 익어요.)

그럼, 시작합니다!

■ 캐릭터 정보 관련

캐릭터와 관련된 명령어이므로 확인 또는 변경하려는 캐릭터의 스코프에서 사용합니다.

1) 캐릭터의 외교력, 무력, 관리력, 음모력, 학력 값을 확인하는 조건문
  • diplomacy = 숫자
  • martial = 숫자
  • stewardship = 숫자
  • intrigue = 숫자
  • learning = 숫자

아래는 스코프 캐릭터의 외교력(diplomacy) 값이 6 이상인지를 확인하는 예시입니다.

if = {
  limit = {
    diplomacy = 6
  }
  ...
}
2) 캐릭터의 외교력, 무력, 관리력, 음모력, 학력 값의 변경

조건문과 달리 각각의 스탯 이름 앞에 change_ 를 붙입니다. (이걸 change_ 를 떼고 쓰는 실수를 굉장히 자주 하게 됩니다. 이 경우 오류는 발생하지 않지만, 물론 적용도 되지 않습니다.) 숫자를 음수로 지정하면 해당 수치가 그 만큼 감소합니다.

  • change_diplomacy = 숫자
  • change_martial = 숫자
  • change_stewardship = 숫자
  • change_intrigue = 숫자
  • change_learning = 숫자

아래는 예시입니다.

change_diplomacy = 1
change_martial = 5
change_stewardship = -2
change_intrigue = 3
change_learning = -1
3) 두 캐릭터의 외교력, 무력, 관리력, 음모력, 학력 값을 비교하는 조건문

현재의 스코프 캐릭터와 다른 캐릭터(ROOT,FROM,PREV 등으로 지정 가능한 캐릭터)의 외교력, 무력, 관리력, 음모력, 학력 값을 서로 비교할 수 있습니다. attribute_diff = { } 조건문을 사용하면 됩니다.

  • 기본적으로, 스코프의 캐릭터의 속성값 - character 지정 캐릭터의 속성값 ≥ value 지정값 의 공식을 만족하는 경우(등호는 이런 경우 대부분 크거나 같다)에 참이 됩니다. 만약 반대로 가려면 NOT = { } 을 전체로 묶어주면 됩니다.
  • value 값이 0 이면 단순히 어느 쪽이 큰지 작은지를 보게 되고(이 경우 간단히, 스코프 캐릭터가 더 큰 값이라면 참이 된다고 알아두면 됩니다), 0이 아닌 경우 두 캐릭터 간의 값의 차이가 얼마 이상인지 아닌지를 보게 됩니다.

아래의 예시는, 스코프 캐릭터의 Learning 값과 FROM 캐릭터의 Learning 값을 비교해서, FROM 캐릭터의 Learning 값이 더 큰 경우(NOT = { } 으로 묶었으므로, 같은 경우에도 거짓이 됩니다)에 이벤트를 실행시키기 위한 트리거 조건이 되겠습니다.

trigger = {
  NOT = {
    attribute_diff = {
      attribute = learning
      character = FROM
      value = 0
    }
  }
}
4) 캐릭터의 나이를 확인하거나 비교하는 조건문
  • 일반적인 나이 확인은 age 조건문을 사용합니다.
  • 성인인지 여부를 확인하기 위해서는 is_adult = yes/no 조건문을 사용합니다.

is_adult = yes 는 age = 16 과 동일한 효과입니다.

아래 예시는, 스코프 캐릭터가 8세 이상이고, 아직 성인은 아닌 경우를 판단합니다. (즉 8~15세 사이인 경우에 이 조건문은 참이 됩니다.)

if = {
  limit = {
    age = 8
    is_adult = no
  }
  ...
}
  • 나이에 관련한 조건을 Pre-Trigger 로 사용할 수 있습니다. age, min_age, max_age 를 사용할 수 있는데, min_age, max_age 의 경우 오직 Pre-Trigger 로만 사용이 가능하고 조건문에서는 사용이 불가능합니다.

  • 캐릭터 간 나이를 비교 : age_diff = { } 를 사용하여, 두 캐릭터 간 나이 차이를 조건문으로 만들 수 있습니다. 어느 쪽이 더 나이가 많은지를 확인하는 is_older_than 조건문을 함께 사용하면 성공적인 나이 비교가 가능하겠군요.

아래 예시는, FROMFROM 과 ROOT 의 나이 차이가 10살 이상이고, FROMFROM 이 ROOT보다 나이가 많은 경우에 참이 되는 예입니다.

trigger = {
  FROMFROM = {
    age_diff = {
      who = ROOT
      years = 10
    }
    is_older_than = ROOT
  }
}
5) 캐릭터의 성별을 확인하거나 비교하는 조건문
  • 성별 확인은 is_female = yes/no 조건문을 사용합니다.
  • 두 사람이 같은 성별인지 여부를 확인할 필요가 있다면 same_sex 조건문을 사용하면 됩니다.

아래 예시는 위 두 조건문을 사용한 예로, FROM 이 남성이고, ROOT 와 FROM 이 같은 성별일 것을 조건으로 하는 조건문입니다.

if = {
  limit = {
    FROM = {
      is_female = no
      same_sex = ROOT
    }
  }
  ...
}
  • 성별을 Pre-Trigger 로 사용할 때에는 only_men = yes, only_women = yes 구문을 사용합니다.
6) 캐릭터의 야망 및 삶의 방식과 관련된 명령어/조건문
  • 캐릭터의 야망을 확인 : has_ambition 조건문을 사용합니다.
  • 캐릭터의 삶의 방식을 확인 : has_focus 조건문을 사용합니다.

야망 및 삶의 방식 정의 코드는 common/objectives 폴더 이하에 00_focuses.txt, 00_ambitions.txt 에서 확인하실 수 있습니다.

삶의 방식 (총 10가지) : focus_business, focus_carousing, focus_family, focus_hunting, focus_intrigue, focus_rulership, focus_scholarship, focus_seduction, focus_theology, focus_war

야망 (공통: ~이 되기) : obj_become_chancellor, obj_become_exalted, obj_become_heir, obj_become_king, obj_become_marshal, obj_become_paragon_of_enlightenment, obj_become_paragon_of_virtue, obj_become_spiritual, obj_become_spymaster, obj_become_treasurer

야망 (공통: 재산 모으기) : obj_amass_wealth

야망 (공통: 작위를 얻기) : obj_wants_landed_title

야망 (공통: 결혼/출산) : obj_get_married, obj_marry_ruler, obj_have_a_daughter, obj_have_a_son

야망 (공통: 능력 키우기. 단, Way of Life DLC 사용 시 선택 불가능) : obj_improve_diplomacy, obj_improve_intrigue, obj_improve_learning, obj_improve_martial, obj_improve_stewardship

야망 (무슬림만 선택 가능) : obj_lower_decadence

야망 (불교도만 선택 가능) : obj_buddhist_abstain_sexual_excess, obj_buddhist_defeat_fear, obj_buddhist_reject_cruelty, obj_buddhist_reject_empty_pleasures, obj_buddhist_reject_envy, obj_buddhist_reject_greed, obj_buddhist_reject_hate, obj_buddhist_reject_pride, obj_buddhist_stop_drinking, obj_buddhist_temperance_food

아래의 예시는, 현재의 삶의 방식이 가족이고, 야망이 아들을 갖기인 경우에 참인 조건문이 되는 예시입니다.

if = {
  limit = {
    has_ambition = obj_have_a_son
    has_focus = focus_family
  }
  ...
}
  • 야망의 경우, 코드 레벨에서 이를 설정하거나 취소할 수도 있습니다. 야망을 설정할 때는 add_ambition 명령어, 야망을 취소할 때는 cancel_ambition = yes 명령어를 사용합니다.

add_ambition = obj_have_a_son : 아들을 갖기 야망을 설정합니다.
cancel_ambition = yes : 현재의 야망을 취소합니다.

원본에서도 극히 적지만, 코드에서 야망을 설정하거나 취소하는 예가 존재합니다.

  • 다만, 삶의 방식의 경우에는 현재 캐릭터의 삶의 방식이 무엇인지만 확인할 수 있을 뿐, 이를 변경하거나 제거하는 명령은 제공되지 않습니다. (2.3.2 현재)
7) 캐릭터의 소지 금화를 확인하거나 증감/이동시키기
  • 캐릭터의 소지 금화를 확인하거나 증감시키는 조건문/명령어는 wealth, scaled_wealth 로 동일합니다. 따라서, 조건 문맥에서 사용되면 조건문으로, 명령 문맥에서 사용되면 명령문으로 사용됩니다.
  • wealth 는 고정된 액수의 금화를, scaled_wealth 는 한 달 수입액을 기준으로 하여 지정한 비율에 해당하는 가변적 액수의 금화를 의미합니다.

아래의 예시는, 캐릭터가 한 달 수입금의 25%에 해당하는 금화를 가지고 있다면, 그 만큼을 사용하는(감소시키는) 예제입니다. 이처럼 같은 명령어가 조건문과 명령어로 모두 사용됩니다.

if = {
  limit = {
    scaled_wealth = 0.25
  }
  scaled_wealth = -0.25
}

게임 내에서는 wealth 명령으로 고정금액을 차감하는 방식보다는 scaled_wealth 명령으로 현재 수입에 비례해 얼마를 차감하는 방식을 더 많이 씁니다.

  • 일정 비율 액수의 금액을 특정 캐릭터에게 이전시키기 : 일정 액수의 금액을 특정 캐릭터에게 주는 명령어를 제공하는데, 고정금액을 넘겨주는 명령어는 존재하지 않고, 수입 비율로 넘겨주는 명령어만 존재합니다. transfer_scaled_wealth 명령어가 그것입니다.
# 한 달 수입의 20% 를 FROM 에게 준다
transfer_scaled_wealth = { to = FROM value = 0.2 }
  • 금화 초기화 : clear_wealth = yes 명령어를 사용하면, 현재 스코프의 캐릭터가 가지고 있는 골드를 0 으로 만들어 줍니다. (사용할 일이 있을 수도 있어요.)
8) 캐릭터의 명성/신앙심 확인/증감
  • 캐릭터의 명성, 신앙심 : 조건문과 명령어 모두 각각 prestige, piety 입니다. wealth 처럼 문맥에 따라 조건문이 되기도 하고, 명령문이 되기도 합니다.

아래의 예시는, 현재 명성(prestige)이 500이 넘는다면, 이를 소비하여 신앙심(piety) 1000을 얻는 이벤트 선택지를 구현한 것입니다.

option = {
  name = TEST_0001
  trigger = {
    prestige = 500
  }
  ROOT = {
    prestige = -500
    piety = 1000
  }
}
9) 캐릭터의 트레잇 관련 조건문/명령어
  • 캐릭터의 트레잇을 추가, 제거, 트레잇 확인 : 트레잇을 추가하는 명령은 add_trait, 제거하는 명령은 remove_trait, 트레잇 확인 조건문은 trait 입니다. 조건문과 추가명령을 자주 혼동하는데, 주의해야 합니다.

트레잇 중 서로 반대 상성인 트레잇들이 있습니다. 위키의 트레잇 표를 보시면 알 수 있는데요. 반대 상성인 트레잇이 한 캐릭터에 중복되는 것을 방지하기 위해서, 트레잇을 추가할 때는 반대 트레잇이 있는지 먼저 확인하고 지워주도록 합시다. 예문상으로는 조건문으로 트레잇 여부를 확인한 후에 트레잇을 제거하거나 추가했습니다만, 정석이 그렇다는 거고, 특히 추가의 경우는 있는 트레잇을 다시 추가해도 문제는 안 생깁니다.

# 독단적인 (arbitrary) 트레잇을 추가하기 위한 코드. 반대 상성인 just도 제거해준다.
if = {
  limit = {
    trait = just
  }
  remove_trait = just
}
if = {
  limit = {
    NOT = {
      trait = arbitrary
    }
  }
  add_trait = arbitrary
}
  • 현재 캐릭터가 가진 트레잇 수를 확인 : num_of_traits 조건문을 사용합니다.
# 가진 트레잇 수가 5개 미만일 때...
if = {
  limit = {
    NOT = { num_of_traits = 5 }
  }
  ...
}

트레잇에 관해서는 이야기할 것들이 아직 여러 가지 있습니다만, 이 부분은 차후 트레잇 모딩에 대해 다루게 되면 그 때 추가하도록 하겠습니다.

10) 퇴폐도
  • 퇴폐도 : 이슬람의 경우 퇴폐도라는 고유의 항목이 있죠. 명령어와 조건문 모두 decadence = NN 으로 사용합니다.
# 퇴폐도가 90 이상이 되면 퇴폐도 25를 줄이는 코드. 예시를 위한 예시..
ROOT = {
  if = {
    limit = {
      decadence = 90
    }
    decadence = -25
  }
}

■ 혼인, 가족, 가문 관련

1) 현재의 가문을 확인하거나, 캐릭터를 특정 가문으로 설정

조건문과 명령어 모두 심플하게 dynasty 입니다.

  • 가문이 없는 자(Lowborn)를 확인하는 조건문은 dynasty = none 입니다.
  • dynasty 의 값으로는 캐릭터 스코프(FROM, ROOT 등) 또는 가문 ID(숫자)를 줄 수 있습니다.

예시는, 가신 중 Lowborn 인 캐릭터 중 랜덤한 하나의 캐릭터에 대하여 ROOT 의 캐릭터와 같은 가문을 부여하는 것입니다. (신분상승 로또?)

if = {
  limit = {
    any_courtier = {
      dynasty = none
    }
  }
  random_courtier = {
    dynasty = ROOT
  }
}
2) 부모와 관련된 조건문 및 명령어
  • 아버지(실제 아버지) 또는 어머니를 세팅하기 : 쓸 일은 많지 않지만, 제 모드에서처럼 입양 등을 처리할 때는 이 명령어를 사용할 필요가 있죠. 혹은 이벤트성으로 새로운 캐릭터를 생성했을 때, 해당 캐릭터의 가족 관계를 만들어주고 싶을 때도 이 명령을 사용해 주면 됩니다. real_father 는 사생아의 경우에 실제 아버지가 누구인지를 가리키는 것입니다.
set_father = PREV
set_real_father = PREVPREV
set_mother = PREV
  • 아버지(또는 어머니)가 맞는지 확인하기 : is_father, is_mother 조건문을 사용합니다. 조건문 이름만 봐도 직관적으로 알 수 있죠?
if = {
  limit = {
    FROM = {
      is_father = ROOT
    }
  }
  ....
}
3) 연인 관계를 설정하고 확인하기

특정 캐릭터를 연인에 추가하거나 연인 목록에서 삭제하는 명령어입니다.

  • 특정 캐릭터를 연인으로 추가하기 : add_lover = ROOT/FROM/PREV/THIS
  • 특정 캐릭터를 연인에서 삭제하기 : remove_lover = ROOT/FROM/PREV/THIS

연인과 관련된 자주 쓰이는 조건문들입니다.

  • 연인인지 여부를 확인하는 조건문 : is_lover = yes/no/ROOT/FROM/PREV/THIS
  • 연인이 있는지 여부를 확인하는 조건문 : has_lover = yes/no
  • 연인의 숫자를 확인 : num_of_lovers = 숫자
# 본격 사랑의 짝대기...
# NOT = { num_of_lovers = 1 } 은 has_lover = no 로 바꿔쓸 수 있습니다.
if = {
  limit = {
    any_courtier = {
      is_female = no
      is_adult = yes
      NOT = { num_of_lovers = 1 }
    }
    FROM = {
      is_female = yes
      is_adult = yes
    }
  }
  random_courtier = {
    limit = {
      is_female = no
      is_adult = yes
      NOT = { num_of_lovers = 1 }
    }
    add_lover = FROM
  }
}
4) 결혼, 첩 및 이혼과 관련된 조건문 및 명령어

우선 명령어부터 확인하겠습니다.

  • 일반적인 결혼 : add_spouse = ROOT/FROM/PREV/THIS
  • 모계 결혼 : add_spouse_matrilineal = ROOT/FROM/PREV/THIS

코드를 통해 모계 결혼도 구현할 수 있다는 것이 특징적입니다.

  • 이혼 : remove_spouse = yes/spouse/ROOT/FROM/PREV/THIS

remove_spouse 의 경우 값으로 spouse 나 yes 도 받을 수 있는데, 이는 배우자가 누구건 묻지도 따지지도 않고 이혼시키는 무서운 명령이므로 주의해서 쓰십시오(?).

add_spouse = FROM 
add_spouse_matrilineal = FROM
remove_spouse = FROM
  • 현재 결혼이 가능한 상태인지 확인하는 조건문 : can_marry 조건문을 사용하면, 현재 스코프의 캐릭터가 (다른 캐릭터와, 혹은 특정 캐릭터와) 결혼이 가능한 상태인지를 확인할 수 있습니다. can_marry = FROM 또는 can_marry = yes 의 형태로 사용될 수 있습니다.

  • 이미 결혼한 캐릭터인지를 확인하는 조건문 : is_married = yes/no, is_married_matrilineally = yes/no (모계 결혼인지 확인. 원본에서는 사용된 예가 없습니다.)

  • 일부다처제 이슬람의 경우 : 배우자를 여럿 둘 수 있는 이슬람 군주의 경우, 배우자의 숫자나, 누구를 첫째 배우자로 할 것인지 등이 문제될 수 있습니다. make_primary_spouse = yes 구문을 사용하면, 현재 스코프의 캐릭터를 첫째 배우자(본처)로 만듭니다. (이슬람에도 본처와 후처의 개념이 있었던가..?) 마찬가지로, 누군가가 본처인지 여부를 확인할 때는 is_main_spouse = yes/no 조건문을, 처의 숫자를 확인할 때는 num_of_spouses = 숫자 조건문을 사용하면 되겠지요.

is_main_spouse 는 Yes/No 를 받는 조건문이라고 위키에 나와 있지만, 원본에는 스코프(ROOT)를 받은 예도 있습니다.

# FROM 이 본처가 아니라면 본처로 만들어 줍니다.
if = {
  limit = {
    FROM = {
      is_main_spouse = no
    }
  }
  FROM = {
    make_primary_spouse = yes
  }
}

참고로, 이러한 본처/후처와 관련된 이벤트는 이슬람에서만 가능하므로, 관련된 명령을 사용할 때는 종교를 꼭 조건문을 사용하여 확인하는 것이 좋습니다. 여러 명의 처를 두는 것이 가능한지 여부를 확인하는 조건문인 has_polygamy = yes 가 준비되어 있으므로 이것을 사용해도 좋습니다.

  • 첩과 관련된 명령어, 조건문 : 파간 계열의 종교나 조로아스터 교의 경우에는 첩을 둘 수 있습니다. add_consort, is_consort, num_of_consorts, remove_consort 를 사용할 수 있습니다.

첩과 관련된 명령을 집행할 때는 종교가 파간 계열이나 조로아스터교인지 확인하셔야 합니다. 혹은, 현재 캐릭터 설정이 첩을 받을 수 있는지 확인하는 조건문인 has_concubinage = yes 를 사용할 수도 있습니다. (다만 원본에서도 사용된 예가 많지가 않습니다.)

# 파간이나 조로아스터 그룹일 때만 이 선택지가 보이도록 trigger 를 지정
# NOT = { num_of_consort = 3 } 을 통해 현재 첩의 수가 3명 제한을 넘기지 않았는지 확인합니다.
# 종교로 확인하는 대신 has_concubinage = yes 로 확인할 수도 있지만, 원본에서도 이 방법을 쓴 예는 적습니다.
  option = {
    name = EVTOPTA_TST_1121
    trigger = {
      ROOT = {
        OR = {
          religion_group = pagan_group
          religion_group = zoroastrian_group
        }
        NOT = { num_of_consorts = 3 }
      }
    }
    
    ROOT = {
      add_consort = FROM
    }
  }

is_consort 역시, Yes/No 를 받거나 특정 캐릭터 스코프(ROOT, FROM 등)를 받을 수 있습니다. remove_consort 는 위키의 목록에 존재하지 않습니다만, 원본에도 사용된 예가 있으므로 안심하고 쓰십시오.

5) 임신과 출산에 관련된 조건문 및 명령어
  • 임신시키기 : impregnate, impregnate_cuckoo 명령어를 사용하면 임신이 가능합니다. 주의할 점은, 이 때 CKII 의 시스템이 성별을 확인하지 않으므로, 남성에 대해서도 이 명령어를 사용할 수 있다는 점입니다. (어떤 일이 벌어질지는 해 보지 않아서 모르겠습니다.)

impregnate 는 정상적인 임신, impregnate_cuckoo 는 혼외 임신(즉 불륜)을 만드는데, 두 명령 모두 누구의 아이인지를 표시하는 대신 yes 라고 표시할 수 있습니다. (또는 0이라고 쓰거나요) 이렇게 하면 누구의 아이인지 모르는 상태의 임신이 됩니다. 시스템상으로도 기록이 되지 않아서, 영원히 누구의 자식인지 알 수 없게 됩니다.

  • 현재 임신 여부의 확인 : 현재 임신 상태인지 여부를 확인하는 조건문은 is_pregnant 입니다.

참고로, is_pregnant = yes/no 로 확인하는 임신 이외에 종종 임신 트레잇을 가지고 확인하는 경우도 있는데요. (trait = pregnant) 트레잇은 실제로 임신 후 일정 기간이 지난 후에 붙기 때문에(현실에서도, 어느 정도 배가 불러오기 전에는 임신인지 어떤지 모르잖아요?) 트레잇을 가지고는 임신여부를 정확히 판단할 수 없습니다.

# FROM 이 ROOT 의 아이를 임신합니다.
FROM = {
  if = {
    limit = {
      is_female = yes
      is_pregnant = no
    }
    impregnate = ROOT
  }
}
  • 임신의 중복 : CKII 시스템은 임신 데이터를 추가하는 데에 현재 임신중인지 여부를 전혀 확인하지 않습니다. 따라서 현재 임신중인지 확인하지 않고 임신을 시켜도 추가로 임신이 됩니다. 따라서 이벤트를 구성할 때 이를 제대로 고려하지 않으면, 자칫 아기가 쏟아지는 상황이 벌어집니다만, 이를 이용하여 쌍둥이를 얻는 이벤트를 구현할 수도 있습니다. impregnate 명령어를 두 번 연속으로 써 주면 쌍둥이가 구현되는 거거든요.

실제로, 게임상에서 쌍둥이가 출산되는 것은 사실 쌍둥이와 관련된 무언가가 시스템상 따로 있는 게 아니라 단순히 같은 날 중복 임신이 된 것입니다. 이벤트로 쌍둥이를 출산시키고 싶다면 impregnate 명령어를 이벤트 내에서 두 번 써주면 됩니다.

■ 미성년자의 후견

1) 후견인의 지정

set_guardian 명령을 통해 후견인을 지정할 수 있습니다.

# FROM 의 후견인으로 ROOT 를 지정합니다.
FROM = {
  set_guardian = ROOT
}

후견인은 6세 이상의 미성년자에게 없어서는 안 되는 것이므로, 후견인을 따로 박탈하는 명령어는 없습니다. 다만 새로 지정하면 기존 후견인은 자동으로 잘리겠죠.

2) 후견인과 관련된 조건문들
  • 미성년자가 후견인을 가지고 있는지 확인하는 조건문은 has_guardian (=yes/no)
  • 누군가가 후견인지 여부를 확인하는 조건문은 is_guardian (=yes/no)
  • 두 아이가 서로 같은 후견인을 두고 있는지를 확인하는 조건문은 same_guardian (FROM = { same_guardian = ROOT })

■ 캐릭터의 생성, 투옥, 추방, 사망

1) 새로운 캐릭터의 생성

일반적인 캐릭터를 생성하는 명령문은 create_character 명령어를 사용하면 새로운 캐릭터를 생성할 수 있습니다. 생성된 캐릭터는 new_character = { } 스코프를 통해 호출할 수 있다는 것은 앞에서 확인한 바 있죠. 아래는 사용의 예시입니다.

create_character = {
  name = "Hassan"
  random_traits = yes
  dynasty = random
  religion = sunni
  culture = persian
  female = no
  age = 22
  attributes = {
    martial = 12
    diplomacy = 12
    stewardship = 10
    intrigue = 11
    learning = 14
  }
  trait = brilliant_strategist
}
new_character = {
  ...새로운 캐릭터에 대해서 실행할 명령을 적어준다...
}

create_character = { } 에 사용할 수 있는 각종 옵션에 대해서는 조금 설명이 필요할 듯합니다.

  • name 은 캐릭터의 이름으로, 지정하지 않으면 자동으로 설정됩니다.
  • is_female = no 이면 남자, is_female = yes 이면 여자입니다.
  • father 및 mother 를 설정해 줄 수 있습니다. (명령어와 달리 set 을 붙이지 않습니다)
  • dynasty 와 culture 는 random 값을 받을 수 있습니다. 이렇게 설정되면 가문과 문화가 랜덤으로 설정됩니다.

2.3.2 기준으로, 종교는 random 을 못 받습니다. 오류가 발생해요.

  • 예제에는 넣지 않았는데, race 를 설정하면 인종도 설정이 가능합니다. (즉, race 와 culture 가 서로 다른 캐릭터도 생성할 수 있다는 겁니다. 겉보기에는 분명 인도 계열인데 문화가 norse 라던가..)
  • random_traits = yes 라고 하면, 임의의 트레잇이 하나 붙어서 나옵니다. (잡다한 트레잇이 싫다면 no 로 설정하시면 됩니다.)
  • 그럴 일이 있나 싶습니다만, dna 도 지정 가능합니다. (dna=aefccojcgbd 와 같이. 예쁜 얼굴 dna를 알고 계시다면 적극 사용해 보시는 것도?)
  • 생성 당시부터 캐릭터 플래그를 달고 나오게 할 수 있습니다. flag = ai_flag_refuse_conversion 와 같이 지정해 주면 됩니다.

특정 자문관으로 사용하기 좋은, 관련 교육 트레잇을 가진 캐릭터를 생성하는 명령어가 따로 있습니다. 다만, 교육의 레벨이 항상 높지는 않습니다. 랜덤하게 나타나요. 특징이나 사용 방법은 위의 create_character 와 비슷합니다만, 교육을 받은 캐릭터라는 특성상 미성년 캐릭터는 생성할 수 없습니다.

create_random_diplomat = {
  random_traits = yes
  dynasty = random
  female = no
}
create_random_intriguer = { }
create_random_priest = { }
create_random_soldier = { }
create_random_steward = { }

생성된 캐릭터는 현재 스코프 캐릭터의 가신이 됩니다. 그리고 프로빈스 스코프에서도 생성이 가능하며, 이 때는 해당 프로빈스의 지배자의 가신으로 생성됩니다. (이 부분은 테스트를 못 해봤습니다.)

2) 특정한 캐릭터에 대한 추방/투옥/석방
  • 특정 캐릭터를 추방 : banish 명령어를 사용합니다. banish = yes 와 같이 사용하면 해당 스코프의 캐릭터를 추방합니다.

  • 특정 캐릭터를 투옥/석방 : 투옥에는 imprison 명령어를 사용하면 됩니다. imprison = yes 또는 imprison = ROOT 의 형태로 사용합니다. 석방은 해당 죄수의 스코프에서 prisoner = no 해 주면 됩니다. (prisoner = yes 해 줘도 투옥 됩니다. imprison = yes 와 같아요)

# FROM 을 ROOT 의 감옥에 투옥합니다.
FROM = {
  imprison = ROOT
}

특정 캐릭터가 감옥에 갇혀 있는 날의 수를 기준으로 이벤트를 작성하고 싶다면, imprisoned_days 조건문을 사용하면 됩니다. 원본에서도 많지는 않지만 몇 차례 사용되고 있습니다.

3) 캐릭터의 사망

캐릭터를 죽일 때는 death = { } 명령문을 이용하면 됩니다. death_reason 에 사망 이유를 적고, killer 에 누가 죽였는지를 적습니다. killer 는 설정하지 않을 수도 있습니다. (자연사의 경우, 혹은 누가 죽였는지 알 수 없는 경우)

death = {
  death_reason = death_execution
  killer = ROOT
}

사망의 이유는 시스템상 다음과 같이 여러 가지로 세팅이 가능합니다.

  • death_execution (처형)
  • death_battle (전투)
  • death_suicide (자살)
  • death_childbirth (출산 중 사망)
  • death_murder (살해)
  • death_murder_unknown (의심스러운 상황에서 사망)
  • death_duel (결투)
  • death_sacrificed (제물로 희생 : 블로트)
  • death_rabble (폭동)
  • death_accident (사고)
  • death_hashshashin (하샤신에 의해 암살)
  • death_dungeon (감옥에서 사망)
  • death_natural (자연사)
  • death_trait (트레잇 이유)

주목할 것은 death_trait 입니다. 질병 또는 건강 수치를 급격히 줄이는 트레잇이 있는 상태에서 사망하는 경우, 해당 캐릭터는 그 이유로 사망한 것으로 처리되는데, 이것을 구현하는 것이 바로 사망 이유로서의 death_trait 입니다. 이를 활용하면 기존에 존재하는 사망 이유 이외에 새로운 사망 이유를 구현하는 것도 가능합니다.

예를 들면, 폐렴(pneumonic) 트레잇을 가지고 있는 상태에서 사망하는 경우, 다른 이유가 없는 경우에 그 캐릭터는 폐렴으로 인해 사망한 것으로 처리되는데, 이것을 코드적으로 구현하려면 캐릭터에 폐렴 트레잇을 추가해준 후, death_reason 에 death_trait 을 지정하여 death = { } 명령어를 실행해 주면 된다는 것입니다.

이 경우, 해당 트레잇으로 인해 사망했다는 것을 캐릭터에게 보여줄 수 있도록 언어 파일에 반영하려면 트레잇에 _death 를 붙여서 적어주면 됩니다. 아래는 원본에 존재하는 각종 예시들입니다.

stressed_death;극심한 스트레스;;;;;;;;;;;;x;
depressed_death;우울증;;;;;;;;;;;;x;
ill_death;지병;;;;;;;;;;;;x;
pneumonic_death;폐렴;;;;;;;;;;;;x;
syphilitic_death;매독;;;;;;;;;;;;x;
leper_death;나병 말기;;;;;;;;;;;;x;
wounded_death;상처의 감염;;;;;;;;;;;;x;
maimed_death;신체의 불구;;;;;;;;;;;;x;
infirm_death;아파서 누워있다가 병약;;;;;;;;;;;;x;

■ 종교와 문화

종교와 문화는 캐릭터와 프로빈스에 각각 지정되는 항목이므로, 일반적으로 캐릭터 스코프와 프로빈스 스코프에서 모두 사용이 가능한 명령과 조건문들을 가지고 있습니다.

1) 종교와 문화를 설정하고 확인
  • 조건문과 명령 모두 culture, religion 입니다. 위키에 religion 을 캐릭터 스코프로 분류했는데, religion 명령을 사용해 특정 프로빈스의 종교를 변경하거나 확인할 수도 있습니다.

  • 종교 그룹이나 문화 그룹을 확인할 때에는 culture_group, religion_group 조건문을 사용하면 됩니다.

아래 예시는 원본에서 사용된 예시를 그대로 가져온 것인데, 여러 가지 종교와 관련된 조건문들을 확인할 수 있는 예시입니다.

if = {
  limit = {
    FROM = {
      OR = {
        NOT = { religion_group = ROOT }
        is_heresy_of = ROOT
        AND = {
          religion_group = pagan_group
          NOT = { religion = ROOT }
        }
      }
    }
  }
  ...
}

is_heresy_of 에 대해서는 설명이 필요하겠군요. 이 조건문은 스코프 캐릭터(또는 스코프 프로빈스)가 가진 종교가 지정한 종교의 이단인지를 확인하는 조건문입니다. (위 예시는 FROM 이 가진 종교가 ROOT 의 이단인지를 확인합니다.)

  • 데쥬레 동화의 조건 중 하나인 정복 문화의 확인은 conquest_culture 조건문을 사용합니다. (이 글이 모딩 관련 글이므로, 이런 내용에 대해 일일이 설명하지는 않습니다. 관련 글을 참조하세요.)
2) 이단 종교

사실 이 내용은 여기서 자세히 할 게 아니긴 하지만, 막상 종교 모딩 부분에서 명령어나 조건문을 자세히 설명할 기회도 없을 것 같아서 미리 정리하고 넘어갑니다.

  • 이단 종교로 개종하기 : religion = 이단 종교 로 개종시킬 수 있습니다만, become_heretic = yes 를 사용하여 현재 자신의 종교의 랜덤한 이단으로 개종시킬 수도 있습니다. 아래의 코드는 원본의 이단 발생 코드인데, 한번쯤 살펴볼 만한 가치가 있습니다.
    # Prefer a neighboring heresy
    random_neighbor_province = {
      limit = {
        is_land = yes
        is_heresy_of = ROOT
      }
      ROOT = {
        religion = PREV
      }
    }
  
    # Prefer an existing heresy in the realm
    if = {
      limit = {
        is_heretic = no
      }
      owner = {
        top_liege = {
          random_realm_province = {
            limit = {
              is_land = yes
              is_heresy_of = ROOT
            }
            ROOT = {
              religion = PREV
            }
          }
        }
      }
    }
  
    # ...otherwise, just pick a heresy
    if = {
      limit = {
        is_heretic = no
      }
      become_heretic = yes
    }
  • is_land = yes 조건문은, 이웃한 프로빈스가 육지 프로빈스인지를 확인하는 조건문입니다. (아마 이 글에선 다루어지기 어려운 조건문일테니 이 기회에 짚고 넘어갑시다.)
  • is_heretic 은 그것이 어떤 종교의 이단이건 관계 없이 이단 종교인지 여부를 확인하는 조건문이예요.
  • is_heresy_of 는 바로 앞에서 본 것이니 설명 생략.

참고로, 현재의 캐릭터나 프로빈스의 종교가 이단을 가지고 있는 종교인지를 확인하는 조건문은 has_heresies = yes 입니다.

노파심에 한 마디 더 추가. 위 예제에서, 혹시 왜 religion = PREV 인가 고민하신 분이 계신가요? THIS 와 달리 PREV 는 ROOT, FROM 이 나와도 스코프가 변경되기 때문에, 그 앞 스코프를 따라가는 게 맞습니다.

  • 특정한 종교를 가진 자를 모두 추방하기 : banish_religion 명령문을 사용하면 됩니다. 원본에서는 유대교 인물들을 일괄적으로 추방하기 위한 디시전에서 이 명령어가 쓰였죠.
banish_religion = jewish
3) 종교 권위와 관련한 명령문 및 조건문

스코프 캐릭터나 프로빈스의 종교에 대해 종교 권위를 확인하는 조건문은 religion_authority 입니다. 종교 권위는 % 값이기 때문에, 0에서 1 사이의 값을 갖게 되죠. 아래 예는 트리거의 모디파이어에서 조건으로 사용된 예입니다.

modifier = {
  factor = 2.0
  NOT = { religion_authority = 0.2 }
}

종교 권위를 상승/하락시키는 명령어도 똑같이 religion_authority 인데, 이는 오피니언 모디파이어를 추가하는 것과 같이 미리 정의된 종교 모디파이어를 지정하는 방법으로 상승/하락시킵니다. 따라서, 이는 종교 모디파이어와 함께 확인하는 것이 더 적절할 것 같아서, 나중에 종교 모딩에 대해 설명할 때에 같이 하겠습니다. (종교 모디파이어도 다른 모디파이어처럼 간단하게 정의하고 사용할 수 있습니다.)

4) 파문

파문이 가능한 종교의 경우 해당 캐릭터의 스코프에서 excommunicate = yes 한 줄을 실행하는 것만으로 파문처리가 됩니다. 파문을 철회하려면 반대로 excommunicate = no 하면 되죠.

파문된 자인지에 대한 체크는 FROM = { excommunicated_for = ROOT } 로 합니다. (FROM 은 파문여부를 확인할 캐릭터, ROOT 는 교황 등 파문할 권한을 가진 최고지도자 캐릭터입니다.)

5) 그 외 종교와 관련된 조건문들
  • is_reformed_religion = yes/no 는 개혁이 가능한 종교인 파간 종교에 대해서 개혁된 종교인지 아닌지를 확인하는 조건문입니다.
  • can_call_crusade = yes 조건문은 현재 크루세이더가 해금되었는지를 확인하는 것으로, 원본에서는 주로 트리거 조건으로 사용되더군요.

■ 클레임

1) 캐릭터에 특정한 클레임을 부여
  • add_claim(강한 클레임, 상속불가)
  • add_pressed_claim(강한 클레임, 상속가능)
  • add_weak_claim(약한 클레임, 상속불가)
  • add_weak_pressed_claim(약한 클레임, 상속가능)

클레임을 부여하는 용례는 두 가지가 있어서, 예시로 두 가지를 모두 보여드립니다.

# ROOT 에게 k_saxony 타이틀의 클레임을 추가 (스코프가 캐릭터인 경우)
# 특정한 타이틀의 클레임을 지정해서 부여하는 방식으로, 특정 지역의 클레임을 얻는
# 시나리오에서나 쓸 만한 방법이겠죠. 범용적으로 쓰긴 어렵습니다.
ROOT = {
  add_claim = k_saxony
}
# FROM 이 있는 장소(백작령)의 타이틀에 대한 클레임을 ROOT 에게 추가.
# (county = { } 는 프로빈스의 타이틀 스코프를 오픈합니다)
# 보통 이렇게 더 많이 씁니다. 아예, 타이틀 = { add_claim = 캐릭터 } 라고 알아 두시는 게 좋습니다. 
FROM = {
  location = {
    county = {
      add_claim = ROOT
    }
  }
}
2) 캐릭터의 특정 클레임을 제거(박탈)

remove_claim 명령을 사용합니다. 마찬가지로 타이틀 = { remove_claim = 캐릭터 } 라고 생각하시면 됩니다.

3) 클레임과 관련된 각종 조건문들
  • has_claim
  • has_strong_claim
  • has_weak_claim

현재 특정 타이틀에 대한 클레임을 가지고 있는지를 확인하는 조건문이며, 모두 has_claim = 타이틀 의 방식으로 사용합니다. 원본에서는 이벤트 파일에서는 사용된 바가 없고, 음모나 CB 등에서만 사용되고 있습니다.

  • num_of_claims : 현재 가지고 있는 클레임의 갯수를 확인하는 조건문입니다. (이제 num_of_xxxx 의 조건문 형식은 익숙하시죠?)

■ 자문관, 명예로운 칭호(마이너 타이틀)

1) 명예로운 칭호(마이너 타이틀) 또는 자문관 직위의 수여

명예로운 칭호(마이너 타이틀)에 대해서는 아직 다루지 않았는데, 뒤에서 이 부분의 모딩도 다룰 예정이긴 합니다. 다만 이들 칭호나 자문관을 임명하고 자르는(...) 정도의 명령어는 미리 알아둬도 괜찮겠죠.

  • give_job_title : 자문관(참사회원) 직위를 수여합니다.
  • give_minor_title : 명예로운 칭호(마이너 타이틀)를 수여합니다.

자문관은 재상(job_chancellor), 대장군(job_marshal), 재정(job_treasurer), 첩보(job_spymaster), 종교(job_spiritual)을 사용하면 됩니다. 명예로운 칭호의 경우, common/minor_titles/00_minor_titles.txt 에 등록된 이름을 사용합니다.

FROM = {
  give_job_title = job_marshal
}
FROMFROM = {
  give_minor_title = title_guru
}
2) 수여했던 자문관 직위/마이너 타이틀을 박탈

타이틀의 박탈 : 자문관과 칭호를 가리지 않고 remove_title 을 사용하면 됩니다.

3) 특정 캐릭터가 참사회원(자문관)인지를 확인
  • is_spiritual = yes/no
  • is_spymaster = yes/no
  • is_treasurer = yes/no
  • is_chancellor = yes/no
  • is_marshal = yes/no

특정 캐릭터가 해당 자문관인지를 확인하는 조건문이지만, 원본의 경우 이벤트에서는 이 조건문을 사용하지 않습니다. 대신 has_job_title = job_chancellor 와 같이 has_job_title 조건문을 사용하여 확인합니다.

아래 예시는 FROM 캐릭터가 대장군 직위를 가지고 있을 경우에 그 직위를 박탈하는 예제입니다.

FROM = {
  if = {
    limit = {
      has_job_title = job_marshal
    }
    remove_title = job_marshal
  }
}
3) 특정 캐릭터가 명예로운 칭호를 가지고 있는지 확인

has_minor_title = 칭호 의 조건문을 사용하여 확인합니다.

■ 작위

1) 작위의 등급 확인하기

현재 작위의 등급을 확인하려면 tier 조건문을 사용하면 됩니다. (정확히 테스트해보지는 않았지만, tier 조건문의 비교는 정확히 해당 등급의 작위인지를 판단할 것입니다.)

if = {
  limit = {
    primary_title = {
      tier = DUKE
    }
  }
  ...
}
2) 작위의 우위/열위 확인하기

특정한 타이틀이 일정한 작위보다 높은가 낮은가를 판단하는 조건문으로 higher_tier_than, lower_tier_than 이 있습니다.

primary_title = { higher_tier_than = BARON } 

위의 예제에서 보시는 것처럼 대개는 작위( BARON, COUNT, DUKE, KING, EMPEROR ) 를 적지만, 스코프와 값 모두 캐릭터를 받을 수도 있습니다. (원본의 이벤트들 중에도 예가 있습니다.) 스코프의 캐릭터의 작위가 값으로 주어진 캐릭터의 작위보다 더 높은가(higher_tier_than) 낮은가(lower_tier_than)를 판단하는 거죠.

3) 작위를 생성하기

create_title 명령을 사용하면 작위를 생성할 수 있습니다.

아래 예시는 원본에서 일정 조건을 충족했을 경우 왕 작위를 생성하는 디시전의 effect 부분을 그대로 가져온 것입니다. 단순히 왕 작위를 생성하고 끝나는 것이 아니라, 현재 점령중인 지역에 대한 데쥬레까지 새로 생성된 왕 작위 아래로 가져오는 작업을 하고 있어서 꽤 길어졌습니다.

effect = {
  primary_title = {
    create_title = {
      tier = KING
      landless = no
      temporary = no
      custom_created = yes
      culture = ROOT
      holder = ROOT
      base_title = THIS
      copy_title_laws = yes
    }

    hidden_tooltip = {
      empire = {
        ROOT = {
          primary_title = {
            de_jure_liege = PREVPREV
          }
        }
      }

      ROOT = {
        primary_title = {
          holder_scope = {
            any_title_under = {
              limit = {
                tier = DUKE
                kingdom = {
                  has_holder = no
                }
              }
              de_jure_liege = PREVPREV
            }
            any_title_under = {
              limit = {
                tier = COUNT
                location = {
                  duchy = {
                    kingdom = {
                      has_holder = no
                    }
                    
                    NOT = { de_jure_liege_or_above = PREVPREVPREVPREV }
                    ROOT = {
                      completely_controls = PREV
                    }
                  }
                }
              }
              location = {
                duchy = {
                  de_jure_liege = PREVPREVPREVPREV
                }
              }
            }
          }
        }
      }
    }
  }
  wealth = -300
  custom_tooltip = { text = form_new_kingdom_tooltip }
  chronicle = {
    entry = CHRONICLE_FOUNDED_NEW_KINGDOM_OR_EMPIRE
    portrait = [Root.GetID]
  }
}

엄청나게 깁니다만, 사실 이것만 분석이 되면 작위 관련해서는 그냥 게임 오버라고 생각되어서 그대로 다 갖다 붙였습니다.

일단 새로운 작위를 생성하는 것 자체는 명령어 하나면 끝납니다. 따라서 그 부분은 어렵지 않습니다만, 이것이 왕이나 황제처럼 그 위나 아래에 복속시켜야 하는 작위가 있는 경우에는 그걸 일일이 다 갖다 붙여줘야 하기 때문에 상당히 복잡해집니다. (반란군 작위 같은 경우에는 독립작위이기 때문에 이런 문제가 안 생깁니다.)

우선 사용된 스코프 중 duchy, kingdom, empire 스코프에 대해서 짚고 넘어갑시다. 이들 스코프는 문자 그대로 공작위, 왕위, 황제위 (타이틀) 를 의미하는데, 중요한 것은 이것을 쓸 수 있는 스코프입니다. 이들은 프로빈스 또는 자신보다 낮은 타이틀 스코프에서만 쓸 수 있습니다. 예를 들면, 어떤 백작 타이틀의 스코프에서 duchy = { } 스코프를 호출하면, 그 백작 타이틀이 속해 있는 공작 타이틀이 새로운 스코프가 된다는 것입니다.

다음으로, create_title = { } 을 봅시다. tier 는 작위의 등급을 의미, landless 는 봉토가 없는 명목상 작위인지 여부이지만 이 경우는 봉토가 있으므로 no 죠. (반란군 같은 경우가 yes 가 됩니다.) temporary 역시 임시 작위가 아니므로 no. custom_created 는 나중에 보게 될 landed_titles.txt 에 등록된 작위가 아니기 때문에 yes입니다. 이하는 딱히 설명할 게 없습니다. base_title 이나 copy_title_laws 는 저도 잘 모릅니다. 그냥 그대로 적으면 될 것 같아요.

그 다음 블록. empire = { } 내부를 봅시다. 새로 생성한 왕국은 어딘가 제국의 데쥬레에 속해야 하죠. 그래서 새로운 primary_title(왕위)을 자신의 영토가 속한 제국위에 붙이고 있습니다. (de_jure_liege = PREVPREV 니까, 두 개 앞으로 가면 empire = { } 스코프인 거 아시겠죠?) 바로 뒤에 다시 언급은 하겠지만, de_jure_liege 명령은 타이틀 또는 캐릭터를 받을 수 있으며, 스코프의 타이틀을 지정한 타이틀의 데쥬레에 갖다 붙이게 됩니다.

그 다음 블록. ROOT = { } 로 시작하는 심란하게 긴 블록입니다. 그 아래로 세 줄 holder_scope 까지는 새로운 왕 타이틀을 가진 타이틀 홀더 캐릭터 스코프라는 거 아시겠죠? 그 바로 아래의 any_title_under = { } 블록을 보죠. any_title_under = { } 스코프는 위키에도 따로 정보가 없습니다만, 아마도 해당 캐릭터에게 속한 모든 타이틀을 의미하는 것 같습니다. 그런데 그 밑에 limit = { } 조건으로 tier = DUKE, 즉 캐릭터에게 속한 공작위만으로 범위가 줄었습니다. 공작위에 대해서 kingdom = { } 이 붙으면 그 공작위가 속한 왕위라고 말씀드렸죠. 그렇다면 그 공작위들 중에서 그 데쥬레에 해당하는 왕위를 가진 자가 없는, 즉 법률상 주인 없는 공작위들은 모두 새로 생성된 왕위의 데쥬레로 복속 (de_jure_liege = PREVPREV)시킨 겁니다. PREVPREV 니까, 위로 두개 거슬러 올라오면 primary_title = { } 스코프에 걸린다는 건 아시겠죠?

그 다음의 any_title_under = { } 블록을 봅시다. 이번엔 tier = COUNT, 즉 백작위입니다. 왜 굳이 location = { } 을 적었는지는 모르겠지만, 그로 인해 프로빈스 스코프로 전환되었고, 그로부터 다시 왕위까지 거슬러 올라와서 원래 데쥬레에 해당하는 왕위를 가진 자가 없는지 확인합니다. 이건 똑같죠. 문제는 그 다음입니다.

이제 duchy = { } 의 레벨에서 de_jure_liege_or_above 를 확인하는데, de_jure_liege_or_above = ROOT 는 스코프의 타이틀/캐릭터의 데쥬레 주군 혹은 그 위의 인물이 ROOT 인지 확인하는 것입니다. 그러나 NOT이 붙었으므로 스코프의 타이틀의 데쥬레 주군이 ROOT 가 아니어야겠네요. 즉 아직 PREVPREVPREVPREV(거슬러 올라가 보면 primary_title = { } 입니다) 의 데쥬레 주군(혹은 그 이상)이 아닌 공작위들 중에서, ROOT(왕위 타이틀을 만든 캐릭터)가 완벽하게 점령하고 있는(completely_controls = PREV) 공작위들을 다시 한 번 새 왕국의 데쥬레에 등록을 합니다.

두 번째 블록을 들여다보면서 대체 왜 이런 번거로운 짓을 하나 싶었습니다만, 조금 생각해 보니 이유를 알 수가 있었습니다. any_title_under = { } 는 현재 캐릭터가 가지고 있는 모든 타이틀이 범위에 들어갈텐데, 예를 들면 아직 생성하거나 다른 세력으로부터 강탈하지 않아 내 작위가 아닌 공작위가 있을 수 있습니다. 이런 녀석들은 첫 번째 블록에서 왕 타이틀의 데쥬레에 들어가지 않겠죠. 그런 타이틀들 중에서, 캐릭터가 완전히 점령하고 있는 곳들(completely_controls 은 직접 점령하고 있는 곳 뿐만 아니라 자신의 봉신을 통해 점령하고 있는 곳도 포함합니다)의 공작위는 새로운 왕국의 데쥬레에 포함시키겠다는 것입니다.

뭐, 그 이하는 알 바 아닙니다. chronicle = { } 이라는 명령어가 보이는데, 왕위를 생성한 건 중요한 사건이니까, 이를 연대기에 등록하라는 겁니다.

저도 오락가락하면서 설명을 드린 탓에 이게 과연 제대로 된 설명인지 모르겠습니다. 나중에 다시 한 번 읽어보던가 해야지...

3) 작위 타이틀을 부수기

타이틀을 부수는 명령어는 destroy_landed_title 입니다. 다만, 일반적으로 게임상에서 타이틀을 부술 수 없는 상황에서, 모드를 통해서 타이틀을 부술 수 있는지 여부는 확인하지 못했습니다. 일부 오류를 무시하고 타이틀을 부수는 unsafe_destroy_landed_title 이라는 명령어도 있는 것을 보면, 안 되는 것도 되게 해 주는 요술지팡이는 아닌 것 같기도 하고...

e_byzantium = {
  destroy_landed_title = THIS
}
4) 작위 타이틀을 빼앗기

타이틀 강탈(usurp) 명령어는 부수효과에 따라서 다섯 개의 명령어가 있습니다. 다만 저는 이 명령어를 써 본 적이 없기 때문에, 이들이 어떤 차이가 있는지는 잘 알지 못합니다. 아마도, 해당 타이틀을 빼앗을 때에, 그 이하에 있는 남작령 혹은 원래 주군의 봉신들의 타이틀을 어떻게 할 것인지에 대한 차이일 겁니다. 다 빼앗아오느냐, 아니면 기존 봉신들을 그대로 내 봉신으로 받느냐... 특성상 주로 전쟁명분(Casus Belli) 에서 전쟁 승리의 결과를 정의할 때에 사용합니다.

usurp_title,
usurp_title_only,
usurp_title_plus_barony_if_unlanded,
usurp_title_plus_barony_if_unlanded_and_vassals,
usurp_title_plus_barony_if_unlanded_and_vassals_no_adj

■ 주군/봉신

기본적으로 여기서 다루는 것은 사실로서의 주군/봉신 관계를 의미합니다.

1) 캐릭터를 내 궁정으로 데려오기

작위가 없는 일반 가신 캐릭터들은 게임상에서도 나의 궁정으로 초청이 가능합니다. 이처럼 가신 캐릭터를 나의 궁정으로 데려오는 명령어는 move_character 입니다.

  FROM = {
    any_child = {
      limit = { at_location = FROM }
      move_character = ROOT
    }
    move_character = ROOT
    opinion = {
      who = ROOT
      modifier = opinion_saved_me_and_child
      years = 10
    }
  }

위의 예시는 샤를마뉴 이벤트의 구문인데, 워낙 깔끔하게 잘 되어 있어서 통째로 예시로 가져왔습니다. FROM 캐릭터가 자신의 아이들과 함께 통째로 ROOT 의 궁정으로 이사오는 이벤트입니다.

2) 주종관계의 확인

이 부분은 저도 쓸 때마다 혼동이 오는 부분입니다.

  • host = { is_liege_of = ROOT } 는, 스코프의 캐릭터가 ROOT 의 주군인지를 확인하는 것입니다.
  random_realm_character = {
    limit = {
      ai = yes
      OR = {
        is_liege_of = ROOT
        liege = { is_liege_of = ROOT }
        ROOT = { is_liege_of = THIS }
      }
    }
    ...
  }

마찬가지로 원본에 있는 내용을 그대로 가져왔습니다. 임의의 realm 내 캐릭터 하나를 선택하는데, 조건 세 줄이 OR 로 묶여 있죠. 첫 줄은 해당 캐릭터가 ROOT 의 주군인지, 둘째줄은 그 캐릭터의 주군이 나의 주군인지(같은 주군 아래에 있는지), 셋째줄은 ROOT 가 그 캐릭터의 주군인지(내 가신이나 봉신인지)를 확인하는 거죠. 여기서도 THIS 는 ROOT나 FROM 에는 영향받지 않는다는 것을 아셔야 혼동이 오지 않겠죠. 세 번째 줄.

  • is_liege_or_above = ROOT 는, ROOT 가 스코프 캐릭터나 프로빈스의 주군이거나 혹은 그 이상인 경우입니다. 즉, 어쨌거나 ROOT 가 스코프 캐릭터/프로빈스를 지배중인 경우.
  719 = { # Mecca
    owner = {
      OR = {
        is_liege_or_above = ROOT
        character = ROOT
      }
    }
  }

이것도 원본의 내용 그대로입니다. 프로빈스 719(메카)의 소유자가 ROOT이거나, 그 소유자의 주군 또는 주군의 주군이 ROOT 인 경우입니다.

  • is_vassal_or_below = ROOT 는 뭘까요? 바로 위의 반대로 생각하면 됩니다. ROOT 가 스코프 캐릭터의 봉신이거나 그 이하인 경우를 의미합니다. is_liege_of 와 유사한 결과를 보여주죠. 단, is_liege_of 는 ROOT 의 직접 주군만이 해당되는 데 비해, is_vassal_or_below 는 ROOT 의 직접 주군 뿐만 아니라 주군의 주군 등 자신보다 위에 있는 자들이 모두 해당된다는 데 있습니다.

예를 들면, 봉신인 백작(ROOT)의 위치에서, is_liege_of = ROOT 를 발동시키면 백작의 바로 직속 주군인 공작 한 명만 해당하게 됩니다. 그러나, is_vassal_or_below = ROOT 를 발동시키면 공작 뿐만 아니라 그 공작의 주군인 왕, 그 왕의 주군인 황제까지도 범위에 들어올 수가 있습니다.

# Don't target my liege unless I am ambitious
any_claim = {
  has_holder = yes
    holder_scope = {
      OR = {
        NOT = { is_vassal_or_below = ROOT }
        ROOT = { trait = ambitious }
      }
    }
  }
}

모험가 침략의 조건 일부를 가져온 것인데요. NOT = { is_vassal_or_below = ROOT } 부분이 핵심입니다. NOT 이 없다면, ROOT가 클레임 홀더의 봉신/가신일 것이라는 조건이 되겠죠? 하지만 NOT 이 있으니, 클레임 홀더의 봉신 또는 가신이 아닐 것! 이라는 조건이 되는 거죠.

  • 내 직접봉신의 숫자를 기준으로 한 조건 : num_of_vassals 조건문을 이용하면 나의 직접봉신의 수를 기준으로 한 이벤트의 구성이 가능합니다.
# 내 직접봉신이 8명 이상이라면...
if = {
  limit = {
    num_of_vassals = 8
  }
  ....
}  
3) 주종관계의 설정

모드 내에서 주종 관계를 강제로 설정하는 경우는 그리 많지 않겠지만, 일단 가능은 합니다. set_defacto_liege, set_defacto_vassal 명령어를 사용하면 됩니다. 아래의 예시는 FROM 이 독립영주이고 자신(ROOT) 보다 낮은 작위를 가진 경우, FROM 을 ROOT 의 봉신으로 설정하는 구문입니다.

  trigger = {
    FROM = {
      de_facto_liege = THIS
      lower_tier_than = ROOT
    }
  }
  ROOT = {
    set_defacto_vassal = FROM
  }

참고로, set_defacto_liege = THIS 와 같이 자기 자신을 설정하게 되면 자신의 주군으로부터 독립하여 독립영주가 됩니다.

■ 양위/승계/계승법

1) 양위/승계

조금 미묘한 부분인데, 기본적으로 CKII는 사망에 의한 승계 이외의 승계를 지원하지 않습니다. 그러나 모드 레벨에서까지 이를 막지는 않습니다. 즉, 원할 때에 작위를 승계하고 뒷방으로 물러날 수 있는(...) 기능을 구현할 수는 있습니다.

  • 자연승계: : abdicate = yes 명령어를 사용하면, 현재 스코프의 캐릭터가 법률적 계승자에게 작위를 넘겨주고 은퇴하게 됩니다. 사망한 것과 마찬가지의 승계가 이루어집니다. 원본에서는 몇몇 플롯이나 전쟁 명분을 제외하고, 순수 이벤트에서는 유일하게 Sons of Abraham DLC 의 이벤트에서 사용하고 있습니다.
  option = {
    name = EVTOPTA_SOA_3014 # Abdicate
    
    # (...중간생략...)
    
    abdicate = yes

    if = {
      limit = {
        religion_group = christian
      }        
      add_trait = nun
    }
  }
  • 지정승계 : 이 부분이 좀 미묘한 부분인데요. abdicate_to 명령을 사용하면 현재의 지위를 특정한 캐릭터를 지정하여 (계승 순위와 상관없이!) 넘겨줄 수 있습니다. AI 는 모르겠지만 플레이어의 경우에는 주의해서 사용해야 합니다. 가문원 이외의 사람에게 모든 권리가 넘어갈 경우 게임 오버가 될 수도 있으니 말입니다. 원본에서 이 abdicate_to 명령은 오직 전쟁명분에서만 사용됩니다만, 일반 이벤트에서도 사용 가능합니다. 아래 예시는 제 모드에서 사용된 abdicate_to 의 예입니다.
  immediate = {
    d_female_knights_band = {
      holder_scope = {
        abdicate_to = ROOT
      }
    }

    FROM = {
      move_character = ROOT
    }
  }

여성 용병단의 선거제가 이상하게 돌아가서 뜬금없는 남자들이 자꾸 단장에 취임하길래, 단장이 남자가 될 경우에 단장 직위를 가신들 중 임의의 여성에게 넘기도록 하는 코드를 작성을 했었습니다. 그 때 사용된 코드입니다.

참고로 지정승계의 경우, 원래의 플레이어가 가지고 있던 금화는 넘어가지 않습니다. (필요한 경우 직접 넘겨주어야 합니다. 앞에서 본 적 있는 wealth 명령어 및 clear_wealth = yes 명령어를 사용합니다.)

2) 계승법8)

일반적으로 작위 계승법은 변경하는 데 상당한 제약이 걸려 있죠. 그러나 모드 레벨에서 이를 강제로 변경하는 것도 가능합니다. 계승법과 성별법 모두 해당됩니다. 이 명령어들은 원본에서는 오직 법률 디시전 부분에서만 사용되지만, 일반 이벤트에서 사용이 불가능한 것은 아닙니다. 다만, 이렇게 강제로 계승법을 변경했을 때에 다른 이벤트나 설정과의 문제로 인해 꼬이는 경우가 발생할 수 있으니 충분한 주의를 요합니다.

  • 계승법의 변경 : succession 명령어를 사용하여 강제로 계승법 변경이 가능합니다. 스코프는 타이틀, 값은 계승법입니다. 총 13가지의 계승법이 존재합니다.

gavelkind : 분할 상속제
primogeniture : 장자 상속제
seniority : 연장자 상속제
ultimogeniture : 말자 상속제
feudal_elective : 선거 군주제
turkish_succession : 터키쉬
elective_gavelkind : 선거 분할 상속제
tanistry : 족장 후계자
appointment : 임명제
catholic_bishopric : 주교직
papal_succession : 교황의 승계
open_elective : 선거 공화제
patrician_elective : 도시귀족 선거제

  succession = primogeniture
  • 성별법의 변경 : gender_succ 명령어를 사용하여 강제로 성별법 번경이 가능합니다. 스코프는 타이틀, 값은 성별법입니다. 총 5가지의 성별법이 존재하지만, 원본 게임상으로 사용되는 것은 3가지의 성별법 뿐이죠.

agnatic : 남성 상속
cognatic : 남성우선 상속
true_cognatic : 남녀평등 상속
enatic_cognatic : 여성우선 상속 (게임에서 사용되지 않지만, 모딩에서 사용할 수 있음)
enatic : 여성 상속 (게임에서 사용되지 않지만, 모딩에서 사용할 수 있음)

  gender_succ = cognatic 
  • 계승자의 재확인 : 계승법 또는 성별법을 이렇게 강제로 변경한 경우, 변경한 결과 계승자(current heir)가 제대로 표시되지 않는 경우가 많습니다. 보통 이런 경우 세이브 후 로드하면 문제가 해결되지만, 이런 문제를 발생시키지 않기 위해, 현재의 계승자를 다시 계산해서 표시해 주는 명령어가 존재합니다. recalc_succession = yes 명령어가 그것입니다. 이 명령어는 계승자에 영향을 줄 수 있는 이벤트를 작성할 때마다 넣어주는 것이 좋습니다. 스코프의 제한을 받지 않는다고 되어 있습니다만, 보통은 계승법 또는 성별법 변경 바로 다음에 이 명령어를 넣어주곤 합니다. 따라서 보통은 타이틀이나 캐릭터 등의 스코프에서 자주 쓰이게 되겠죠. 원본에서는 샤를마뉴 스토리 이벤트에서 사용이 됩니다. 사생아를 법적으로 인정하고 계승 순위를 다시 계산해 주는 데 쓰였죠. (스코프는 사생아 본인의 스코프입니다.)
  dynasty = 25061
  remove_trait = bastard
  add_trait = legit_bastard
  recalc_succession = yes
  • 계승자인지 확인 : is_primary_heir 조건문을 사용하면 현재 스코프의 캐릭터가 계승자인지 여부를 확인할 수 있습니다. 받는 값은 yes/no 일 수도 있고, 특정한 캐릭터 스코프일 수도 있는데, 아래 예시는 캐릭터 스코프로 사용된 예입니다. 샤를마뉴 이벤트 중에서 나타납니다.
any_sibling = {
  has_character_flag = is_charlemagne
  is_primary_heir = ROOT
}

형제자매들 중에서 ROOT 의 직접 계승자가 존재한다면 이 스코프는 참이 되겠죠. yes/no 를 받는 경우의 문맥은 저도 참 읽기 어려운데, 보통 아래와 같이 쓰입니다.

any_child = {
  is_primary_heir = yes
}

누구의 계승자이건 관계 없이, 프라이머리 타이틀의 계승자이기만 하면 이 조건문이 참이 되는 것 같아요.

■ 기술

  • 기술 경험치(techpoint) 증가 : military_techpoints, economy_techpoints, culture_techpoints. 모두 캐릭터 스코프로 사용되며, 값은 자연수 그대로 사용합니다.
ROOT = {
  military_techpoints = 250
}
  • 지역 기술 레벨 증가 : 경험치고 뭐고, 그냥 아예 기술 레벨 자체를 올려버리는 사기급 명령어가 있습니다. change_tech 라고... 프로빈스 스코프에 적용됩니다.
ROOT = {
  location = {
    change_tech = {
      technology = TECH_NAVAL
      value = 1
    }
  }
} 

technology 뒤에 들어갈 이름은 common/technology.txt 를 참고하십시오.

■ 유니트

저도 이 부분은 경험이 많지 않아서, 알고 있는 내용이 많지 않습니다. 기본적인 내용 두 개만 언급하고 넘어가겠습니다.

1) 부대(둠스택) 생성

spawn_unit = { } 명령어를 사용합니다. 캐릭터 스코프에서 사용할 수 있는데, 원본에서는 대개 새로운 캐릭터를 생성한 후 해당 캐릭터를 지휘자로 하는 군대를 찍어내는 데 이 명령을 사용하곤 합니다. (뭐 대부분 반란군이나 기타등등.. 의 생성에 사용하니...) 자세한 내용은 위키의 해당 부분을 참조하시기 바랍니다.

spawn_unit = {
  owner = ROOT
  province = ROOT
  home = ROOT
  troops = {
    archers = { 500 500 }
    light_infantry = { 1500 1500 }
    heavy_infantry = { 300 300 }
    light_cavalry = { 200 200 }
  }
  attrition = 1.0
  disband_on_peace = yes
  maintenance_multiplier = 0.5
}
  • disband_on_peace = yes 는, 평화 상태가 되면 자동으로 이 군대가 해산된다는 것입니다. 이것을 no 로 설정하면 계속 쓸 수 있는 둠스택이 되는 거죠.

하는 김에, 아주 사기 둠스택을 만들어 볼까요? 예제 코드에서는 attrition = 1.0 으로 설정되어 있습니다만, 이것을 0으로 설정하면, 보급 제한으로 인한 불이익이 0인 부대가 되는 겁니다. 하나 더, 위에서는 사용되지 않았습니다만, maintenance_multiplier = 0 으로 지정하면, 유지비용마저 0이 됩니다. 이건 뭔 사기...

  • 예제에는 earmark 값이 설정되지 않았습니다만, 이것을 설정해야 나중에 필요할 때에 이 부대를 해산시킬 수 있습니다. earmark 값을 지정한 경우, 해당 둠스택을 해산하는 명령어는 disband_event_forces 명령어입니다. 이 명령어를 사용하여 바로 뒤에 생성할 배 유니트의 경우에도 해산이 가능합니다.
disband_event_forces = earmark
2) 배 생성

spawn_fleet = { } 명령어를 사용합니다. 마찬가지로 캐릭터 스코프 내에서 사용합니다. 아니나 다를까, 원본 이벤트에서 이 명령어는 올드갓 이벤트쪽에 집중되어 있네요. 젠장할 노스퀴토...

spawn_fleet = {
  province = PREV
  owner = ROOT
  earmark = prepared_invasion
  troops =
  {
    galleys = { 20 20 }
  }
}

■ 이벤트 진행

이벤트 진행에서 사용되는 명령어들은 이전에 거의 대부분 다룬 바가 있습니다. 모디파이어라든가, 플래그라든가.. 여기서는 그렇게 별도의 항목을 할당하여 다루지 않는 것들 중에서 잘 쓰이는 것들을 적어보겠습니다.

1) 이벤트의 호출

캐릭터 이벤트를 호출하는 것은 이전에도 몇 번 다룬 적이 있었지요. 여기서 다시 쓴 이유는 days = 12 때문입니다. 이렇게 날짜를 함께 지정하면, 해당 날짜 동안 이벤트 발생이 연기됩니다. 아래 예시의 경우에는 게임 시간으로 12일이 지난 후에 이벤트가 실행됩니다. 날짜 지연에도 불구하고 이벤트 체인은 끊어지지 않는다는 점이 특징이죠. letter_event = { }, narrative_event = { }, province_event = { } 등 이벤트를 호출하는 모든 경우에 유효합니다.

FROM = {
  character_event = {
    id = LoR.30
    days = 12
    random = 15
    tooltip = EVTTOOLTIP_LoR_30
  }
}

이렇게 지연 날짜를 붙인 경우에는 random = nn 과 같이 랜덤값을 붙일 수가 있습니다. 이 경우 이벤트의 지연 날짜가 랜덤 숫자만큼 오락가락합니다. 위의 경우 최소 12일, 최대 27일 후에 이벤트가 실행이 되는 거죠.

tooltip = 옵션을 붙이면 해당 내용이 툴팁에 출력됩니다만, 대개 캐릭터 이벤트 호출의 경우에는 hidden_tooltip = { } 을 함께 붙이는 것이 보통이어서, 의미가 없을 때가 많습니다.

2) 연월을 확인하는 조건문

게임 내에서 연월일이 크게 중요할 일은 사실 거의 없지만, 종종 쓰이긴 합니다. 이벤트가 특정 월에만 가능하게 한다던가, 최소한 950년 이후에 이벤트를 해금시킨다던가 하는 식으로요. year 는 현재의 년도를 반환하며, month 는 현재의 월을 반환하는데, 단 1~12가 아니라 0~11입니다.

3) 항상 조건을 참/거짓으로 만들기

어떤 경우에, 특정한 조건문 섹션을 항상 참 또는 거짓으로 만들고 싶은 경우가 있습니다. 주로 디버그를 위해서 특정한 이벤트나 디시전을 항상 실행시키고 싶은 경우, 반대로 특정한 이벤트나 디시전이 절대 실행되지 않도록 하고 싶은 경우가 있을 수 있죠.

이런 경우에는 조건절 내에 always = yes/no 조건문을 사용하시면 됩니다. 예를 들면, 아래처럼 trigger = { } 가 지정되어 있다면 이 option = { } 은 어떤 경우에도 나타나지 않습니다.

  option = {
    name = TEST
    trigger = {
      always = no
    }
    ....
  }
4) 오직 플레이어만 사용할 수 있는/없는 조건

어떤 이벤트나 디시전을 오직 플레이어만 사용할 수 있도록 하고 싶은 경우가 있습니다. 주로 치트성 디시전/이벤트가 그렇죠. 반대로 어떤 이벤트나 디시전을 플레이어는 사용할 수 없도록 (오직 AI 만 사용할 수 있도록) 설정할 수도 있습니다. 지금까지도 몇 번 등장한 적이 있는 것 같은데요. 이럴 때는 조건절(의 캐릭터 스코프)에 ai = yes/no 조건문을 사용하면 됩니다.

예를 들면, 디시전의 potential = { } 섹션 내에 아래와 같이 설정하면 이 디시전은 플레이어만 사용할 수 있는 디시전이 됩니다.

  potential = {
    ai = no
  }
5) 툴팁을 보여주고 싶지 않아!

대개 option = { } 섹션 등 효과 섹션에 적은 내용들은 플레이어가 툴팁으로 그 내용을 볼 수가 있습니다. 해당 선택지를 골랐을 때에 어떤 일이 일어날지 알 수 있다는 거죠. 만약 그 내용을 미리 볼 수 없도록 하려면, hidden_tooltip = { } 안쪽에 그 내용을 적으면 됩니다.

예를 들어,

  option = {
    name = EVTOPTA_SOA_3060
    hidden_tooltip = {
      host = {
        character_event = { id = SoA.3061 }
      }
    }
    imprison = no
  }

위와 같은 옵션의 경우에, 플레이어가 해당 옵션 위에 마우스를 얹으면, imprison = no (감옥에서 풀려남) 에 해당하는 내용은 툴팁을 통해 확인할 수 있습니다만, hidden_tooltip = { } 내부에 있는 내용 - SoA.3061 이벤트가 실행되는 부분 - 은 플레이어가 알 수 없습니다.

6) 맞춤형 툴팁을 보여주고 싶은 경우

예를 들면, 이런저런 잡다한 내용에 대한 툴팁이 다 보여지는 것이 싫지만, 그렇다고 해서 전혀 플레이어에게 정보를 안 주는 것은 곤란하다거나, 혹은 여러 줄의 코드에 대한 툴팁을 한 줄의 설명으로 대체할 수 있어서 그렇게 따로 설명을 달아주고 싶은 경우가 있습니다. 이런 경우에 custom_tooltip = { } 을 사용하면 됩니다. 대개는 hidden_tooltip = { } 과 함께 쓰이곤 합니다.

  option = {
    name = EVTOPTA_REP_303

    wealth = -300
    custom_tooltip = {
      text = EVTOPTA_REP_303_tooltip
      hidden_tooltip = {
        FROM = {
          character_event = { id = REP.304 days = 5 }
        }
      }
    }
  }

예를 들면, 위의 코드의 경우, wealth = -300 의 툴팁은 그대로 플레이어에게 보여집니다. 그러나 REP.304 이벤트가 일어나는 부분은 hidden_tooltip = { } 안에 있으므로 보여지지 않고, 대신 지정된 사용자 지정 툴팁의 내용이 보여지는데, 보여지는 텍스트의 내용은 EVTOPTA_REP_303_tooltip 입니다. 이것은 언어 파일에 존재하는 메시지 ID 로, 언어 파일에서 EVTOPTA_REP_303_tooltip 를 찾아 보면 어떤 메시지인지 알 수 있습니다. (실제 사용하실 때도 이렇게 사용하시면 됩니다.)

위의 예시처럼, hidden_tooltip = { } 내부에 custom_tooltip = { } 을 지정하는 경우도 있습니다만, 반드시 위와 같이 사용할 필요는 없습니다. hidden_tooltip = { } 밖에 custom_tooltip = { } 을 지정해도 됩니다.


8) 계승법 및 성별법 법률 자체에 대한 모딩은 별도의 가이드로 작성되어 있습니다. (2015/03/17 추가)

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

댓글

댓글 리스트
  • 작성자Charment | 작성시간 15.02.15 잘 보고 있습니다!
  • 작성자가이사 | 작성시간 15.02.16 생각보다 많이 복잡하네..
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼