CAFE

CK 모드 게시판

[CK2 모딩 팁](비잔틴이) 부러우면 지는거다! 자주빛 출생을 구현해보자

작성자tacitus|작성시간15.06.08|조회수3,872 목록 댓글 25

(비잔틴이) 부러우면 지는거다! 자주빛 출생을 구현해보자

이 글은 Schleierhaft 님의 글, "자주빛 출생과 비슷한 (유전)출생 트레잇을 필요로 하시는 분들 참고하세요." 을 조금 더 발전시킨 글입니다.

가문을 중시하는 컨셉의 게임인 CKII 에서, 유전적 특성을 전승시키는 트레잇의 구현은 상당히 흥미로운 주제인가 봅니다. 제가 근 1년 정도 이 카페에 있으면서 본 같은 주제의 글들만 여럿이었던 것 같아요. 그러나 마침 오늘 읽은 위의 글은, 단순히 트레잇의 설정만을 이용한 것이 아니라 본격적으로 이와 관련된 이벤트들을 통해 좀 더 본격적으로 기능을 구현하셨더군요. 그래서 저도 약간은 의욕이 생겨서 (감사하게도 제 글을 여러 개 인용해주셨기도 하고) 한번 조금 더 발전을 시켜볼까 합니다.

  • 기본적으로 원글을 바탕으로 하고 있기 때문에, 우선 윗 글을 먼저 읽어보신 후에 제 글을 보시는 것이 좀 더 빨리 이해될 것입니다.

  • 완성본은 모드 형태로 이 게시물에 첨부되어 있습니다.

개선 1. 최대 20일 걸리는 친자판별을 바로 가능하도록 수정하자

원글의 경우, trigger = { } 조건만을 이용하여 트레잇을 붙였기 때문에, 출생과 판정 사이에 최대 20일까지의 시차가 발생했습니다. 우선 이 부분을 개선하도록 하겠습니다. 원 글에 작성한 덧글대로, on_actions.txt 를 수정하여 새로운 이벤트를 실행하는 쪽으로 작성을 해 볼 것입니다.

기본적인 이벤트는 원글에서 적어주신 이벤트를 그대로 사용하되, 범용성을 갖도록 하기 위해서 몇 군데 수정을 하고, 수정한 부분을 적시하는 쪽으로 작성하겠습니다.

1. on_actions.txt 의 on_birth = { } 에서 넘어오는 이벤트

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 때문에 효과는 같아요.

다만, 원래의 자주빛 출생처럼 특정한 프로빈스 또는 작위와 관련하여 설정을 하고 싶은 경우에는 이 항목이 반드시 들어가야겠죠. 이것은 각자의 상황에 따라 다를 것 같습니다.

2. on_actions.txt 의 on_birth = { } 내용 수정

이제 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 을 추가하면 된다는 얘깁니다.

3. 트레잇을 부여하는 이벤트 : BOB.0002~BOB.0003

이제 실질적으로 아이에게 트레잇을 주는 다음 이벤트를 작성해야겠죠? 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 이벤트가 화면에 보이지 않는다면, 그 아이가 첩의 자식, 사생아, 또는 배우자(아내)의 불륜으로 인한 아이라는 의미가 되겠지요.

4. 기타 요소

좀더 예쁜 그림을 위해서, 언어 파일도 만들어 주도록 하죠.

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 파일로 저장되어 있죠. 이건 워낙 정형적이니 첨부된 파일을 참조하십시오. 여기선 따로 적지 않겠습니다.

자, 다 끝났습니다. 이제, 정실 결혼 관계에서 출생한 적장자의 경우 아래와 같이 출생 직후 이벤트를 통해 적장자임을 플레이어에게 알려주게 됩니다.

적장자의 경우, 이렇게 트레잇을 달게 되는 이벤트가 출력됩니다.

이것으로 일단 첫 번째 목표는 달성되었습니다! 이제 다음 목표를 향해 가 보도록 하죠.

