|
수평적 구조의 구역은 상호간에 전혀 영향을 미칠 수 없고 독립적입니다. 따라서 각 구역의 속성은 연관성을 갖지 않고, 독립적으로 따로 정의될 수 있습니다.
수직적 구조를 갖는 두 개의 구역은 서로간에 지배복종 관계를 이루므로, 상위 구역의 속성은 하위 구역의 속성에 영향을 주지만, 반대로 하위 구역의 속성은 상위 구역의 속성에 영향을 줄 수 없습니다.
그렇다면, 이런 자료구조에서 중요한 것은 어디부터 어디까지가 하나의 구역인지를 정확히 표시해 주는 것입니다. 따라서, 구역의 시작과 끝을 나타내는 { 과 } 기호가 반드시 제 위치에 존재해야 합니다. 만약 구역을 닫는 } 기호가 없거나 엉뚱한 위치에 가 있다면, 데이터를 해석하는 컴퓨터는 데이터를 제대로 읽어올 수가 없겠지요. 그 결과는 안 봐도 뻔합니다. 다시 강조합니다. 중괄호를 일단 열었다면, 반드시 닫아 주십시오.
이와 관련해서 한 가지 짚고 넘어갈 내용이 있습니다. 앞에서 들었던 예시를 다시 가져오고, 바로 이어서 그 예시를 조금 수정해 보겠습니다.
관악구 = { 구분 = 기초 인구 = 513,186 수장 = 유종필 ... 신림동 = { 인구 = ... } 서원동 = { 인구 = ... ... } ... }
관악구 = { 구분 = 기초 인구 = 513,186 수장 = 유종필 ... 신림동 = { 인구 = ... } 서원동 = { 인구 = ... ... } ... }
두 개의 예시가 무엇이 다른가요? 내용은 똑같은데, 자료를 작성한 형식에 차이가 있네요. 앞서 들었던 예시는 탭 문자를 이용해서 { 기호가 나올 때마다 탭 하나만큼씩 들여 썼고, } 기호가 나올 때마다 들여쓰기를 해제해가면서 자료를 작성했습니다. 그런데, 새로 든 예시는 들여쓰기를 전혀 하지 않고 모든 내용을 각 줄의 첫 칸에 붙여 적었습니다.
이렇게 한 번 들여쓸 때마다, 저는 깊이(Depth)가 깊어진다, 혹은 깊이가 달라진다고 표현을 합니다. 위에서 수평 관계로 표현된 신림동과 서원동 구역은 깊이가 서로 같다고 표현할 수 있겠네요.
자, 들여쓰기를 전혀 하지 않은 자료는 보시기에 어떤가요? 들여쓰기를 했던 이전의 예시에서는 각 구역들(또는 구역 내의 개체들)간의 관계가 명확하게 보입니다. 하지만 들여쓰기를 하지 않은 뒤의 예시에서는 각 구역들 간의 관계가 잘 안 보입니다. 신림동 구역이나 서원동 구역이 관악구 구역에 종속한 구역(수직 관계)인지, 아니면 관악구 구역과 독립된 구역(수평 관계)인지 꼼꼼이 살펴보지 않으면 알기 어려워요.
컴퓨터의 입장에서는 들여쓰기를 하든 하지 않든 자료를 해석하는 데 전혀 차이가 없습니다. 해도 그만, 안 해도 그만이예요. 하지만 인간이 보기에는 둘 사이의 가독성 차이는 그야말로 하늘과 땅 차이가 됩니다. 다음을 보시죠.
관악구 = { 구분 = 기초 인구 = 513,186 수장 = 유종필 ... 신림동 = { 인구 = ... 서원동 = { 인구 = ... ... } ... }
뭔가 잘못 된 게 보이시나요? 네. 신림동 구역의 끝을 의미하는 중괄호 } 하나가 빠져 있습니다. 그 결과 원래는 신림동에 대해서는 독립적이어야 할 서원동 구역이 신림동에 속한 구역이 되어 버렸으며, 관악구에 속해야 할 일부 내용이 그 하위 구역인 신림동에 속하는 내용이 되어버렸습니다. 또한 관악구 구역의 끝을 알리는 } 중괄호가 없어서 어디까지가 관악구 구역인지를 알 수가 없게 되어버렸어요. 그런데 들여쓰기가 제대로 되어 있지 않아서 어디가 문제인지, 어떤 문제가 생겼는지를 발견하기가 상당히 어렵게 되었습니다. 한번 들여쓰기를 통해 구역정리를 해 보죠.
관악구 = { 구분 = 기초 인구 = 513,186 수장 = 유종필 ... 신림동 = { 인구 = ... # ← 원래 있어야 할 } 기호가 빠짐 서원동 = { # ← 서원동 구역이 통째로 신림동 구역에 포함됨 인구 = ... ... } ... # ← 관악구 구역에 속해야 할 내용이 신림동 구역에 속함. } # ← 관악구 구역을 닫아주는 } 기호가 없어 끝을 판단할 수 없게 됨.
어디에 문제가 생겼는지 바로 눈에 띄죠?
앞의 내용을 간단히 정리하고 다음으로 넘어가겠습니다. 사실 제 전공도 아닌 자료구조를 쓸데없이 길게 논의한 이유는 이 내용들을 강조하기 위해서입니다.
각각의 구역의 시작과 끝을 알리는 중괄호 { 와 } 는 항상 정위치에 존재해야 합니다. 이게 제 위치에 존재하지 않으면 구역의 범위와 상호간의 관계를 제대로 나타낼 수가 없게 되고, 그 결과는 안 봐도 뻔합니다. 구역을 열었다면 반드시 닫으세요.
중괄호가 제대로 쓰였는지를 한 눈에 볼 수 있도록, 중괄호가 등장할 때마다 항상 들여쓰기를 생활화 하도록 합시다. 당장은 귀찮을지 몰라도(사실 귀찮은 것도 없어요), 나중에 코드를 읽을 때에 엄청난 차이를 불러옵니다.
아마 제가 앞에서, 모딩을 할 때의 주의점 중 하나로 탭 문자를 적극 활용하라는 말씀을 드렸을 텐데, 이제 그 이유를 아시겠죠?
거의 대부분의 Crusader Kings 2 텍스트 자료들이 구역을 기본으로 하는 수평적, 수직적 구조를 취하고 있는데 비해, 화면에 출력할 문자열 데이터를 저장하고 있는 언어 파일의 경우에는 상당히 오래 된 자료구조 형식인 CSV(comma separated value) 형식으로 되어 있습니다.
#CODE;ENGLISH;FRENCH;GERMAN;;SPANISH;;;;;;;;;x PROV553;Lyubech;Lioubetch;Ljubetsch;;Lyubech;;;;;;;;;x PROV554;Chernigov;Tchernigov;Tschernigow;;Chernigov;;;;;;;;;x PROV555;Pereyaslavl;Pereyaslavl;Perejaslawl;;Pereyaslavl;;;;;;;;;x PROV556;Chortitza;Chortitza;Chortitza;;Chortitza;;;;;;;;;x
원본의 언어 파일 중 하나에서 몇 줄 가져와봤는데요. 한 줄에 하나의 메시지 단위를 저장하게 되고, 줄 내에서 항목 간 구분은 세미콜론(;)으로 합니다. 세미콜론이 항목의 구분자 역할을 하기 때문에, 기록되는 메시지 내용 중에는 세미콜론 문자는 절대로 사용해서는 안 된다는 점은 미리 체크하고 넘어가도록 하죠. (발전된 형태의 .CSV 파일은 구분자도 메시지의 내용으로 사용할 수 있는 방법을 제공합니다만, Crusader Kings 2 의 .CSV 형식은 오리지날 형태의 .CSV 형식만을 지원하기 때문에 그런 방법을 사용할 수 없습니다. 그냥 무조건, 세미콜론은 내용에 쓰면 안 돼요.)
각 줄의 첫 번째 항목은 그 메시지를 호출하기 위한 메시지 ID 가 되는데, 위의 예시에서는 PROV553, PROV554 등이 메시지 ID 죠. 이 메시지 ID 를 이벤트 등의 스크립트에서 호출하면 그 메시지 ID 에 해당하는 문자열이 화면에 출력되는 겁니다. 메시지 ID 다음의 항목이 바로 그 메시지 ID 에 해당하는 영어 텍스트입니다. 그 뒤로 프랑스어, 독일어, 스페인어 번역이 따라오고요. 항목의 갯수를 맞추어서 나머지 ; 을 찍어준 후 마지막 칸에는 x를 적고 줄을 끝냅니다.
한글 패치 모드의 경우, 언어 파일에서 영어 뒤쪽의 모든 메시지를 삭제하고, 영어의 자리에 한글 문자열을 번역해서 넣었습니다. 그래서 한글 패치 모드를 사용할 때에 언어 설정을 영어로 하는 거죠.
이 자료구조를 다룰 때 주의할 점은 간단합니다. 텍스트 문자열 중에 ; 이 들어가지 않도록 하는 것, 그리고 하나의 항목이 끝났다면 구분자인 ; 을 분명히 찍어줄 것.
Crusader Kings 2의 모든 텍스트 파일(defines.lua 제외)은, # 기호를 주석문(설명문)의 시작으로 간주합니다. 따라서 일단 # 기호가 등장하면 거기부터 줄이 바뀔 때까지는 사용자가 달아 둔 설명으로 인식하여 컴퓨터가 읽지 않고 무시합니다.
이것을 이용하여, 사람을 위한 각종 설명을 직접 모딩 데이터 내에 남길 수 있습니다. 이게 뭐 하는 코드인지, 어디와 연관이 되는지 등을 오류의 위험 없이 적어둘 수 있다는 거죠. 전에도 한 번 말씀드렸듯이, 주석은 자신의 만수무강(...)을 위해 적극적으로 달도록 하십시오. 주석을 아무리 많이 달더라도, 그것 때문에 문제가 생기는 경우는 절대로 없습니다. Crusader Kings 2는 # 기호를 발견하는 순간 그 뒤는 아예 내용도 보지 않고 다음 줄로 넘어가 버리거든요!
....이상 쓸까 말까 망설였던 페이지가 끝났습니다. (자료구조는 내 전공도 아닌데!) 이제 진짜 Crusader Kings 2의 모딩에 관한 본 게임으로 들어가보도록 하겠습니다!
(최종 업데이트: 2017. 03. 01, 대응 버전: 무관)
첫댓글 와 엄청 좋은글이네요