|
설정한 변수 내에 들어 있는 값은 두 종류의 조건문으로 확인이 가능합니다. 우선 일반적인 조건문으로, 다른 조건문에서와 마찬가지로 크거나 같다 연산으로 확인하는 방법입니다.
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 등, 해당 변수가 저장된 캐릭터의 스코프에 맞춰 쓰시면 됩니다. (이 기능이 추가되면서 변수의 활용도가 조금 넓어졌습니다. 단순한 내부용 변수라고 하더라도, 그 값을 사용자에게 보여줄 수 있는가의 여부에 따라서 활용도는 천지차이가 되니까요.)
이제 이벤트와 관련하여 봐야 할 부분은 다 본 것 같습니다. 그런데 이대로 마무리하기는 뭔가 좀 아쉽네요. 무언가 덧붙일 만한 내용이 있을까 하고 생각하다가, 디시전과 이벤트를 다 봤으니, 여기에 사용할 수 있는 상황별 조건문 및 명령어들 중 자주 쓰일 만한 것들을 선별해서 한번 정리해 보는 것도 좋을 것 같았습니다.
앞에서 별도의 주제로 잡아서 자세히 다뤘던 명령어들이나 조건문들은 특별히 추가할 내용이 존재하지 않는 한 생략합니다.
다만 제가 사용해 보지 않은 명령어나 조건문들은 웬만해서는 소개하기 어려울 것 같고, 그런 부분은 직접 위키를 참조하시기 바랍니다.
표를 보는 법에 대해서 앞에서 간단히 설명은 드렸었습니다만, 다시 한 번 강조드립니다. 다음의 항목들을 항상 주의하면서 보십시오.
참고로, 저걸 다 기억할 필요는 당연히 없습니다. 대충 이런 게 가능하다 정도만 알아두시면 필요할 때마다 찾아가면서 쓸 수 있잖아요? 안 그래도 기억할 게 많은데, 이런 걸로 두뇌에 스트레스를 가중시킬 필요는 없습니다. (근데 사실 몇 번 작성하다 보면 많이 쓰는 코드들은 그냥 손에 익어요.)
그럼, 시작합니다!
캐릭터와 관련된 명령어이므로 확인 또는 변경하려는 캐릭터의 스코프에서 사용합니다.
아래는 스코프 캐릭터의 외교력(diplomacy) 값이 6 이상인지를 확인하는 예시입니다.
if = { limit = { diplomacy = 6 } ... }
조건문과 달리 각각의 스탯 이름 앞에 change_ 를 붙입니다. (이걸 change_ 를 떼고 쓰는 실수를 굉장히 자주 하게 됩니다. 이 경우 오류는 발생하지 않지만, 물론 적용도 되지 않습니다.) 숫자를 음수로 지정하면 해당 수치가 그 만큼 감소합니다.
아래는 예시입니다.
change_diplomacy = 1 change_martial = 5 change_stewardship = -2 change_intrigue = 3 change_learning = -1
현재의 스코프 캐릭터와 다른 캐릭터(ROOT,FROM,PREV 등으로 지정 가능한 캐릭터)의 외교력, 무력, 관리력, 음모력, 학력 값을 서로 비교할 수 있습니다. attribute_diff = { } 조건문을 사용하면 됩니다.
아래의 예시는, 스코프 캐릭터의 Learning 값과 FROM 캐릭터의 Learning 값을 비교해서, FROM 캐릭터의 Learning 값이 더 큰 경우(NOT = { } 으로 묶었으므로, 같은 경우에도 거짓이 됩니다)에 이벤트를 실행시키기 위한 트리거 조건이 되겠습니다.
trigger = { NOT = { attribute_diff = { attribute = learning character = FROM value = 0 } } }
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 } }
아래 예시는 위 두 조건문을 사용한 예로, FROM 이 남성이고, ROOT 와 FROM 이 같은 성별일 것을 조건으로 하는 조건문입니다.
if = { limit = { FROM = { is_female = no same_sex = ROOT } } ... }
야망 및 삶의 방식 정의 코드는 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 = obj_have_a_son : 아들을 갖기 야망을 설정합니다.
cancel_ambition = yes : 현재의 야망을 취소합니다.
원본에서도 극히 적지만, 코드에서 야망을 설정하거나 취소하는 예가 존재합니다.
아래의 예시는, 캐릭터가 한 달 수입금의 25%에 해당하는 금화를 가지고 있다면, 그 만큼을 사용하는(감소시키는) 예제입니다. 이처럼 같은 명령어가 조건문과 명령어로 모두 사용됩니다.
if = { limit = { scaled_wealth = 0.25 } scaled_wealth = -0.25 }
게임 내에서는 wealth 명령으로 고정금액을 차감하는 방식보다는 scaled_wealth 명령으로 현재 수입에 비례해 얼마를 차감하는 방식을 더 많이 씁니다.
# 한 달 수입의 20% 를 FROM 에게 준다 transfer_scaled_wealth = { to = FROM value = 0.2 }
아래의 예시는, 현재 명성(prestige)이 500이 넘는다면, 이를 소비하여 신앙심(piety) 1000을 얻는 이벤트 선택지를 구현한 것입니다.
option = { name = TEST_0001 trigger = { prestige = 500 } ROOT = { prestige = -500 piety = 1000 } }
트레잇 중 서로 반대 상성인 트레잇들이 있습니다. 위키의 트레잇 표를 보시면 알 수 있는데요. 반대 상성인 트레잇이 한 캐릭터에 중복되는 것을 방지하기 위해서, 트레잇을 추가할 때는 반대 트레잇이 있는지 먼저 확인하고 지워주도록 합시다. 예문상으로는 조건문으로 트레잇 여부를 확인한 후에 트레잇을 제거하거나 추가했습니다만, 정석이 그렇다는 거고, 특히 추가의 경우는 있는 트레잇을 다시 추가해도 문제는 안 생깁니다.
# 독단적인 (arbitrary) 트레잇을 추가하기 위한 코드. 반대 상성인 just도 제거해준다. if = { limit = { trait = just } remove_trait = just } if = { limit = { NOT = { trait = arbitrary } } add_trait = arbitrary }
# 가진 트레잇 수가 5개 미만일 때... if = { limit = { NOT = { num_of_traits = 5 } } ... }
트레잇에 관해서는 이야기할 것들이 아직 여러 가지 있습니다만, 이 부분은 차후 트레잇 모딩에 대해 다루게 되면 그 때 추가하도록 하겠습니다.
# 퇴폐도가 90 이상이 되면 퇴폐도 25를 줄이는 코드. 예시를 위한 예시.. ROOT = { if = { limit = { decadence = 90 } decadence = -25 } }
조건문과 명령어 모두 심플하게 dynasty 입니다.
예시는, 가신 중 Lowborn 인 캐릭터 중 랜덤한 하나의 캐릭터에 대하여 ROOT 의 캐릭터와 같은 가문을 부여하는 것입니다. (신분상승 로또?)
if = { limit = { any_courtier = { dynasty = none } } random_courtier = { dynasty = ROOT } }
set_father = PREV set_real_father = PREVPREV set_mother = PREV
if = { limit = { FROM = { is_father = ROOT } } .... }
특정 캐릭터를 연인에 추가하거나 연인 목록에서 삭제하는 명령어입니다.
연인과 관련된 자주 쓰이는 조건문들입니다.
# 본격 사랑의 짝대기... # 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 } }
우선 명령어부터 확인하겠습니다.
코드를 통해 모계 결혼도 구현할 수 있다는 것이 특징적입니다.
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 가 준비되어 있으므로 이것을 사용해도 좋습니다.
첩과 관련된 명령을 집행할 때는 종교가 파간 계열이나 조로아스터교인지 확인하셔야 합니다. 혹은, 현재 캐릭터 설정이 첩을 받을 수 있는지 확인하는 조건문인 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 는 위키의 목록에 존재하지 않습니다만, 원본에도 사용된 예가 있으므로 안심하고 쓰십시오.
impregnate 는 정상적인 임신, impregnate_cuckoo 는 혼외 임신(즉 불륜)을 만드는데, 두 명령 모두 누구의 아이인지를 표시하는 대신 yes 라고 표시할 수 있습니다. (또는 0이라고 쓰거나요) 이렇게 하면 누구의 아이인지 모르는 상태의 임신이 됩니다. 시스템상으로도 기록이 되지 않아서, 영원히 누구의 자식인지 알 수 없게 됩니다.
참고로, is_pregnant = yes/no 로 확인하는 임신 이외에 종종 임신 트레잇을 가지고 확인하는 경우도 있는데요. (trait = pregnant) 트레잇은 실제로 임신 후 일정 기간이 지난 후에 붙기 때문에(현실에서도, 어느 정도 배가 불러오기 전에는 임신인지 어떤지 모르잖아요?) 트레잇을 가지고는 임신여부를 정확히 판단할 수 없습니다.
# FROM 이 ROOT 의 아이를 임신합니다. FROM = { if = { limit = { is_female = yes is_pregnant = no } impregnate = ROOT } }
실제로, 게임상에서 쌍둥이가 출산되는 것은 사실 쌍둥이와 관련된 무언가가 시스템상 따로 있는 게 아니라 단순히 같은 날 중복 임신이 된 것입니다. 이벤트로 쌍둥이를 출산시키고 싶다면 impregnate 명령어를 이벤트 내에서 두 번 써주면 됩니다.
set_guardian 명령을 통해 후견인을 지정할 수 있습니다.
# FROM 의 후견인으로 ROOT 를 지정합니다. FROM = { set_guardian = ROOT }
후견인은 6세 이상의 미성년자에게 없어서는 안 되는 것이므로, 후견인을 따로 박탈하는 명령어는 없습니다. 다만 새로 지정하면 기존 후견인은 자동으로 잘리겠죠.
일반적인 캐릭터를 생성하는 명령문은 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 = { } 에 사용할 수 있는 각종 옵션에 대해서는 조금 설명이 필요할 듯합니다.
2.3.2 기준으로, 종교는 random 을 못 받습니다. 오류가 발생해요.
특정 자문관으로 사용하기 좋은, 관련 교육 트레잇을 가진 캐릭터를 생성하는 명령어가 따로 있습니다. 다만, 교육의 레벨이 항상 높지는 않습니다. 랜덤하게 나타나요. 특징이나 사용 방법은 위의 create_character 와 비슷합니다만, 교육을 받은 캐릭터라는 특성상 미성년 캐릭터는 생성할 수 없습니다.
create_random_diplomat = { random_traits = yes dynasty = random female = no } create_random_intriguer = { } create_random_priest = { } create_random_soldier = { } create_random_steward = { }
생성된 캐릭터는 현재 스코프 캐릭터의 가신이 됩니다. 그리고 프로빈스 스코프에서도 생성이 가능하며, 이 때는 해당 프로빈스의 지배자의 가신으로 생성됩니다. (이 부분은 테스트를 못 해봤습니다.)
특정 캐릭터를 추방 : banish 명령어를 사용합니다. banish = yes 와 같이 사용하면 해당 스코프의 캐릭터를 추방합니다.
특정 캐릭터를 투옥/석방 : 투옥에는 imprison 명령어를 사용하면 됩니다. imprison = yes 또는 imprison = ROOT 의 형태로 사용합니다. 석방은 해당 죄수의 스코프에서 prisoner = no 해 주면 됩니다. (prisoner = yes 해 줘도 투옥 됩니다. imprison = yes 와 같아요)
# FROM 을 ROOT 의 감옥에 투옥합니다. FROM = { imprison = ROOT }
특정 캐릭터가 감옥에 갇혀 있는 날의 수를 기준으로 이벤트를 작성하고 싶다면, imprisoned_days 조건문을 사용하면 됩니다. 원본에서도 많지는 않지만 몇 차례 사용되고 있습니다.
캐릭터를 죽일 때는 death = { } 명령문을 이용하면 됩니다. death_reason 에 사망 이유를 적고, killer 에 누가 죽였는지를 적습니다. killer 는 설정하지 않을 수도 있습니다. (자연사의 경우, 혹은 누가 죽였는지 알 수 없는 경우)
death = { death_reason = death_execution killer = ROOT }
사망의 이유는 시스템상 다음과 같이 여러 가지로 세팅이 가능합니다.
주목할 것은 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;
종교와 문화는 캐릭터와 프로빈스에 각각 지정되는 항목이므로, 일반적으로 캐릭터 스코프와 프로빈스 스코프에서 모두 사용이 가능한 명령과 조건문들을 가지고 있습니다.
조건문과 명령 모두 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 의 이단인지를 확인합니다.)
사실 이 내용은 여기서 자세히 할 게 아니긴 하지만, 막상 종교 모딩 부분에서 명령어나 조건문을 자세히 설명할 기회도 없을 것 같아서 미리 정리하고 넘어갑니다.
# 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 }
참고로, 현재의 캐릭터나 프로빈스의 종교가 이단을 가지고 있는 종교인지를 확인하는 조건문은 has_heresies = yes 입니다.
노파심에 한 마디 더 추가. 위 예제에서, 혹시 왜 religion = PREV 인가 고민하신 분이 계신가요? THIS 와 달리 PREV 는 ROOT, FROM 이 나와도 스코프가 변경되기 때문에, 그 앞 스코프를 따라가는 게 맞습니다.
banish_religion = jewish
스코프 캐릭터나 프로빈스의 종교에 대해 종교 권위를 확인하는 조건문은 religion_authority 입니다. 종교 권위는 % 값이기 때문에, 0에서 1 사이의 값을 갖게 되죠. 아래 예는 트리거의 모디파이어에서 조건으로 사용된 예입니다.
modifier = { factor = 2.0 NOT = { religion_authority = 0.2 } }
종교 권위를 상승/하락시키는 명령어도 똑같이 religion_authority 인데, 이는 오피니언 모디파이어를 추가하는 것과 같이 미리 정의된 종교 모디파이어를 지정하는 방법으로 상승/하락시킵니다. 따라서, 이는 종교 모디파이어와 함께 확인하는 것이 더 적절할 것 같아서, 나중에 종교 모딩에 대해 설명할 때에 같이 하겠습니다. (종교 모디파이어도 다른 모디파이어처럼 간단하게 정의하고 사용할 수 있습니다.)
파문이 가능한 종교의 경우 해당 캐릭터의 스코프에서 excommunicate = yes 한 줄을 실행하는 것만으로 파문처리가 됩니다. 파문을 철회하려면 반대로 excommunicate = no 하면 되죠.
파문된 자인지에 대한 체크는 FROM = { excommunicated_for = ROOT } 로 합니다. (FROM 은 파문여부를 확인할 캐릭터, ROOT 는 교황 등 파문할 권한을 가진 최고지도자 캐릭터입니다.)
클레임을 부여하는 용례는 두 가지가 있어서, 예시로 두 가지를 모두 보여드립니다.
# ROOT 에게 k_saxony 타이틀의 클레임을 추가 (스코프가 캐릭터인 경우) # 특정한 타이틀의 클레임을 지정해서 부여하는 방식으로, 특정 지역의 클레임을 얻는 # 시나리오에서나 쓸 만한 방법이겠죠. 범용적으로 쓰긴 어렵습니다. ROOT = { add_claim = k_saxony }
# FROM 이 있는 장소(백작령)의 타이틀에 대한 클레임을 ROOT 에게 추가. # (county = { } 는 프로빈스의 타이틀 스코프를 오픈합니다) # 보통 이렇게 더 많이 씁니다. 아예, 타이틀 = { add_claim = 캐릭터 } 라고 알아 두시는 게 좋습니다. FROM = { location = { county = { add_claim = ROOT } } }
remove_claim 명령을 사용합니다. 마찬가지로 타이틀 = { remove_claim = 캐릭터 } 라고 생각하시면 됩니다.
현재 특정 타이틀에 대한 클레임을 가지고 있는지를 확인하는 조건문이며, 모두 has_claim = 타이틀 의 방식으로 사용합니다. 원본에서는 이벤트 파일에서는 사용된 바가 없고, 음모나 CB 등에서만 사용되고 있습니다.
명예로운 칭호(마이너 타이틀)에 대해서는 아직 다루지 않았는데, 뒤에서 이 부분의 모딩도 다룰 예정이긴 합니다. 다만 이들 칭호나 자문관을 임명하고 자르는(...) 정도의 명령어는 미리 알아둬도 괜찮겠죠.
자문관은 재상(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 }
타이틀의 박탈 : 자문관과 칭호를 가리지 않고 remove_title 을 사용하면 됩니다.
특정 캐릭터가 해당 자문관인지를 확인하는 조건문이지만, 원본의 경우 이벤트에서는 이 조건문을 사용하지 않습니다. 대신 has_job_title = job_chancellor 와 같이 has_job_title 조건문을 사용하여 확인합니다.
아래 예시는 FROM 캐릭터가 대장군 직위를 가지고 있을 경우에 그 직위를 박탈하는 예제입니다.
FROM = { if = { limit = { has_job_title = job_marshal } remove_title = job_marshal } }
has_minor_title = 칭호 의 조건문을 사용하여 확인합니다.
현재 작위의 등급을 확인하려면 tier 조건문을 사용하면 됩니다. (정확히 테스트해보지는 않았지만, tier 조건문의 비교는 정확히 해당 등급의 작위인지를 판단할 것입니다.)
if = { limit = { primary_title = { tier = DUKE } } ... }
특정한 타이틀이 일정한 작위보다 높은가 낮은가를 판단하는 조건문으로 higher_tier_than, lower_tier_than 이 있습니다.
primary_title = { higher_tier_than = BARON }
위의 예제에서 보시는 것처럼 대개는 작위( BARON, COUNT, DUKE, KING, EMPEROR ) 를 적지만, 스코프와 값 모두 캐릭터를 받을 수도 있습니다. (원본의 이벤트들 중에도 예가 있습니다.) 스코프의 캐릭터의 작위가 값으로 주어진 캐릭터의 작위보다 더 높은가(higher_tier_than) 낮은가(lower_tier_than)를 판단하는 거죠.
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 = { } 이라는 명령어가 보이는데, 왕위를 생성한 건 중요한 사건이니까, 이를 연대기에 등록하라는 겁니다.
저도 오락가락하면서 설명을 드린 탓에 이게 과연 제대로 된 설명인지 모르겠습니다. 나중에 다시 한 번 읽어보던가 해야지...
타이틀을 부수는 명령어는 destroy_landed_title 입니다. 다만, 일반적으로 게임상에서 타이틀을 부술 수 없는 상황에서, 모드를 통해서 타이틀을 부술 수 있는지 여부는 확인하지 못했습니다. 일부 오류를 무시하고 타이틀을 부수는 unsafe_destroy_landed_title 이라는 명령어도 있는 것을 보면, 안 되는 것도 되게 해 주는 요술지팡이는 아닌 것 같기도 하고...
e_byzantium = { destroy_landed_title = THIS }
타이틀 강탈(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
기본적으로 여기서 다루는 것은 사실로서의 주군/봉신 관계를 의미합니다.
작위가 없는 일반 가신 캐릭터들은 게임상에서도 나의 궁정으로 초청이 가능합니다. 이처럼 가신 캐릭터를 나의 궁정으로 데려오는 명령어는 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 의 궁정으로 이사오는 이벤트입니다.
이 부분은 저도 쓸 때마다 혼동이 오는 부분입니다.
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 에는 영향받지 않는다는 것을 아셔야 혼동이 오지 않겠죠. 세 번째 줄.
719 = { # Mecca owner = { OR = { is_liege_or_above = ROOT character = ROOT } } }
이것도 원본의 내용 그대로입니다. 프로빈스 719(메카)의 소유자가 ROOT이거나, 그 소유자의 주군 또는 주군의 주군이 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 이 있으니, 클레임 홀더의 봉신 또는 가신이 아닐 것! 이라는 조건이 되는 거죠.
# 내 직접봉신이 8명 이상이라면... if = { limit = { num_of_vassals = 8 } .... }
모드 내에서 주종 관계를 강제로 설정하는 경우는 그리 많지 않겠지만, 일단 가능은 합니다. 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 와 같이 자기 자신을 설정하게 되면 자신의 주군으로부터 독립하여 독립영주가 됩니다.
조금 미묘한 부분인데, 기본적으로 CKII는 사망에 의한 승계 이외의 승계를 지원하지 않습니다. 그러나 모드 레벨에서까지 이를 막지는 않습니다. 즉, 원할 때에 작위를 승계하고 뒷방으로 물러날 수 있는(...) 기능을 구현할 수는 있습니다.
option = { name = EVTOPTA_SOA_3014 # Abdicate # (...중간생략...) abdicate = yes if = { limit = { religion_group = christian } add_trait = nun } }
immediate = { d_female_knights_band = { holder_scope = { abdicate_to = ROOT } } FROM = { move_character = ROOT } }
여성 용병단의 선거제가 이상하게 돌아가서 뜬금없는 남자들이 자꾸 단장에 취임하길래, 단장이 남자가 될 경우에 단장 직위를 가신들 중 임의의 여성에게 넘기도록 하는 코드를 작성을 했었습니다. 그 때 사용된 코드입니다.
참고로 지정승계의 경우, 원래의 플레이어가 가지고 있던 금화는 넘어가지 않습니다. (필요한 경우 직접 넘겨주어야 합니다. 앞에서 본 적 있는 wealth 명령어 및 clear_wealth = yes 명령어를 사용합니다.)
일반적으로 작위 계승법은 변경하는 데 상당한 제약이 걸려 있죠. 그러나 모드 레벨에서 이를 강제로 변경하는 것도 가능합니다. 계승법과 성별법 모두 해당됩니다. 이 명령어들은 원본에서는 오직 법률 디시전 부분에서만 사용되지만, 일반 이벤트에서 사용이 불가능한 것은 아닙니다. 다만, 이렇게 강제로 계승법을 변경했을 때에 다른 이벤트나 설정과의 문제로 인해 꼬이는 경우가 발생할 수 있으니 충분한 주의를 요합니다.
gavelkind : 분할 상속제
primogeniture : 장자 상속제
seniority : 연장자 상속제
ultimogeniture : 말자 상속제
feudal_elective : 선거 군주제
turkish_succession : 터키쉬
elective_gavelkind : 선거 분할 상속제
tanistry : 족장 후계자
appointment : 임명제
catholic_bishopric : 주교직
papal_succession : 교황의 승계
open_elective : 선거 공화제
patrician_elective : 도시귀족 선거제
succession = primogeniture
agnatic : 남성 상속
cognatic : 남성우선 상속
true_cognatic : 남녀평등 상속
enatic_cognatic : 여성우선 상속 (게임에서 사용되지 않지만, 모딩에서 사용할 수 있음)
enatic : 여성 상속 (게임에서 사용되지 않지만, 모딩에서 사용할 수 있음)
gender_succ = cognatic
dynasty = 25061 remove_trait = bastard add_trait = legit_bastard recalc_succession = yes
any_sibling = { has_character_flag = is_charlemagne is_primary_heir = ROOT }
형제자매들 중에서 ROOT 의 직접 계승자가 존재한다면 이 스코프는 참이 되겠죠. yes/no 를 받는 경우의 문맥은 저도 참 읽기 어려운데, 보통 아래와 같이 쓰입니다.
any_child = { is_primary_heir = yes }
누구의 계승자이건 관계 없이, 프라이머리 타이틀의 계승자이기만 하면 이 조건문이 참이 되는 것 같아요.
ROOT = { military_techpoints = 250 }
ROOT = { location = { change_tech = { technology = TECH_NAVAL value = 1 } } }
technology 뒤에 들어갈 이름은 common/technology.txt 를 참고하십시오.
저도 이 부분은 경험이 많지 않아서, 알고 있는 내용이 많지 않습니다. 기본적인 내용 두 개만 언급하고 넘어가겠습니다.
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 }
하는 김에, 아주 사기 둠스택을 만들어 볼까요? 예제 코드에서는 attrition = 1.0 으로 설정되어 있습니다만, 이것을 0으로 설정하면, 보급 제한으로 인한 불이익이 0인 부대가 되는 겁니다. 하나 더, 위에서는 사용되지 않았습니다만, maintenance_multiplier = 0 으로 지정하면, 유지비용마저 0이 됩니다. 이건 뭔 사기...
disband_event_forces = earmark
spawn_fleet = { } 명령어를 사용합니다. 마찬가지로 캐릭터 스코프 내에서 사용합니다. 아니나 다를까, 원본 이벤트에서 이 명령어는 올드갓 이벤트쪽에 집중되어 있네요. 젠장할 노스퀴토...
spawn_fleet = { province = PREV owner = ROOT earmark = prepared_invasion troops = { galleys = { 20 20 } } }
이벤트 진행에서 사용되는 명령어들은 이전에 거의 대부분 다룬 바가 있습니다. 모디파이어라든가, 플래그라든가.. 여기서는 그렇게 별도의 항목을 할당하여 다루지 않는 것들 중에서 잘 쓰이는 것들을 적어보겠습니다.
캐릭터 이벤트를 호출하는 것은 이전에도 몇 번 다룬 적이 있었지요. 여기서 다시 쓴 이유는 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 = { } 을 함께 붙이는 것이 보통이어서, 의미가 없을 때가 많습니다.
게임 내에서 연월일이 크게 중요할 일은 사실 거의 없지만, 종종 쓰이긴 합니다. 이벤트가 특정 월에만 가능하게 한다던가, 최소한 950년 이후에 이벤트를 해금시킨다던가 하는 식으로요. year 는 현재의 년도를 반환하며, month 는 현재의 월을 반환하는데, 단 1~12가 아니라 0~11입니다.
어떤 경우에, 특정한 조건문 섹션을 항상 참 또는 거짓으로 만들고 싶은 경우가 있습니다. 주로 디버그를 위해서 특정한 이벤트나 디시전을 항상 실행시키고 싶은 경우, 반대로 특정한 이벤트나 디시전이 절대 실행되지 않도록 하고 싶은 경우가 있을 수 있죠.
이런 경우에는 조건절 내에 always = yes/no 조건문을 사용하시면 됩니다. 예를 들면, 아래처럼 trigger = { } 가 지정되어 있다면 이 option = { } 은 어떤 경우에도 나타나지 않습니다.
option = { name = TEST trigger = { always = no } .... }
어떤 이벤트나 디시전을 오직 플레이어만 사용할 수 있도록 하고 싶은 경우가 있습니다. 주로 치트성 디시전/이벤트가 그렇죠. 반대로 어떤 이벤트나 디시전을 플레이어는 사용할 수 없도록 (오직 AI 만 사용할 수 있도록) 설정할 수도 있습니다. 지금까지도 몇 번 등장한 적이 있는 것 같은데요. 이럴 때는 조건절(의 캐릭터 스코프)에 ai = yes/no 조건문을 사용하면 됩니다.
예를 들면, 디시전의 potential = { } 섹션 내에 아래와 같이 설정하면 이 디시전은 플레이어만 사용할 수 있는 디시전이 됩니다.
potential = { ai = no }
대개 option = { } 섹션 등 효과 섹션에 적은 내용들은 플레이어가 툴팁으로 그 내용을 볼 수가 있습니다. 해당 선택지를 골랐을 때에 어떤 일이 일어날지 알 수 있다는 거죠. 만약 그 내용을 미리 볼 수 없도록 하려면, hidden_tooltip = { } 안쪽에 그 내용을 적으면 됩니다.
예를 들어,
option = { name = EVTOPTA_SOA_3060 hidden_tooltip = { host = { character_event = { id = SoA.3061 } } } imprison = no }
위와 같은 옵션의 경우에, 플레이어가 해당 옵션 위에 마우스를 얹으면, imprison = no (감옥에서 풀려남) 에 해당하는 내용은 툴팁을 통해 확인할 수 있습니다만, hidden_tooltip = { } 내부에 있는 내용 - SoA.3061 이벤트가 실행되는 부분 - 은 플레이어가 알 수 없습니다.
예를 들면, 이런저런 잡다한 내용에 대한 툴팁이 다 보여지는 것이 싫지만, 그렇다고 해서 전혀 플레이어에게 정보를 안 주는 것은 곤란하다거나, 혹은 여러 줄의 코드에 대한 툴팁을 한 줄의 설명으로 대체할 수 있어서 그렇게 따로 설명을 달아주고 싶은 경우가 있습니다. 이런 경우에 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 추가)
첫댓글 잘 보고 있습니다!
생각보다 많이 복잡하네..