개선 2. 자줏빛 출생(Born In The Purple)의 승계 우선권을 구현하자

1. 설계도

사실, 이미 모두가 알고 계시듯이, 기본적으로 계승법은 하드 코딩되어 있기 때문에 그 계승 순서를 인위적으로 변경하는 것은 그것이 허용된 몇몇 종교들을 제외하고는 기본적으로 불가능한 것입니다. 일단 이 점을 분명히 말씀드리겠습니다. 즉, 이하의 내용들은 모두 이벤트와 조건을 활용한 편법적인 방법입니다.

따라서, 제가 고려하지 못한 여러 가지 문제로 인하여 문제가 발생할 가능성도 충분히 있습니다. 그래서 문제가 발생했을 때 이를 교정하기 위한 별도의 디시전도 이 글의 마지막에 따로 만들 예정입니다.

약간 논의의 방향을 뒤집어 봅시다. 계승법은 정해져 있는 것이기에, 그 순서를 계승법과 관계 없이 임의로 바꾸는 것은 불가능하다고 말씀드린 바 있습니다. 그렇다면 반대로, 작위의 승계를 원하는 자보다 선순위에 있는 후보자를 모두 승계결격으로 만들어버리면 결국 원하는 아이가 작위를 승계받을 수 있겠지요? 방법이 있을까요? 있습니다. 트레잇을 사용하면 특정한 캐릭터를 승계결격으로 처리할 수 있거든요. 바로 이 부분에 주목하면 승계 우선권의 구현이 가능합니다.

구조를 한번 만들어 보죠. 아이가 출생하면, 우선 그 아이가 내 아이가 맞는지를 확인할 겁니다. 사실 가장 간단한 건 이겁니다.

  1. 만약 그 아이가 내 아이가 맞다면, 기존에 했던 것과 같이 트레잇을 줍니다.
  2. 만약 그 아이가 내 아이가 아닌 경우에는, 바로 계승권 박탈 트레잇을 줍니다.

그런데 이게 좀 애매한 것이, 그러면 서자 관련 트레잇을 가진 자의 경우에도 계승권 박탈 트레잇을 줄거냐 하는 겁니다. 계승권 없는 혼외자는 어차피 계승권이 없으니 의미가 없고, 계승권 있는 혼외자나 서자의 경우에는 미리 이 트레잇을 줘버리면 사실 의미가 없잖아요? 첩의 자식이지만 정실의 자식이 없어서, 내가 작위를 계승받을 수 있다고 잔뜩 기대하고 있는데 거기다 턱 하고 정실 자식이 태어남으로써 상속권이 박탈된다 라는 스토리가 나와야 할 거 아닙니까. 따라서, 이 부분의 코딩은 이렇게 바뀌어야만 합니다.

  1. 만약 그 아이가 내 아이가 아니라면(Cuckoo), 바로 계승권 박탈 트레잇을 줍니다. 만약 내 아이가 맞지만 정실이 아닌 서자의 경우에는, 계승권 박탈 트레잇을 주지 않습니다. 따라서 이들은 잠정적으로 후계자가 될 수 있습니다. 단, 이미 god_bless_you 트레잇을 가진 자녀가 있을 경우에는 계승권을 미리 박탈해 둡니다.
  2. 만약 정실의 아이가 태어난 경우, 준비된 god_bless_you 트레잇을 줍니다. 그리고 같은 부/모의 자식들 중에서 현재 계승권을 갖고 있는 자식들에게 모두 계승권 박탈 트레잇을 사후적으로 밀어넣습니다. bastard 트레잇을 갖고 있는 자 이외에 모든 자들에게 밀어넣어야겠죠.

