|
기본적으로 원글을 바탕으로 하고 있기 때문에, 우선 윗 글을 먼저 읽어보신 후에 제 글을 보시는 것이 좀 더 빨리 이해될 것입니다.
완성본은 모드 형태로 이 게시물에 첨부되어 있습니다.
원글의 경우, trigger = { } 조건만을 이용하여 트레잇을 붙였기 때문에, 출생과 판정 사이에 최대 20일까지의 시차가 발생했습니다. 우선 이 부분을 개선하도록 하겠습니다. 원 글에 작성한 덧글대로, on_actions.txt 를 수정하여 새로운 이벤트를 실행하는 쪽으로 작성을 해 볼 것입니다.
기본적인 이벤트는 원글에서 적어주신 이벤트를 그대로 사용하되, 범용성을 갖도록 하기 위해서 몇 군데 수정을 하고, 수정한 부분을 적시하는 쪽으로 작성하겠습니다.
namespace = BOB character_event = { id = BOB.0001 hide_window = yes is_triggered_only = yes ## ROOT : Born Baby trigger = { is_father_real_father = yes OR = { father = { ai = no } mother = { ai = no } } } immediate = { character_event = { id = BOB.0002 days = 2 } } }
원본과 비교하여 변경된 부분을 일단 말씀드리면, 처음에 존재했던 모든 Pre-Trigger 를 삭제했으며, is_triggered_only = yes 를 새로 만들어 넣었습니다. 또, 서출 관련 조건문을 제외했으며, father 또는 mother 가 특정한 작위를 가지고 있어야 하는 조건은 범용성을 고려해서 뺐습니다. (빼더라도 동작에 큰 문제가 발생하지 않습니다.) 그리고, immediate = { } 섹션에서 바로 캐릭터에게 트레잇을 주던 것을, 별도의 이벤트를 통해 주도록 했습니다. 이런 변경의 이유들을 우선 설명드리겠습니다.
존재했던 Pre-Trigger 들 중, 나이에 관련된 부분(min_age, max_age)은 동작 방식이 변경되면 필요가 없기 때문에 삭제했습니다. ai = yes 의 경우 사실 Pre-Trigger 로서는 의미가 없는 것이, 이 Pre-Trigger 로서 제껴지는 캐릭터가 오직 플레이어 캐릭터 1개이기 때문입니다. ai = no 를 Pre-Trigger 로 사용하면 수많은 캐릭터들이 모두 제껴지기 때문에 상당히 의미가 잇습니다만..
is_triggered_only = yes 역시, 실행 방법이 달라지기 때문에 추가한 내용입니다. 이전 방식대로라면 이 조건은 있어서는 안 되는 조건입니다만, on_actions 트리거를 이용하려면 꼭 있어야 하는 내용입니다.
또한, 조건에서 서출 관련 조건들을 제외했는데, 이는 출생 즉시 실행되는 이벤트의 특성상, 이러한 트레잇을 붙이는 이벤트보다 이 이벤트가 먼저 일어날 가능성이 존재하기 때문에 제외했습니다. 이 조건들은 다음 이벤트에서 (2일 후에 일어나는) 고려될 것입니다.
has_landed_title 조건문(부 또는 모가 특정 작위를 가지고 있을 것을 조건으로 한 부분)은 앞에서 말씀드렸듯 범용성을 위해서 뺐습니다. 빼더라도 ai = no 때문에 효과는 같아요.
다만, 원래의 자주빛 출생처럼 특정한 프로빈스 또는 작위와 관련하여 설정을 하고 싶은 경우에는 이 항목이 반드시 들어가야겠죠. 이것은 각자의 상황에 따라 다를 것 같습니다.
이제 on_actions.txt 파일을 수정할 차례입니다. 정말 간단해요. 그냥 on_birth = { } 의 제일 뒤에 한 줄 추가해주면 됩니다.
on_birth = { events = { 300 # A Bastard is born 312 # The child of a consort is born 318 # A Bastard is born, but is not recognized as such by the mother's spouse (cuckoo!) TOG.3206 # Child Perceived to be Demon Born 706 # Full House achievement 707 # Keeping it in the Family achievement CM.10011 # Chronicle entry BOB.0001 } random_events = { 200 = 0 1 = RoI.10000 # Reincarnation? } }
events = { } 안쪽의 제일 아랫줄에 BOB.0001 이라고 들어간 거 보이시죠? 아이가 출생할 때마다 항상 발생해야 하는 이벤트니까 일반 events = { } 내에 적어넣었습니다.
참고로, on_actions.txt 내의 각각의 on_ 항목들은 항목별로 오버라이드 됩니다. 따라서, 별도의 모드를 만드는 경우 파일명을 다르게 하시고 필요한 해당 부분만을 카피 앤드 페이스트 하신 후 그 부분을 수정하시면 됩니다. 예를 들면, 원본의 00_on_actions.txt 파일에서 on_birth = { } 항목만을 복사한 후 이 부분을 모드 폴더 내의 99_on_actions.txt 내에 붙여넣고 거기에 BOB.0001 을 추가하면 된다는 얘깁니다.
이제 실질적으로 아이에게 트레잇을 주는 다음 이벤트를 작성해야겠죠? BOB.0002 를 작성해 봅시다. BOB.0001 바로 아래에 계속 작성해 나가면 될 거예요.
character_event = { id = BOB.0002 hide_window = yes is_triggered_only = yes ## ROOT : Born Baby immediate = { if = { limit = { NOT = { trait = bastard trait = child_of_consort trait = legit_bastard } } father = { if = { limit = { ai = no } character_event = { id = BOB.0003 } } } mother = { if = { limit = { ai = no } character_event = { id = BOB.0003 } } } } } } character_event = { id = BOB.0003 desc = EVTDESC_BOB_0003 picture = GFX_evt_born_purple_byzantine is_triggered_only = yes ## ROOT : Player, FROM : Born Baby option = { name = OK FROM = { add_trait = god_bless_you } } }
BOB.0002 에서, BOB.0001 에서 생략했던 서출 관련 부분을 고려하고 있습니다. 만약 Bastard 류나 Child of Concubine 류의 트레잇을 이미 가지고 있다면 BOB.0003 으로 가지 않는 결과 트레잇이 달리지 않게 되겠죠. 실제로 트레잇을 달아주면서, 플레이어에게 이 사실을 알려주는 이벤트가 바로 BOB.0003 입니다.
만약, 아이가 태어났는데 BOB.0003 이벤트가 화면에 보이지 않는다면, 그 아이가 첩의 자식, 사생아, 또는 배우자(아내)의 불륜으로 인한 아이라는 의미가 되겠지요.
좀더 예쁜 그림을 위해서, 언어 파일도 만들어 주도록 하죠.
god_bless_you;성스러운 자녀;;;;;;;;;;;;x; god_bless_you_desc;적법한 결혼에 의해 출생한 적장자녀만이 이 트레잇을 가질 수 있습니다.;;;;;;;;;;;;x; EVTDESC_BOB_0003;새로 태어난 아기는 적법한 결혼에 의해 출산한 아기로..(이하생략);;;;;;;;;;;;x;
트레잇 정의는 다음과 같이 되어 있습니다. (common/traits)
god_bless_you = { random = no vassal_opinion = 10 monthly_character_prestige = 0.5 demesne_size = 10 opposites = { god_curse_you } }
god_curse_you 라는 트레잇이 반대 트레잇으로 지정되어 있는데, 이 트레잇에 대해서는 다음 번에 확인하시면 됩니다. 제일 상단의 random = no, 제일 하단의 opposites = { } 절을 제외하고, 나머지 부분은 효과 부분이므로 입맛대로 바꾸시면 되겠습니다. (원래의 자주빛 출생의 효과를 그대로 복사한 겁니다. demesne_size = 10 은, 직할령 증가 효과가 상당히 유용하기 때문에 한번 집어넣어 본 거고요.)
트레잇 이미지는 gfx/traits 폴더에 들어 있습니다. 첨부된 파일을 참조하시면 됩니다.
트레잇 이미지와 트레잇을 연결해 주는 인터페이스 데이터 파일은 interface 폴더 내에 .gfx 파일로 저장되어 있죠. 이건 워낙 정형적이니 첨부된 파일을 참조하십시오. 여기선 따로 적지 않겠습니다.
자, 다 끝났습니다. 이제, 정실 결혼 관계에서 출생한 적장자의 경우 아래와 같이 출생 직후 이벤트를 통해 적장자임을 플레이어에게 알려주게 됩니다.
이것으로 일단 첫 번째 목표는 달성되었습니다! 이제 다음 목표를 향해 가 보도록 하죠.
사실, 이미 모두가 알고 계시듯이, 기본적으로 계승법은 하드 코딩되어 있기 때문에 그 계승 순서를 인위적으로 변경하는 것은 그것이 허용된 몇몇 종교들을 제외하고는 기본적으로 불가능한 것입니다. 일단 이 점을 분명히 말씀드리겠습니다. 즉, 이하의 내용들은 모두 이벤트와 조건을 활용한 편법적인 방법입니다.
따라서, 제가 고려하지 못한 여러 가지 문제로 인하여 문제가 발생할 가능성도 충분히 있습니다. 그래서 문제가 발생했을 때 이를 교정하기 위한 별도의 디시전도 이 글의 마지막에 따로 만들 예정입니다.
약간 논의의 방향을 뒤집어 봅시다. 계승법은 정해져 있는 것이기에, 그 순서를 계승법과 관계 없이 임의로 바꾸는 것은 불가능하다고 말씀드린 바 있습니다. 그렇다면 반대로, 작위의 승계를 원하는 자보다 선순위에 있는 후보자를 모두 승계결격으로 만들어버리면 결국 원하는 아이가 작위를 승계받을 수 있겠지요? 방법이 있을까요? 있습니다. 트레잇을 사용하면 특정한 캐릭터를 승계결격으로 처리할 수 있거든요. 바로 이 부분에 주목하면 승계 우선권의 구현이 가능합니다.
구조를 한번 만들어 보죠. 아이가 출생하면, 우선 그 아이가 내 아이가 맞는지를 확인할 겁니다. 사실 가장 간단한 건 이겁니다.
그런데 이게 좀 애매한 것이, 그러면 서자 관련 트레잇을 가진 자의 경우에도 계승권 박탈 트레잇을 줄거냐 하는 겁니다. 계승권 없는 혼외자는 어차피 계승권이 없으니 의미가 없고, 계승권 있는 혼외자나 서자의 경우에는 미리 이 트레잇을 줘버리면 사실 의미가 없잖아요? 첩의 자식이지만 정실의 자식이 없어서, 내가 작위를 계승받을 수 있다고 잔뜩 기대하고 있는데 거기다 턱 하고 정실 자식이 태어남으로써 상속권이 박탈된다 라는 스토리가 나와야 할 거 아닙니까. 따라서, 이 부분의 코딩은 이렇게 바뀌어야만 합니다.
문제는, 일반적인 남성/남성우선 상속제를 가지고 있는 경우에 여성을 제척 대상으로 밀어넣을 것이냐의 문제입니다. 네. 해야 합니다. 플레이어가 갑자기 남녀평등 상속제로 변경이라도 하는 날에는 그보다 상속순위가 앞서는 딸이 있다면 이 트레잇이 무용지물이 되니까요. 남녀평등 상속이 가능한 순결파 등의 종교가 있기 때문에, 단순히 바스크족만의 문제가 아니므로 대비가 필요합니다. 허나 이 부분이 그렇게 완벽하게 막히는 부분은 아닙니다. 아래에서 좀 더 논의를 해야 합니다. 일단 여기까지 나온 이야기들을 바탕으로 하여 기존 이벤트를 수정해 봅시다.
우선 BOB.0001 을 약간 수정할 필요가 있습니다.
character_event = { id = BOB.0001 hide_window = yes is_triggered_only = yes ## ROOT : Born Baby trigger = { OR = { father = { ai = no } mother = { ai = no } } } immediate = { character_event = { id = BOB.0002 days = 2 } } }
뭐가 바뀌었는지 아시겠나요? father 와 real_father 가 같은지를 확인하는 구문인 is_father_real_father 조건문이 trigger = { } 에서 사라졌습니다. 어째서? 아주 사라진 게 아니고, BOB.0002 로 옮겨갔습니다. 어떻게 옮겨갔는지 한번 보십시오.
새로 개편된 BOB.0002 는 상황에 따라 이벤트를 분기시키는 아주 큰 역할을 맡고 있습니다.
character_event = { id = BOB.0002 hide_window = yes is_triggered_only = yes ## ROOT : Born Baby immediate = { if = { limit = { is_father_real_father = no } father = { if = { limit = { ai = no } character_event = { id = BOB.0005 } } } mother = { if = { limit = { ai = no } character_event = { id = BOB.0005 } } } break = yes } if = { limit = { NOT = { trait = bastard trait = child_of_consort trait = legit_bastard } } father = { if = { limit = { ai = no } character_event = { id = BOB.0003 } } } mother = { if = { limit = { ai = no } character_event = { id = BOB.0003 } } } } if = { limit = { OR = { trait = bastard trait = child_of_consort trait = legit_bastard } } father = { if = { limit = { ai = no } character_event = { id = BOB.0004 } } } mother = { if = { limit = { ai = no } character_event = { id = BOB.0004 } } } } } }
뭐가 달라졌죠?
is_father_real_father 구문이 여기로 옮겨왔습니다. 만약 실제 아버지와 현재 아버지가 서로 다른 경우(즉, 아직 알려지지 않은 뻐꾸기)라면, 플레이어에게 BOB.0005 라는 새로운 이벤트를 실행시키고 실행을 멈춥니다(break = yes). 따라서 이 경우에는 BOB.0003 이나 BOB.0004 는 실행될 여지가 없습니다.
아래쪽에 bastard, child_of_consort, legit_bastard 트레잇을 갖는 경우에 BOB.0004 라는 새로운 이벤트로 분기하는 루틴이 추가됐습니다.
사이에 낀 기존의 루틴인 BOB.0003 으로 이동시키는 루틴은 변화가 없습니다.
우선 알려지지 않은 뻐꾸기인 경우에 발동되는 BOB.0005 를 먼저 보도록 하죠. BOB.0003 이 정실 자녀라는 것을 플레이어에게 알려주는 역할이라면, BOB.0005 는 반대로 이 아이가 뻐꾸기라는 것을 플레이어에게 고발하는 역할을 하게 되는군요.
character_event = { id = BOB.0005 desc = EVTDESC_BOB_0005 picture = GFX_evt_birth is_triggered_only = yes ## ROOT : Player, FROM : Born Baby option = { name = OK FROM = { add_trait = god_curse_you } } }
앞에서 보았던 BOB.0003 과 동일하고, 트레잇만 바뀌었습니다. 따라서 설명드릴 내용도 없군요.
god_curse_you; ;;;;;;;;;;;;x; god_curse_you_desc;적법하지 않은 결혼에 의해 출생한 자녀가 이 트레잇을 갖게 됩니다. (이하생략);;;;;;;;;;;;x; EVTDESC_BOB_0005;새로 태어난 아기에게서 신성한 기운이 보이지 않습니다. (이하생략);;;;;;;;;;;;x;
이름을 뭘로 붙여야 하나 고민하다가, 그냥 공백으로 뒀습니다.
알아채지 못한 뻐꾸기가 가문에 침투하려 하면...
이렇게 됩니다.
god_curse_you 트레잇의 설정은 이렇게 생겼습니다. 아무 것도 없고, 오직 승계 금지 효과만 있습니다.
god_curse_you = { random = no customizer = no cannot_inherit = yes opposites = { god_bless_you } }
BOB.0004 의 경우, Bastard 나 Child of Concubine 류의 트레잇을 가진 경우 오게 되므로, 일단은 아무 일도 하지 않지만 만약 이미 God Bless You 트레잇을 가지고 있는 상속가능 자녀가 있다면 상속권 박탈 트레잇을 추가할 겁니다. 이 작업은 눈에 보이지 않아도 상관 없기 때문에 hide_window = yes 옵션을 주고 백그라운드에서 작업이 이루어집니다. 작업을 조금 편하게 하기 위해, immediate = { } 내에서 작업하지 않고 별도의 옵션 내에서 작업을 하겠습니다.
character_event = { id = BOB.0004 hide_window = yes is_triggered_only = yes ## ROOT : Player, FROM : Born Baby option = { name = EVTOPTA_BOB_0004 trigger = { any_dynasty_member = { OR = { father = { character = ROOT } mother = { character = ROOT } } trait = god_bless_you is_primary_heir = ROOT } } FROM = { add_trait = god_curse_you } } option = { name = EVTOPTB_BOB_0004 trigger = { NOT = { any_dynasty_member = { OR = { father = { character = ROOT } mother = { character = ROOT } } trait = god_bless_you is_primary_heir = ROOT } } } } }
대략 읽을 수 있으실 겁니다. 아버지나 어머니가 플레이어이고, 이미 god_bless_you 트레잇을 가진 계승자가 있다면, 이 서자에게 계승권 박탈 트레잇(god_curse_you)을 바로 주어버리고, 만약 그런 트레잇이 없다면 아무 일도 하지 않도록 되어 있는 코드입니다.
이제 BOB.0003 도 조금 수정이 필요합니다. god_bless_you 트레잇을 줬으니, 이걸 안 갖고 있는 나머지 자녀들에게는 모두 계승권 박탈 트레잇을 줘야 하니까요.
character_event = { id = BOB.0003 desc = EVTDESC_BOB_0003 picture = GFX_evt_born_purple_byzantine is_triggered_only = yes ## ROOT : Player, FROM : Born Baby option = { name = OK FROM = { add_trait = god_bless_you } any_dynasty_member = { limit = { OR = { father = { character = ROOT } mother = { character = ROOT } } NOT = { character = FROM } NOT = { trait = god_bless_you } } hidden_tooltip = { add_trait = god_curse_you } } recalc_succession = yes } }
any_dynasty_member = { } 스코프 섹션이 추가된 내용이죠. 아버지나 어머니가 ROOT(플레이어)이고 god_bless_you 트레잇을 안 갖고 있는 자녀들에게 모두 계승권 박탈 트레잇(god_curse_you)을 주는 것입니다. 작업이 끝나면 상속권자를 재계산(recalc_succession = yes)하도록 코드도 주었고요.
자, 앞에서 제가 안 하고 넘어왔던 문제를 하나 말씀드리도록 하죠. 생각보다 심각한 문제인데요. 이런 겁니다. 현재 상속이 가능한 적통 서자(남)가 한 명 있습니다. 성별법은 남성 상속제입니다. 이 상황에서 정실로부터 아이가 태어났는데, 공교롭게도 여자아이라고 생각해 봅시다. 어쨌거나 정실의 아이가 태어났으니 앞에서 계승권을 가지고 있던 적통 서자에게 상속불가 트레잇이 걸리겠죠? 그런데 성별법 때문에 새로 태어난 아이도 계승권이 없습니다. 졸지에 상속권을 가진 사람이 아무도 없는 상황이 벌어집니다. 으악!
따라서, 새로운 정실 아기가 태어났더라도 그 아기가 현재의 성별법상 상속권을 가질 수 없는 성별의 아기라면 앞의 모든 상속권을 제척시키는 플레이는 매우 위험할 수 있는 겁니다. 코드 내에 이 부분에 대한 고려가 분명히 있어야 합니다. 그래서, BOB.0003 에 이 부분에 대한 처리를 보완해야 합니다.
앞에서 이미 수정한 BOB.0004 에서는 이 문제가 안 생깁니다. 왜일까요? 조건문 내에서 god_bless_you 트레잇을 갖고 있는 자가 현재의 상속권자인지(is_primary_heir = ROOT)를 확인하고 있거든요.
character_event = { id = BOB.0003 desc = EVTDESC_BOB_0003 picture = GFX_evt_born_purple_byzantine is_triggered_only = yes ## ROOT : Player, FROM : Born Baby option = { name = OK FROM = { add_trait = god_bless_you } if = { limit = { OR = { NOT = { has_law = agnatic_succession } FROM = { is_female = no } } } any_dynasty_member = { limit = { OR = { father = { character = ROOT } mother = { character = ROOT } } NOT = { character = FROM } NOT = { trait = god_bless_you } } hidden_tooltip = { add_trait = god_curse_you } } } recalc_succession = yes } }
any_dynasty_member = { } 스코프 절의 바깥에 조건문을 하나 붙였습니다. 현재 성별법이 남성 상속제가 아니거나(NOT = { has_law = agnatic_succession }), 태어난 아이가 남자아이일 경우(FROM = { is_female = no })에만 상위자에 대한 상속권 제척 작업을 하라는 겁니다. 따라서, 상속제가 남성 상속제이고 태어난 아이가 여자아이라면 이 작업을 안 하게 됩니다. 그냥 이대로인 거죠. 아시겠죠?
이제 다음 문제를 생각해 보죠. 플레이어가 죽고, 정상적으로 상속을 받았습니다. 그러면, 자녀가 하나가 아닌 이상 다른 god_bless_you 트레잇을 가진 자가 있을 겁니다. 반대로 god_curse_you 트레잇을 가진 자도 있을지 모르고요. 이제, 본인이 아닌 다른 형제들의 이 트레잇은 의미를 상실했습니다. 이거 냅둘 이유가 없죠. 특히 후자의 경우에 더욱 그러합니다. 단지 승계 순위 때문에 주었던 페널티인데, 이제 필요가 없어졌으니 지워주는 게 맞을 겁니다. 그런데.. 상속이 되었는지 여부를 알 수 있는 방법이 있을까요?
두 가지 방법이 있습니다. 모두 on_actions.txt 를 이용하는 방법인데, 첫째로 캐릭터가 죽었을 때에 사용하는 on_death = { } 를 이용하는 방법, 둘째로 연대기의 주인이 변경되었을 때에 사용하는 on_chronicle_owner_change = { } 를 이용하는 방법입니다. 저는 후자의 방법을 이용할 텐데요. 왜냐 하면 on_death = { } 는 플레이어이건 아니건 모든 캐릭터에 대해서 동작하지만, 연대기는 오직 플레이어 캐릭터만을 위한 것이어서 정확히 필요한 경우에만 호출이 되기 때문이죠. (연대기의 주인이 변경되는 경우는, 인위적 양위 기능이 없는 CKII 의 특성상 오직 플레이어 캐릭터가 죽고 적법한 계승자가 플레이어의 지위를 이어받았을 경우 뿐입니다.) 자, 이번에도 on_actions.txt 의 도움을 받아 봅시다.
on_chronicle_owner_change = { events = { CM.10001 BOB.0006 } }
기존의 CM.10001 아래에 BOB.0006 라는 새로운 이벤트를 하나 정의해 줍시다. 그리고 BOB.0006 를 만들어 보자고요.
참고로, 여기서 이벤트를 호출한 경우, 호출된 이벤트에서의 FROM 은 죽은 구 캐릭터, ROOT 는 새로 플레이어 캐릭터가 된 신 캐릭터를 의미합니다. 갑자기 왜 FROM 이 튀어나왔냐고 화내시면 안됩니다.
character_event = { id = BOB.0006 hide_window = yes is_triggered_only = yes ## ROOT : New Player, FROM : Old (dead) Player immediate = { if = { limit = { FROM = { is_dying = yes } } FROM = { any_dynasty_member = { limit = { trait = god_curse_you } character_event = { id = BOB.0007 days = 1 } } } ROOT = { character_event = { id = BOB.0008 days = 2 } } } } } character_event = { id = BOB.0007 hide_window = yes is_triggered_only = yes immediate = { if = { limit = { is_father_real_father = yes } remove_trait = god_curse_you } } } character_event = { id = BOB.0008 hide_window = yes is_triggered_only = yes immediate = { recalc_succession = yes } }
BOB.0006의 is_dying 은, 현재 FROM 캐릭터가 사망해서 승계가 넘어가고 있는 것인지, 아니면 그냥 넘어가고 있는 것인지를 판단하기 위한 조건문입니다. 사실 필요가 없다고 생각하는데 이 경우에 꼭 확인을 하더라고요. BOB.0006 과 BOB.0007 로 이벤트를 나눈 이유는, 계승 과정에서의 안전을 위해 하루의 버퍼를 둔 것입니다. BOB.0006 에서 모든 god_curse_you 트레잇 소유자들에 대해서 BOB.0007 이벤트를 호출하고, BOB.0007 에서는 해당 트레잇을 삭제하는 일을 하게 됩니다.
단, BOB.0007 을 보시면 아시겠지만, 애초에 뻐꾸기였던 자는 안 지워집니다. 따라서, 뻐꾸기가 계승권을 회복하는 상황을 방지할 수 있도록 해 두었습니다.
이와 관련되어 풀어야 할 문제가 하나 있습니다. 만약 새로운 플레이어 캐릭터가 작위를 상속받기 전에 이미 낳은 아이가 있을 경우에, 이들은 god_bless_you 트레잇을 갖고 있지 않을 겁니다. 사실 상관 없죠. 내가 작위를 가진 상태에서 낳은 아이가 아니니, 이 트레잇을 쓸 자격은 없는 게 맞습니다. 따라서 여기에도 그 원리가 그대로 적용됩니다. 만약 즉위 전에 낳은 정실 후계자가 있는 경우에도, 즉위 이후에 상속 가능한 아이를 낳게 되면 그 아이가 우선적인 상속 순위자가 됩니다. 사내아이가 둘 있는 상태에서 즉위했고, 그 이후에 셋째 남자아이를 낳았다면 상속 우선 순위는 셋째가 되는 겁니다. 이건 전혀 이상한 게 아닙니다. 설정상 당연한 거죠.
이제 하나의 문제만 남았습니다. 예를 들겠습니다. 적통 서자 두 명이 첫째 둘째 아이로, god_bless_you 트레잇을 가진 아이가 셋째로 있었습니다. 근데, 이 셋째 아이가 잘 자라다 말고 죽어버렸다고 합시다. 문제가 생겼죠? 셋째 아이가 태어나면서 첫째 아이와 둘째 아이는 이미 승계 결격이 된 상황입니다. 그런데 셋째 아이가 죽어버렸다면 승계 결격 사유는 해소가 되었고, 따라서 그 계승권이 살아나야 됩니다. 맞죠?
이 경우를 이제 해결을 해야 됩니다. 아직 작위를 계승받지 못한 캐릭터는 그냥 일반 캐릭터일 뿐이니, 이번에는 어쩔 수 없이 on_death = { } 를 이용해야겠네요.
on_death = { events = { # 8250 650 24500 24502 70041 88291 SoA.5306 705 CM.1068 # Carloman dies CM.1069 # Charlemagne dies CM.10010 # Chronicle entry CM.6185 # Dies of other causes while assassination is in progress - clear flags WoL.6335 # Owner of Necronomicon dies... # WoL.11300 # Check if spouse is executed or killed by someone. BOB.0009 } random_events = { 10 = 24505 10 = 24510 100 = 0 } }
마지막에 BOB.0009 를 집어넣은 게 보이시죠? 이제 BOB.0009 를 작성해 봅시다. 기본적으로, god_bless_you 트레잇을 갖고 있던 캐릭터이면서, 현재 ai = yes 인 캐릭터가 사망한 경우에, 그 형제자매들 중 누구도 god_bless_you 트레잇을 갖고 있지 않은 경우가 조건이 되겠네요.
character_event = { id = BOB.0009 hide_window = yes is_triggered_only = yes ## ROOT : Dead Character trigger = { ai = yes OR = { father = { ai = no } mother = { ai = no } } trait = god_bless_you } immediate = { father = { if = { limit = { ai = no } character_event = { id = BOB.0010 days = 1 } } } mother = { if = { limit = { ai = no } character_event = { id = BOB.0010 days = 1 } } } } } character_event = { id = BOB.0010 hide_window = yes is_triggered_only = yes ## ROOT : Player, FROM : Dead Character option = { name = EVTOPTA_BOB_0010 trigger = { any_dynasty_member = { OR = { father = { character = ROOT } mother = { character = ROOT } } trait = god_bless_you is_primary_heir = yes } } } option = { name = EVTOPTB_BOB_0010 trigger = { NOT = { any_dynasty_member = { OR = { father = { character = ROOT } mother = { character = ROOT } } trait = god_bless_you is_primary_heir = yes } } } any_dynasty_member = { limit = { OR = { father = { character = ROOT } mother = { character = ROOT } } trait = god_curse_you is_father_real_father = yes } remove_trait = god_curse_you } } }
BOB.0009 는 단순히 조건을 확인하고, 하루 딜레이를 시켜서 BOB.0010 을 실행시키는 역할입니다. BOB.0010 이 핵심적인 부분인데요. 작업의 편의를 위해 여기서도 immediate = { } 이 아닌 option = { } 을 사용했습니다. 만약 더 이상 계승자인 god_bless_you 트레잇 소지자가 없는 경우에 god_curse_you 를 가진 자녀들 모두에 대해서 god_curse_you 트레잇을 제거하는 것입니다.
여기서도 뻐꾸기의 경우 지워지지 않도록 대응을 해 두었습니다.
네. 드디어 모든 이벤트 작성이 끝났습니다!
만약 어떤 버그가 발생하여 상속자가 없게 되는 경우, god_curse_you 및 god_bless_you 트레잇을 정리할 방법이 필요합니다. 간단하게 디시전으로 작성할 수도 있겠지만, 그냥 이벤트로 작성해 두고 해당 이벤트를 콘솔에서 호출하는 것으로 해결할까 합니다.
character_event = { id = BOB.0011 hide_window = yes is_triggered_only = yes immediate = { any_dynasty_member = { limit = { trait = god_curse_you is_father_real_father = yes } remove_trait = god_curse_you } } }
그냥 콘솔에 대고, event BOB.0011 이라고 치시면 돼요. 그럼 현재 존재하는 모든 god_curse_you 가 날아가면서 새로 상속 순위가 정해질 겁니다.
현재 상정할 수 있는 문제 중에서 해결하지 않은 문제가 하나 있습니다. 중간에 성별법이 바뀐 경우 상속자가 아무도 없게 될 수 있는 문제가 아직 해결이 안 됐습니다. 특히 남성우선 상속제나 남녀평등 상속제에서 남성 상속제로 변경된 경우에 이 문제가 발생할 수 있습니다. 이 문제는 해결은 가능하지만 깔끔한 해결이 되지 않아서, 그냥 바로 아래에서 말씀드리는 god_curse_you 초기화를 통해 해결하시는 것이 좋겠습니다.
god_bless_you 트레잇과 god_curse_you 트레잇은 현재 서로 반대 관계의 트레잇으로 설정되어 있습니다. 그렇다면, 뭔가 암투도 있을 법 하지 않나요? 예를 들면 god_bless_you 트레잇을 가진 자에 대한 정통성 공격이라던가, 원래 계승 순위가 앞섰던 god_curse_you 소지자가 god_bless_you 소지자를 암살하려는 음모를 꾸민다던가 말이죠.
첫댓글 하나 오류같지 않은 오류가 있네요. 원래 god_curse_you 트레잇은 그냥 상속권을 제척시키기 위해 투입한 트레잇이니, 첨부한 모드의 트레잇 설명과 같은 과격한 설명은 설정과는 조금 맞지 않습니다. 그냥 설명을 지워버리는 편이 더 나을 것 같기도 해요. 물론 뻐꾸기 판별에도 쓰긴 하지만요. 본문 수정하기는 귀찮아서 그냥 덧글로만 적어두겠습니다.
정말 감사합니다! 처음으로 만들어 본 이벤트인데 아직 부족한 점이 많네요. 계승권 박탈 역시도 트레잇을 만들어서 이벤트로 처리할 수도 있었군요. 많이 배워갑니다. tacitus님이 개선해주신걸로 적용해서 플레이해야겠어요 :)
아 한가지 궁금한게 있습니다. 제가 어제 저 이벤트 모딩을 한 후에 아이언맨으로 시작을 했는데 tacitus님이 개선해주신 모드로 바꿔도 원래 플레이중이던 세이브파일에도 적용이 잘 되나요?
아이언맨으로 시작하시면 모드를 사용할 수 없지 않던가요? 어떻게 아이언맨으로 시작하신거지...;;;;
하여튼간에, 보통 모드를 처음 사용할 때는 새로 시작하는 것을 기본으로 합니다. 충돌이 없을 것이라고 장담할 수 없기 때문입니다. 제 작업물의 경우 딱히 충돌할 만한 요소는 없습니다만, 그렇다고 중간 세이브에 바로 적용하는 것을 권장하지는 않습니다.
도전과제는 잠겨버리지만 플레이 자체는 가능해요. 답답할때 치트나 로드에 의존해버리는 유리멘탈이라 아예 콘솔을 킬 수 없고 로드도 할 수 없는 아이언맨으로 하는걸 선호해서요.
흠 역시 새로 시작하는게 맞겠네요!
그러면 콘솔이 입력이 되지 않으므로, 버그에 대비해서 만들어둔 BOB.0011 을 사용할 수가 없게 되겠네요. BOB.0011 을 실행시키기 위한 간이 디시전이라도 하나 만들어서 사용하셔야 되겠습니다. 물론 버그가 발생하지 않는다면 그럴 필요도 없지만요.
아 그리고 스코프에 관해서도 한가지 여쭐게 있습니다. 제가 놓힌건진 모르겠지만 tacitus님의 이벤트 모딩글에선 스코프에 관한 설명이 따로 없었던것 같아서요. ck위키에서도 간단한 예시만으로 설명하니 이해가 힘든부분이 스코프의 전환인데요.
(생략)
OR = {
father = {
ai = no
}
mother = {
is_married = PREV
}
}
처음 이벤트를 만들때 친자확인코드가 따로 있는지 몰라서 저런식으로 만들어보려 했었는데요. OR커맨드 안에 있는 father이나 mother은 새로운 스코프로 볼 수 없나요? 그러니까 is_married = PREV의 PREV는 mother 이전의 스코프인 father가 아닌가요?
father과 mother은 새로운 스코프로 인식되는게 아니고 PREV가 생략부분에 있는 이전 스코프가 되는건가요?
일단 스코프에 대해서는 워낙 중요한 개념이라, 이벤트에 들어가기 전에 별도의 장을 들여서 설명을 드렸었습니다. http://cafe.daum.net/Europa/5Bi3/2028 게시물을 참조하시면 됩니다. (나름 머리를 짜내가면서 완성한 글입니다.) 제 강좌는 기본적으로 처음부터 단계적으로 읽어나가는 것을 가정하고 적어나간 것이어서, 초심자이신 경우에 중간부터 읽으시는 경우 이해가 안 되는 부분이 있을 수도 있습니다.
father = { } 와 mother = { } 는 모두 새로운 스코프를 연 게 맞습니다. 다만 혼동하고 계시는 것은 PREV 는 바로 앞에 정의한 스코프를 의미하는 것이 아니라, 계층 구조에서 바로 윗 단계를 의미합니다. (바로 직전 스코프라고 표현해서 의미가 혼동되었을 수도 있겠네요.) 즉, 예시에서 father = { } 와 mother = { } 는 계층에서는 같은 계층입니다. 한번 제 스코프 관련 글을 읽어보시고 이해가 안 되신다면 다시 설명해드릴게요.
스코프매뉴얼이 따로 있었네요. 첫번째 모딩매뉴얼과 이벤트매뉴얼만 읽는바람에 지나쳤네요. :(
스코프 설명글 읽으니 잘 이해되네요. 다시 한번 감사드립니다!
네?뭐라고요?
대단하십니다.
정말 대단하시네요. 한가지 질문이 있습니다.
정통서자에게도 god_bless_you 트레잇을 달아주고 싶은 경우엔 어느 부분의 trait = legit_bastard 를 지워야 하나요?
또 비잔틴의 데스퍼트 같은 호칭은 어떻게 넣어야 할까요?
1) 오래 전에 작성한 이벤트라 기억이 가물가물하지만, 다시 코드를 따라가보면 출생 시 트레잇을 부여하는 BOB.0002 의 조건 부분의 trait = legit_bastard, NOT = { trait = legit_bastard } 부분을 다 지워야 할겁니다.
2) 트레잇을 이용한 것이어서, 이것만으로 호칭을 넣긴 어렵습니다만, 추가적으로 마이너 타이틀을 이용하면 호칭도 구현이 가능할 것 같습니다. 자동으로 마이너 타이틀을 주도록 코드를 짤 수도 있고, 이 트레잇을 가진 자에게 마이너 타이틀을 가질 자격을 주는 조건을 걸어서 수동으로 수여할 수도 있겠네요.
BOB.0002 의 정통서자 부분만 지우면 되는군요.
마이너 타이틀 공부해서 한번 달아봐야겠네요.
알려주셔서 감사합니다.
주의. 개선 1의 2. 부분에서 "on_actions.txt 내의 각각의 on_ 항목들은 항목별로 오버라이드 됩니다" 는 2.4.x 이후에는 잘못된 설명입니다. 2.4.x 부터는 이 파일은 오버라이드가 아니라 머지(Merge)로 파일 핸들링 규칙이 바뀌었고, 따라서 같은 섹션 내의 내용이 원본과 모드에 모두 존재하면 그대로 합쳐집니다. 따라서 기존 내용을 복사할 필요 없이, 추가할 내용만 모드 쪽의 파일에 저장해도 정상적으로 합쳐지고 적용됩니다.
플레이 하다 보니 남성우선 장자상속의 경우 계승권이 없는 장자의 장자(손자)가 출생할 경우 아무런 트레잇이 안 붙게 되고 그래서 트레잇이 있는 차남보다 장자의 자식이 후계자가 되는 경우가 생기네요... 어찌해야할까요
손자는 이 코드에서 전혀 고려되지 않은 사항입니다... 전에 어떤 분이 말씀해주신 문제인데, 계속 미루다가 오늘까지도 해결 못 하고 있습니다.
제가 이걸 좀 검토해볼 시간이 나야 뭘 어떻게 할텐데...
하악..ㅋㅋㅋ 그럼 수동으로 트레잇을 줘서 박탈을 시켜야겠군요!
정말 대단하십니다. 혹시 댓글다신 손자쪽 검토는 해 보셨는지 궁금하네요!
아직 검토를 못 해봤습니다.
손자 레벨까지 가기에는 현재 이 이벤트 자체가 구조 측면으로 좀 문제가 있습니다. 내용이 문제가 아니라 구조를 고쳐야 해요.
뜯어 고친다고 하더라도 버그 없이 효과를 발생시킬 수 있을지가 조금 미묘하기도 하고요.
상당히 에너지를 많이 소모하는 일이라, 시간을 쪼개서는 할 수 없는 일이라 언제쯤 한 번 건드려볼 수 있을지 모르겠네요.
답변 감사드립니다! 프로그램에 대해서 아무것도 모르지만 엄청난 시간과 에너지가 있어야 한다는 것 정도는 안 봐도 알겠네요.
글 잘 봤습니다.^^ 감사드립니다.
토탈워에서 크킹2로 이번에 넘어와서 입문하게 되었습니다 ㅎㅎ. 좀 더 재밌게 플레이하려고 이 모드를 사용중입니다만, 한글패치 방식이 바뀌어서 그런지 글자가 모두 깨져서 나옵니다. 그리고 언제 여유가 되실때 손자 레벨 이하의 계승서열도 손봐주시면 정말 감사하겠습니다 ㅎㅎ 좋은 모드 만들어주셔서 감사합니다!
글씨가 깨지는 건 짐작하신대로 한글패치 방식이 바뀌어서 그렇습니다. localisation 폴더의 .csv 파일을 변환기로 변환해주시면 됩니다. 변환기는 "한글화 작업실" 게시판에 공지사항에 보시면 있습니다. 손자 레벨 이하의 계승서열의 경우 가끔 생각을 해보고 있습니다만 완벽하게 해결이 불가능한 상황이라, 뭔가 다른 방법이 없을지 좀 더 고민해봐야 할 것 같습니다. 의외로 모든 구멍을 다 틀어막기가 상당히 어렵네요.