문제는, 일반적인 남성/남성우선 상속제를 가지고 있는 경우에 여성을 제척 대상으로 밀어넣을 것이냐의 문제입니다. 네. 해야 합니다. 플레이어가 갑자기 남녀평등 상속제로 변경이라도 하는 날에는 그보다 상속순위가 앞서는 딸이 있다면 이 트레잇이 무용지물이 되니까요. 남녀평등 상속이 가능한 순결파 등의 종교가 있기 때문에, 단순히 바스크족만의 문제가 아니므로 대비가 필요합니다. 허나 이 부분이 그렇게 완벽하게 막히는 부분은 아닙니다. 아래에서 좀 더 논의를 해야 합니다. 일단 여기까지 나온 이야기들을 바탕으로 하여 기존 이벤트를 수정해 봅시다.

2. BOB.0001 의 수정

우선 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 로 옮겨갔습니다. 어떻게 옮겨갔는지 한번 보십시오.

3. 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 으로 이동시키는 루틴은 변화가 없습니다.

4. BOB.0005 : 플레이어에게 아기가 뻐꾸기임을 알려주는 이벤트

우선 알려지지 않은 뻐꾸기인 경우에 발동되는 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
	}
}

5. BOB.0004 : 아기가 사생아이거나 첩의 자녀인 경우

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)을 바로 주어버리고, 만약 그런 트레잇이 없다면 아무 일도 하지 않도록 되어 있는 코드입니다.

6. BOB.0003 의 수정

1) 1차 수정

이제 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)하도록 코드도 주었고요.

2) 성별법 문제와 2차 수정

자, 앞에서 제가 안 하고 넘어왔던 문제를 하나 말씀드리도록 하죠. 생각보다 심각한 문제인데요. 이런 겁니다. 현재 상속이 가능한 적통 서자(남)가 한 명 있습니다. 성별법은 남성 상속제입니다. 이 상황에서 정실로부터 아이가 태어났는데, 공교롭게도 여자아이라고 생각해 봅시다. 어쨌거나 정실의 아이가 태어났으니 앞에서 계승권을 가지고 있던 적통 서자에게 상속불가 트레잇이 걸리겠죠? 그런데 성별법 때문에 새로 태어난 아이도 계승권이 없습니다. 졸지에 상속권을 가진 사람이 아무도 없는 상황이 벌어집니다. 으악!

따라서, 새로운 정실 아기가 태어났더라도 그 아기가 현재의 성별법상 상속권을 가질 수 없는 성별의 아기라면 앞의 모든 상속권을 제척시키는 플레이는 매우 위험할 수 있는 겁니다. 코드 내에 이 부분에 대한 고려가 분명히 있어야 합니다. 그래서, 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 })에만 상위자에 대한 상속권 제척 작업을 하라는 겁니다. 따라서, 상속제가 남성 상속제이고 태어난 아이가 여자아이라면 이 작업을 안 하게 됩니다. 그냥 이대로인 거죠. 아시겠죠?

7. BOB.0006~BOB.0008 : 계승 완료 후 god_curse_you 트레잇의 정리

이제 다음 문제를 생각해 보죠. 플레이어가 죽고, 정상적으로 상속을 받았습니다. 그러면, 자녀가 하나가 아닌 이상 다른 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 트레잇을 갖고 있지 않을 겁니다. 사실 상관 없죠. 내가 작위를 가진 상태에서 낳은 아이가 아니니, 이 트레잇을 쓸 자격은 없는 게 맞습니다. 따라서 여기에도 그 원리가 그대로 적용됩니다. 만약 즉위 전에 낳은 정실 후계자가 있는 경우에도, 즉위 이후에 상속 가능한 아이를 낳게 되면 그 아이가 우선적인 상속 순위자가 됩니다. 사내아이가 둘 있는 상태에서 즉위했고, 그 이후에 셋째 남자아이를 낳았다면 상속 우선 순위는 셋째가 되는 겁니다. 이건 전혀 이상한 게 아닙니다. 설정상 당연한 거죠.

8. BOB.0009~BOB.0010 : 유일한 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 가 날아가면서 새로 상속 순위가 정해질 겁니다.

해결하지 않은 문제 및 그 밖에 생각만 해본 이벤트

1. 해결하지 않은 문제

현재 상정할 수 있는 문제 중에서 해결하지 않은 문제가 하나 있습니다. 중간에 성별법이 바뀐 경우 상속자가 아무도 없게 될 수 있는 문제가 아직 해결이 안 됐습니다. 특히 남성우선 상속제나 남녀평등 상속제에서 남성 상속제로 변경된 경우에 이 문제가 발생할 수 있습니다. 이 문제는 해결은 가능하지만 깔끔한 해결이 되지 않아서, 그냥 바로 아래에서 말씀드리는 god_curse_you 초기화를 통해 해결하시는 것이 좋겠습니다.

2. 그 밖에 생각만 해본 이벤트

god_bless_you 트레잇과 god_curse_you 트레잇은 현재 서로 반대 관계의 트레잇으로 설정되어 있습니다. 그렇다면, 뭔가 암투도 있을 법 하지 않나요? 예를 들면 god_bless_you 트레잇을 가진 자에 대한 정통성 공격이라던가, 원래 계승 순위가 앞섰던 god_curse_you 소지자가 god_bless_you 소지자를 암살하려는 음모를 꾸민다던가 말이죠.

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

댓글

댓글 리스트
  • 작성자우유가최고야 | 작성시간 16.12.12 정말 대단하십니다. 혹시 댓글다신 손자쪽 검토는 해 보셨는지 궁금하네요!
  • 답댓글 작성자tacitus 작성자 본인 여부 작성자 | 작성시간 16.12.13 아직 검토를 못 해봤습니다.
    손자 레벨까지 가기에는 현재 이 이벤트 자체가 구조 측면으로 좀 문제가 있습니다. 내용이 문제가 아니라 구조를 고쳐야 해요.
    뜯어 고친다고 하더라도 버그 없이 효과를 발생시킬 수 있을지가 조금 미묘하기도 하고요.
    상당히 에너지를 많이 소모하는 일이라, 시간을 쪼개서는 할 수 없는 일이라 언제쯤 한 번 건드려볼 수 있을지 모르겠네요.
  • 답댓글 작성자우유가최고야 | 작성시간 16.12.14 답변 감사드립니다! 프로그램에 대해서 아무것도 모르지만 엄청난 시간과 에너지가 있어야 한다는 것 정도는 안 봐도 알겠네요.

    글 잘 봤습니다.^^ 감사드립니다.
  • 작성자Whatawonderfulworld | 작성시간 17.02.17 토탈워에서 크킹2로 이번에 넘어와서 입문하게 되었습니다 ㅎㅎ. 좀 더 재밌게 플레이하려고 이 모드를 사용중입니다만, 한글패치 방식이 바뀌어서 그런지 글자가 모두 깨져서 나옵니다. 그리고 언제 여유가 되실때 손자 레벨 이하의 계승서열도 손봐주시면 정말 감사하겠습니다 ㅎㅎ 좋은 모드 만들어주셔서 감사합니다!
  • 답댓글 작성자tacitus 작성자 본인 여부 작성자 | 작성시간 17.02.17 글씨가 깨지는 건 짐작하신대로 한글패치 방식이 바뀌어서 그렇습니다. localisation 폴더의 .csv 파일을 변환기로 변환해주시면 됩니다. 변환기는 "한글화 작업실" 게시판에 공지사항에 보시면 있습니다. 손자 레벨 이하의 계승서열의 경우 가끔 생각을 해보고 있습니다만 완벽하게 해결이 불가능한 상황이라, 뭔가 다른 방법이 없을지 좀 더 고민해봐야 할 것 같습니다. 의외로 모든 구멍을 다 틀어막기가 상당히 어렵네요.
댓글 전체보기

CK 모드 게시판 다른글

현재페이지 1234
맨위로

카페 검색

카페 검색어 입력폼