[CK2 모딩 팁]내멋대로 쓰는 Crusader King 2 모딩 매뉴얼 (18) 병종(병과) 및 상비군 모딩, (+전술 모딩) [내용추가]
작성자tacitus작성시간15.02.23조회수5,064 목록 댓글 31내멋대로 쓰는 Crusader Kings 2 모딩 매뉴얼
11. 병종 및 상비군 모딩
(1) 서설
사실 더 쓸 생각이 없었는데, 어떤 분의 질문 덕에 이런 저런 테스트를 하게 되어서, 시간을 들인 김에 아예 기록으로 남겨놓자 싶어서 한 회를 더 쓰게 됐습니다. 사실 지난 회에 용병단 모딩을 건드린 이상, 이것도 할 수 있으면 하는 것이 연속성 측면에선 좋을 수도 있겠죠.
다만, 접근할 수 있는 자료가 별로 없기 때문에, 이 부분은 저도 잘 모르는 부분이 상당히 많습니다. 이런 부분들은 이 글에서도 명확하게 알 수 없음으로 처리해 두겠으니, 해당 부분에 대해서 아시는 분은 덧글로 알려주시면 좋겠습니다.
(2) 병종 모딩
병종 모딩의 기본
현재 CKII 내에는 6종의 기본 병종과 3종의 특수 병종이 존재하죠. 경보병(Light Infantry), 중보병(Heavy Infantry), 창병(Pikeman), 경기병(Light Cavalry), 기사(Knights), 궁병(Archer), 여기까지가 기본 병종이고, 기마 궁수(Horse Archer), 전투 코끼리(War Elephant), 낙타병(Camel Cavalry)의 3종류의 특수 병종이 있습니다. (물론 거기에 얘들 실어나르는 갤리(Galley)도 있긴 하죠.)
경/중보병처럼 기병도 경기병과 중기병이 있을 것 같지만, 중기병 대신 기사(Knights)입니다. 저도 여러 번 헷갈렸지만, 심지어 원본에도 Knights 를 써야 할 부분에 Heavy Cavalry 를 쓴 부분이 있습니다. 프로그래머 중에 누군가 한 명이 저처럼 헷갈려서 적었겠죠...
기본적으로 각 병종의 전투 관련 데이터는 다음의 여덟 가지 항목으로 정의됩니다.
- 사기(morale)
- 유지비용(maintenance)
- 전초전(skirmish) 페이즈 공격
- 백병전(melee) 페이즈 공격
- 추격전(pursue) 페이즈 공격
- 전초전(skirmish) 페이즈 방어
- 백병전(melee) 페이즈 방어
- 추격전(pursue) 페이즈 방어
뒤에서 보시겠지만, 모든 전투 관련 버프/디버프의 기본은 사기와 각종 공격/방어 수치를 끌어올리거나 끌어내리는 방식으로 동작합니다. 이미 트레잇이나 기타 유닛 관련 모디파이어를 앞에서 여러 번 다루었는데, 그 때 본 적이 있는 요소들이기도 하고, 사실 저도 저 수치가 높으면 좋고 낮으면 안좋다 정도만 알고 있지, 정확히 수치적으로 어떤 공식에 의해 적용되는지 알고 있지 못한 것이 사실이기 때문에, 각각의 요소에 대한 자세한 설명은 생략하겠습니다.
이 정의 데이터들은, 기본 병종과 특수 병종의 데이터 위치가 서로 다릅니다. 기본 병종의 경우 common/defines.lua 파일 내에 정의되어 있습니다. 아래는 그 정의 데이터 중 경보병에 대한 정의 데이터입니다.
LIGHT_INFANTRY_MORALE = 2, LIGHT_INFANTRY_MAINTENANCE = 0.70, LIGHT_INFANTRY_PHASE_SKIRMISH_ATTACK = 2, LIGHT_INFANTRY_PHASE_MELEE_ATTACK = 3, LIGHT_INFANTRY_PHASE_PURSUE_ATTACK = 3, LIGHT_INFANTRY_PHASE_SKIRMISH_DEFENSE = 2.5, LIGHT_INFANTRY_PHASE_MELEE_DEFENSE = 2, LIGHT_INFANTRY_PHASE_PURSUE_DEFENSE = 3, LIGHT_INFANTRY_GRAPHICAL_FACTOR = 1,
경보병이기에 유지비가 작고, 사기 수치도 기본적으로 낮습니다. 전체적으로 모든 스탯이 다 1~3의 낮은 수치를 가지고 있죠.
가장 마지막에 있는 GRAPHICAL_FACTOR 는
저도 정확히 뭘 하는 것인지 잘 모르겠습니다. 일단 전투 자체와는 관련이 없는 것 같고, 뭔가 유니트 그래픽 표시와 관련된 것 같은데.. 여러 종류의 유닛이 섞여 있는 경우 어떤 유닛을 대표 유닛으로 보여줄 것인지를 정하는 수치라고 합니다. (학습한국사 님께서 알려주셨습니다.) 이 값이 높을수록 대표 유닛으로 보여질 확률이 높아지겠죠. 물론 병사 숫자와 곱해져서 정해지므로 항상 그런 건 아니지만요.
특수 병종 데이터 역시 원래는 defines.lua 파일에 존재했지만, 지금은 더 이상 이 데이터를 사용하지 않고, common/special_troops/00_special_troops.txt 에 별도로 정의되어 있습니다. 아래 데이터는 그 중 기마 궁수에 관한 데이터입니다.
horse_archers = { morale = 5 maintenance = 4 phase_skirmish_attack = 4 phase_melee_attack = 3 phase_pursue_attack = 7 phase_skirmish_defense = 4 phase_melee_defense = 4 phase_pursue_defense = 7 base_type = light_cavalry }
추적 공격 및 추적 방어에 높은 수치를 가지고 있지만, 백병전에는 상대적으로 약한 모습을 보인다는 것을 위 데이터로 충분히 예상 가능하죠?
base_type 은 저도 정확히 어떤 역할인지 잘 모르겠습니다. 뭔가 내부적으로 하드코딩되어 있는 데이터 (유닛의 이동 속도 같은) 를 유닛에 적용하기 위한 것이라고 예상합니다만...
새로운 병종의 추가 (특수 병종의 추가)
기존 유닛을 개선하기 위해서는 기존 데이터만 수정하면 되지만, 새로운 전투 유닛을 게임에 추가하기 위해서는 이 병종 데이터의 추가가 필요합니다. 기본 유닛의 추가는 불가능하고, 보통 특수 병종의 형태로 게임에 추가되기 때문에, 우리가 일단 수정해야 할 데이터는 common/special_troops/00_special_troops.txt 입니다. 모드 폴더 내에 common/special_troops 폴더를 생성하고, 선두 숫자를 적당히 바꾼 special_troops.txt 파일을 생성해 두세요.
그리고 위와 같이 데이터를 작성해 주면 됩니다. 우선 내부적으로 사용할 병종 아이디를 적어 주고, 그 안에 위 horse_archers 의 예에서 본 대로 9가지 설정 항목을 기록해 주면 됩니다. base_type 의 경우, 미리 말씀드렸듯이 저도 잘 모르는 부분이지만, 일단 추가하려는 유닛이 어떤 기본 유닛에 가장 가까운지를 생각해서 적어 주십시오. 저는 테스트 삼아서, 이륜 전차 유닛을 만들어 보겠습니다. (데이터는 대충 입력했습니다. 진짜 아무도 안 쓸 유닛이네요.)
chariots = { morale = 5 maintenance = 4 phase_skirmish_attack = 2.5 phase_melee_attack = 2 phase_pursue_attack = 9 phase_skirmish_defense = 4 phase_melee_defense = 3 phase_pursue_defense = 9 base_type = light_cavalry }
이것으로 특수 병종의 추가는 끝났습니다!
추가된 특수 병종에 대한 인식 데이터 및 모디파이어의 추가
이 내용은 유닛을 새로 추가하는 경우에만 필요합니다.
앞에서 새로운 병종을 추가했습니다. 이런 경우에는 CKII 시스템에 이런 내용을 추가했고, 이 데이터는 어떤 값을 받을 수 있으며 이러이러하게 모디파이어로 사용할 것이다 라는 것을 알려줘야 됩니다. 기본 병종이라면 이런 데이터가 모두 하드코딩되어 저장되어 있으니 상관이 없을 텐데, 특수 병종으로 사용자가 모딩을 통해 추가하는 데이터는 이런 정보가 없기 때문에, 직접 떠 먹여 줘야 하는 거죠.
이 내용은 common/modifier_definitions.txt 파일에 들어 있는데, 열어 보시면 3종류의 특수 유닛들들에 대한 데이터가 있음을 아실 수 있을 것입니다. 이 파일을 모드 폴더의 같은 위치에 복사하시고, 세 종류의 유닛 데이터 중 어느 하나를 골라서(내용 똑같습니다) 파일의 제일 뒤에 Copy&Paste 합니다. 그리고 이름만 고치세요. 예를 들면, 기마 궁수의 데이터는 아래와 같이 4개 항목으로 되어 있을 텐데, 이 내용을 그대로 파일의 뒤쪽에 복사 붙여넣기 하시라는 겁니다.
horse_archers = { ...내용생략... } horse_archers_offensive = { ...내용생략... } horse_archers_defensive = { ...내용생략... } horse_archers_morale = { ...내용생략... }
그리고, 해당 부분을 블록 지정 후, 유닛 이름에 해당하는 부분만 새 유닛 이름으로 바꿔주세요. 예를 들면, 저라면 이렇게 바뀌겠죠.
chariots = { ...내용생략... } chariots_offensive = { ...내용생략... } chariots_defensive = { ...내용생략... } chariots_morale = { ...내용생략... }
이 파일은 원본을 대체하기 때문에, 패치 등으로 내용이 달라질 때마다 수정을 다시 해 줘야 하는 불편함이 있지만, 새로운 특수병종이 추가되지 않는 한 이 파일의 내용이 변할 일은 없겠죠...
추가된 특수 병종의 아이콘
이 파트는 그러하오 님께서 지적해주신 부분입니다. 해당 파일을 못 찾아서 놔뒀다가 빼놓고 적지 않았는데, 적절하게 지적을 해 주셨어요.
추가된 특수 병종을 상비군 패널 등에 표시하기 위해서는 해당 아이콘이 지정되어 있어야 합니다. 이 아이콘은 gfx/interface 폴더 내의 두 아이콘 이미지 파일, unitpanel_specialunits_smallstrip.dds 파일과 unitpanel_specialunits_bigstrip.dds 파일에 저장되어 있습니다. 파일을 XnView 나 포토샵 등으로 열어보시면, 특수 병종 3종류가 칼라 이미지 3개 흑백 이미지 3개 이렇게 나란히 늘어서 있을 텐데, 우리는 중간을 잘라서 3개의 칼라 이미지 끝에 칼라 이미지를 붙여넣고, 3개의 흑백 이미지 끝에 흑백 이미지를 붙여넣는 중노동을 해야 합니다. 기본적으로 포토샵 작업을 하지 못하면 어려운 작업이죠.
어려운 작업이지만, 이 작업을 하지 않으면 아이콘 이미지들이 줄줄이 밀려버립니다. 따라서, 새 병종을 추가한 경우에는 이 작업을 반드시 해야 합니다.
이미지를 붙여넣은 후, 중간에 새 병종의 이미지를 추가하고, 그에 대해서 알파 채널을 수정해 넣는 등의 작업은 포토샵과 관련된 것이므로 이 가이드에서는 구체적으로 설명하지 않겠습니다. 다만, 이렇게 하면 된다는 정도만 알려드리도록 하겠습니다. 지난번에 제가 실패했다고 말씀드렸던 종교 이미지도 같은 원리로 수정하면 됩니다. 다만 종교 이미지는 그냥 제일 뒤에 붙이면 되니 이것보다 난이도가 낮죠.
-
포토샵으로 DDS 파일을 열고 저장하기 위해서는 포토샵용 DDS 플러그인이 필요합니다. 포토샵용 DDS 플러그인은 엔비디아 홈페이지에서 다운로드 받을 수 있습니다.
-
오픈소스 그래픽 편집 프로그램인 GIMP 에도 .DDS 플러그인이 존재하기는 합니다만, 필자는 사용해본 일이 없기 때문에 이것을 사용하여 아이콘을 편집할 수 있는지는 알 수 없습니다. (포럼의 글을 보면 GIMP+플러그인을 이용해서 게임에 사용되는 .DDS 파일을 편집할 수 있다는 포스팅을 몇 개 발견할 수 있습니다.)
-
그러하오 님께서 알려주신 Paint.NET 이라는 프로그램도 있습니다. 저는 아직 사용해보지 않았습니다만, CKII 모딩 관련하여 웬만한 그래픽 작업은 다 처리할 수 있다고 하시네요. 이름에서 알 수 있듯이 닷넷 프레임워크가 설치되어 있어야 합니다. 따라서 닷넷 프레임워크가 설치되어 있지 않다면 그것 먼저 설치를 해 주셔야 합니다.
당연한 이야기지만, 위 두 파일을 모드 폴더의 같은 위치로 복사한 후에, 복사한 이미지에 대해서 작업을 하셔야 합니다.
- 포토샵을 이용해 unitpanel_specialunits_smallstrip.dds 파일을 오픈합니다.
- unitpanel_specialunits_smallstrip.dds 파일은 높이가 28이므로, 224x28의 새 이미지를 엽니다.
- 앞의 아이콘 3개를 새 이미지의 앞쪽에 복사합니다.
- 새로운 병종의 칼라 이미지를 28x28 사이즈에 맞추어 리사이즈한 후 그 뒤에 붙여넣습니다.
- 뒤의 흑백 아이콘 3개를 그 뒤에 붙입니다.
- 새로운 병종의 흑백 이미지를 28x28 사이즈에 맞추어 리사이즈한 후 그 뒤에 붙여넣습니다. 이제 새 이미지가 가득 찼겠죠.
- 이미지들이 레이어로 나뉘어 있다면 이를 모두 배경으로 합쳐주세요.
- 채널에서 R,G,B 중 어느 하나를 선택한 후, New Selection 을 이용하여 끌어붙이기로 새 채널을 만듭니다. 이 채널은 알파 채널로 사용될 겁니다.
- 새로 만든 채널이 보이도록 설정한 후, 이미지 이외의 부분은 모두 검은색으로 칠해주세요. (알파 채널에서 검은색으로 칠하는 것은 지우는 것과 같습니다.)
- 이제 새로 만든 채널의 이미지 부분을 선택하시고 선택 영역 전체를 흰색으로 채웁니다.
- 완성된 파일을 .DDS 확장자로 저장합니다. 알파 채널을 저장하도록 설정하고, .DDS 파일의 형식은 8.8.8.8 ARGB 32 bpp unsigned 형식으로 저장합니다.
- unitpanel_specialunits_bigstrip.dds 에 대해서 위 1~11의 작업을 해줍니다. unitpanel_specialunits_bigstrip.dds 파일은 높이가 36 이므로, 288x36 의 새 이미지를 열어야 하고, 추가할 칼라 및 흑백 아이콘은 36x36 의 크기로 준비해야 합니다.
9번과 10번의 작업은, 이미지 이외 부분을 모두 선택한 후 검은색으로 채우고, 해당 선택을 반전시켜서 이미지 부분이 선택되도록 하여 그 부분에 흰색을 채워주시면 됩니다. 말이 쉽지 노가다죠.
아이콘 작업을 끝냈다면, 이제 아이콘을 CKII 가 알아먹을 수 있도록 정보를 주어야겠죠. 이 정보는 interface/unitpanel.gfx 파일에 있습니다. 이 파일을 모드 폴더의 같은 위치로 복사한 후, "GFX_unitpanel_specialtroops_smallstrip", "GFX_unitpanel_specialtroops_bigstrip" 을 찾습니다. 원본이라면 noOfFrames 값이 6일텐데, 지금 우리는 아이콘 두 개씩을 추가했기 때문에 이 값을 둘 모두 8 로 바꿔주어야 합니다.
왜 6이고 8이냐.. CKII 에서는 이렇게 아이콘을 하나의 파일에 몰아넣고 잘라서 쓰는 방식을 많이 사용합니다. 이 설정에서 noOfFrames 값이 6 이라는 것은, 이 파일에는 6개의 아이콘이 합쳐져 있으니, 이걸 정확히 6등분해서 앞에서부터 하나씩 사용하라는 의미입니다. unitpanel_specialunits_smallstrip.dds 파일을 예로 들면, 전체 크기는 168x28 크기이니, 28x28 의 아이콘이 6개가 쭉 붙어 있는 크기인 겁니다. 우리는 여기에 2개의 아이콘을 추가할 것이기 때문에, 이 이미지에 가로로 56픽셀을 더 추가해서 224x28 크기의 새 이미지를 생성했던 것이고요. 이렇게 두 개의 아이콘이 늘어났으므로, 이 파일에는 총 8개의 아이콘이 늘어서 있게 되고, 따라서 CKII 시스템에 이 이미지는 8등분해서 쓰라고 알려줘야 하는 거죠. 그래서 6을 8로 바꾸는 겁니다.
추가된 특수 병종의 사용
추가된 특수 유닛은, 현재로서는 사용을 할 수 없는 상태입니다. 왜? 특수 유닛은 기본적으로 어떤 건물에서든 생산을 해 주어야 사용이 가능한데, 이 특수 유닛을 생산할 수 있는 건물을 아직 정의하지 않았으니까요. 따라서 추가한 새로운 병종을 징집병으로 사용하기 위해서는 기존 건물 데이터의 수정, 또는 새로운 건물의 추가가 필요합니다. 건물의 모딩에 대해서는 이미 앞에서 다룬 적이 있으므로 더 이상의 자세한 설명은 생략하겠습니다.
이미 알고 계시겠지만, 어떻게 추가하는지는 다시 한 번 확인하겠습니다. 다른 유닛과 마찬가지로 <유닛 이름> = <숫자> 와 같이 입력하면 됩니다. 예를 들어 어떤 건물에서 궁수 150명을 징집하기 위해서는 archer = 150 과 같이 건물 데이터에 적어주면 되는 거죠. (위에서 제가 만든 유닛 chariots 30유닛을 징집하겠다면 chariots = 30 이라고 적어주면 된다는 겁니다.) 특수 병종은 한 건물에서 두 종류 이상 징집할 수 없다는 점은 이미 건물 모딩에서 언급했었죠.
다만, 이 유닛을 일반 징집병에는 사용하지 않고, 오직 상비군에만 사용하기 위해서는 이 절차는 필요가 없으며, 뒤에 상비군 조합 데이터만 수정하면 됩니다.
특수 병종의 액션 데이터
게임 중에 맵에서는 각종 유닛들이 열심히 돌아다니죠. 전투중에는 무기를 막 휘두르는 모습도 보여주고요. 이 액션 데이터를 따로 정의해 주지 않으면 맵에 그려줄 것이 없겠죠.
이 움직임 데이터는 interface/avatars.gfx 파일에 정의되어 있습니다. 아래는 해당 파일에서 경보병 부분(westerngfx 부분만), 그리고 기마 궁수 부분 중 일부를 가져온 것입니다.
EMFXActorType = { name = "westerngfx_LIGHT_INFANTRY" actorfile = "gfx\models\Western_Light_Infantry.xac" idle = "gfx\models\Infantry_Sword_and_Shield_Idle.xsm" move = "gfx\models\Infantry_Sword_and_Shield_Moving.xsm" attack = "gfx\models\Infantry_Sword_and_Shield_Attack.xsm" scale = 1.0f } EMFXActorType = { name = "westerngfx_LIGHT_INFANTRY_weapon" actorfile = "gfx\models\Attachments\Axe_01.xac" scale = 1.0f } EMFXActorType = { name = "westerngfx_LIGHT_INFANTRY_helmet" actorfile = "gfx\models\Attachments\Helmet_01.xac" scale = 1.0f } EMFXActorType = { name = "westerngfx_LIGHT_INFANTRY_shield" actorfile = "gfx\models\Attachments\Shield_Round_01_Checker.xac" scale = 1.0f }
EMFXActorType = { name = "westerngfx_horse_archers_rider" actorfile = "gfx\models\Western_Mounted_Archer.xac" idle = "gfx\models\Mounted_Archer_Idle.xsm" move = "gfx\models\Mounted_Archer_Moving.xsm" attack = "gfx\models\Mounted_Archer_Attack.xsm" scale = 1.0f }
위와 같이 기본 데이터, weapon 데이터, helmet 데이터, shield 데이터, rider 데이터의 5개 데이터로 구성이 되지만, 병종에 따라서 빠지는 데이터가 있습니다. 예를 들면 rider 데이터는 기병 계열에만 존재하고, shield 데이터는 경기병에 존재하지 않습니다.
각각의 옵션에 대해서는 제가 설명드릴 수 있는 것이 거의 없네요. 확장자가 .xsc 나 .xsm 인 파일들은 아마도 유닛의 애니메이션 데이터로 생각되는데, 이 파일을 우리가 직접 만들 수는 없지 않겠어요? 그냥 존재하는 데이터 중에 가장 유사한 걸 갖다 쓰는 수밖에요.
따라서, 기병 계열이라면 위 5개 데이터, 보병 계열이라면 4개 데이터를 따로 복사한 후, 유니트 ID 부분만 새 유닛으로 고쳐서 적어 주십시오. 다른 부분은 고칠 필요 없이, name 부분만 고치면 됩니다. 필자의 경우, 위에서 만들었던 chariots 의 움직임 데이터를 위해서 경기병 데이터를 가져다가 고쳤습니다. 경기병의 각 데이터에서 name = 부분의 LIGHT_CAVALRY 를 chariots 로 수정했을 뿐이예요.
objectTypes = { EMFXActorType = { name = "westerngfx_chariots" actorfile = "gfx\models\Horse.xac" idle = "gfx\models\Horse_Idle.xsm" move = "gfx\models\Horse_Moving.xsm" attack = "gfx\models\Horse_Attack.xsm" scale = 0.9f } EMFXActorType = { name = "westerngfx_chariots_rider" actorfile = "gfx\models\Western_Light_Cavalry.xac" idle = "gfx\models\Light_Cavalry_Idle.xsm" move = "gfx\models\Light_Cavalry_Moving.xsm" attack = "gfx\models\Light_Cavalry_Attack.xsm" scale = 1.0f } EMFXActorType = { name = "westerngfx_chariots_weapon" actorfile = "gfx\models\Attachments\Spear_01.xac" scale = 1.0f } EMFXActorType = { name = "westerngfx_chariots_helmet" actorfile = "gfx\models\Attachments\Helmet_01.xac" scale = 1.0f } }
물론 실제의 경우, 이 4개보다 더 많은 데이터를 수정하게 될 겁니다. 왜냐 하면, 각각의 문명 세트별로 모두 다른 유닛이 나올 테니까요. 최소한 westerngfx, easterngfx 의 두 세트는 있을 거고, 여기에 muslimgfx, indiangfx, norsegfx 정도까지 추가되는 세트도 있을 겁니다. 물론 더 많을 수도 있어요. 저는 일단 서유럽 문명권만을 고려해서 이 4개만을 집어넣습니다.
간편하게 수정하는 방법은, avatars.gfx 파일을 연 후, 해당 병종의 이름이 들어간 모든 항목을 별도의 파일에 복사하고, 유닛 이름을 일괄 찾아 바꾸기를 하면 됩니다.
원본의 파일 이름은 avatars.gfx 지만, 이 이름을 그대로 모드 폴더에 사용하면 원래 파일을 대체해버리기 때문에, 다른 파일과 마찬가지로 살짝 접미어를 붙여 줍시다. 예를 들면 제 경우는 avatars_mod.gfx 라는 이름으로 저장했습니다. 저장 위치는 앞에서도 말씀드렸다시피 모드 폴더 이하의 interface 폴더입니다.
이것으로 새로 추가한 병종의 움직임 데이터까지 추가했습니다.
.XAC 파일이나 .XSM 파일을 직접 만들거나 수정할 수 없기 때문에, 움직임 부분은 정말 제한적인 수정밖에 할 수가 없군요. 안타깝지만요.
(3) 상비군 모딩
상비군 모딩 데이터
이제 상비군을 건드려 보겠습니다. 상비군은 상비군 조합 데이터를 추가하거나 수정하면 되는 아주 간단한 작업입니다. 이 데이터는 common/retinue_subunits/00_retinue_subunits.txt 에 있습니다. 새 데이터를 추가하시거나 수정하시려면 해당 파일을 일단 모드 폴더의 같은 위치로 복사하시거나 번호를 바꾸어서 새 파일을 만들어두시라는 것은 이제 잔소리와 같으니 더 이상 안 할랩니다. (그러면서 다 해버리는 건 뭐니..)
파일을 열어 보시면 아래와 같은 데이터가 보입니다. 예를 든 것은, 알타익 계열에서 사용할 수 있는 기마 궁수와 경기병이 조합된 상비군의 데이터입니다.
RETTYPE_CUL_ALTAIC = { first_type = 6 first_amount = 130 second_type = 3 second_amount = 120 special_troops = horse_archers potential = { OR = { culture_group = altaic culture_group = iranian } } modifier = { horse_archers_offensive = 0.2 horse_archers_morale = 0.12 } }
RETTYPE_CUL_ALTAIC 과 같이, 마찬가지로 상비군 조합의 이름(ID)를 적어준 후, 그 안쪽에 데이터를 입력하면 됩니다. 각각의 데이터에 대해서는 간단히 설명을 드리겠습니다.
- first_type / second_type : 모든 상비군은 한 종류 또는 두 종류의 유닛을 조합하여 만들죠. 만약 하나의 유닛만을 사용한 단일병종 상비군을 만드시려면 second_type 데이터는 필요 없습니다. 뒤의 숫자는 병종을 의미합니다. 아래를 참조하시면 됩니다. 화면 유닛의 표시는 첫 번째 유닛을 기준으로 표시됩니다. (다시 생각하니, 테스트 때 단순히 첫 번째 유닛이 머릿수가 많아서 첫 번째 유닛으로 표시된 건가 하는 생각도 듭니다.)
0 - 경보병(Light Infantry)
1 - 중보병(Heavy Infantry)
2 - 창병(Pikemen)
3 - 경기병(Light Cavalry)
4 - 중기병(Heavy Cavalry)
5 - 궁수(Archers)
6 - 특수 병종(Special troops)
-
second_amount / second_amount : 머릿수를 정합니다.
-
special_troops : type 에 6(특수 병종)을 선택한 경우에, 어떤 특수 병종을 사용할지를 정합니다. 특수 병종을 두 종류 이상은 사용할 수 없다는 점을 유의해 주십시오.
-
potential = { } : 이 상비군 조합을 어떤 조건을 갖춘 경우에 사용할 수 있는지를 정합니다. 늘 그렇듯이 예를 들면 ai = no 를 적으면 이 상비군 조합은 플레이어만 사용할 수 있는 상비군 조합이 됩니다. 기타 종교나 문화 등, 일반적인 캐릭터 스코프에서 사용 가능한 조건문을 이용해서 저 부분을 채워주시면 됩니다. 원본의 경우는 대부분 문화를 기준으로 많이 제한을 걸죠. 뒤에서 조금 더 설명하겠지만, 특정한 유닛을 일정한 이벤트와 함께 해금하는 경우에도 이 섹션을 사용하게 됩니다.
-
modifier = { } : 이 상비군 조합에서 사용되는 유닛에 대해서 어떤 버프/디버프를 가할 것인가를 정합니다. 이건 순전히 그 상비군이 포함된 부대의 유닛에 대해서만 적용되는 모디파이어가 됩니다. 유닛 이름_offensive, 유닛 이름_defensive, 유닛 이름_morale 과 같이 적어주시면 되는 거, 과거에 트레잇이나 건물 모딩 등에서 몇 번 경험하셨을 겁니다. 뒤에 따라오는 숫자는 퍼센트이니 그렇게 적어주시면 됩니다. (예를 들면 0.2 면 20% 증가입니다)
동일한 병종이라도 상비군인 경우에 징집병보다 효율이 좋아지는 건 바로 이 모디파이어의 영향을 받기 때문일 겁니다.
설명 끝입니다! 원하시는 상비군 조합을 만들고 싶으시다면 common/retinue_subunits 폴더에 앞의 번호를 적당히 수정한 retinue_subunits.txt 를 생성한 후, 그 안에 위 규칙에 맞추어서 새 상비군 데이터를 입력해 주시면 끝납니다. 기존 데이터를 수정하고 싶으시다면 기존 데이터를 위 폴더에 복사해 넣으신 후 수정하시면 됩니다. (다 아시겠지만, 원본 폴더와 모드 폴더의 동일한 이름의 파일은 모드 폴더의 파일이 우선 적용됩니다.)
(4) 관련 문제: 특정 징집병 또는 상비군을 이벤트와 연동하여 해금하기
이 글을 쓰게 된 원인을 제공해주신 그 분의 질문 중에서 이 내용도 있었지요. 사실 기존의 가이드 내용만으로도 이 부분은 적용 가능하지만, 상당히 실용적인 부분이어서 여기에 다시 한 번 짚고 넘어가도록 하죠.
위에서 보셨듯이, 특정 병종이나 상비군을 어떤 이벤트와 연동하여 해금하는 직접적인 방법은 없습니다. 다만, 방법이 아예 없는 것은 아닙니다. 징집병의 경우에는 해당 징집병을 생산하는 건물의 건설 조건을 특정 조건에 걸리도록 하면 되고, 상비군의 경우에는 상비군의 사용 조건을 특정 조건에 걸리도록 하면 됩니다. 건물과 상비군 모두, potential = { } 섹션을 가지고 있기 때문에, 이를 이용하는 거죠.
좀 더 구체적으로 말씀드리자면, 해금을 위한 특정한 이벤트를 구성하고, 그 이벤트에서 set_global_flag 명령어를 이용하여 특정한 전역 플래그를 생성하도록 합니다. 그리고 해당 병종 징집을 위한 건물 또는 해당 병종을 사용하는 상비군 조합의 potential = { } 섹션 내에, has_global_flag 조건문을 이용하여 그 전역 플래그의 존재를 조건으로 걸면 되죠.
건물과 상비군 조합 모두, potential = { } 조합을 만족하지 않으면 해당 건물 또는 상비군 조합은 아예 목록에 나타나지 않습니다.
(5) 추가적인 문제들
예를 들면 앞에서 제가 chariots 라는 특수 유닛을 추가했습니다. 그리고 움직임 데이터를 연동시키고, 상비군 또는 건물을 지정하여 이 유닛들을 사용할 수 있게 설정도 했습니다. 이제 게임 내에서 이 유닛들을 뽑아내고, 또 실제 전투에 투입할 수도 있습니다. 그런데...
사실 아직 해결되지 않은 문제가 세 가지 남아 있습니다. 보통 게임 내에서는 여러 가지 환경에 따라서 전투 유닛들에게 다양한 버프 또는 디버프가 걸리죠. 예를 들면 강이나 해협을 건너 공격하는 유닛에게는 상당한 페널티가 더해지고, 험한 지형을 이용해서 방어하는 유닛에게는 상당한 방어 보너스가 주어집니다. 이런 내용들이, 우리가 새로 추가한 유닛들에 대해서는 전혀 적용이 안 되는 겁니다.
또 하나, 게임의 전투의 양상을 변화시키는 요소 중의 하나로서 전술이 있죠. 일반적인 전술도 있지만, 특정한 유닛을 전제로 하여 발동하는 고급 전술들도 많습니다. 그 유닛의 가치를 매우 상승시키는 요소가 되는데, 우리가 새로 추가한 유닛에는 이런 것들도 없습니다. 이것도 필요하다면 추가해 넣어야 합니다.
마지막으로, 이건 덤입니다만, 군사 관련 기술들은 특정한 유닛에 대해서 보너스를 주는 부수효과를 가지고 있습니다만, 새로 추가해 넣은 유닛은 이 효과를 못 받겠죠. 따라서 이 부분에 대한 수정도 필요할 수 있습니다.
지형 관련 버프/디버프 수정/추가하기
이 내용은 고정된 내용으로서, common/static_modifiers.txt 파일의 중간쯤에 있습니다. 모두 특정한 병종에 따른 offensive/defensive 값을 증감시키는 버프/디버프 모디파이어입니다.
- river_crossing = { } : 일반적으로 강을 건너서 공격할 때 공격자가 받는 효과입니다.
- major_river_crossing = { } : 주요 강(대개 큰 강입니다)으로 지정된 강을 건너서 공격할 때 공격자가 받는 효과입니다.
어디가 주요 강인지는 맵 데이터를 열어보면 됩니다. map/default.map 파일을 열어보시면 major_rivers = { } 안에 프로빈스 코드로 정의되어 있습니다만, 그게 정확히 어딘지 확인하려면 이래저래 귀찮습니다.
-
strait_crossing = { } : 건널 수 있는 바다가 있죠. 좁은 해협들. 그 곳을 건너서 공격할 때에 공격자가 받는 효과입니다.
-
amphibious_landing = { } : 배에서 상륙하여 바로 전투에 들어가는 경우에 공격자가 받는 효과입니다.
-
defenderbonus_mountain = { } : 현재 지형이 산인 경우에 그곳에서 방어하는 방어자측이 받는 효과입니다.
-
defenderbonus_hills = { } : 현재 지형이 언덕인 경우에, 그곳에서 방어하는 방어자측이 받는 효과입니다.
-
defenderbonus_jungle = { } : 현재 지형이 정글이 경우에, 그곳에서 방어하는 방어자측이 받는 효과입니다.
지형의 정의는 map/terrain.bmp 파일에 색칠공부 식으로 정의되어 있습니다. 그리고 어떤 색깔이 어떤 지형인지, 어떤 지형에서 어떤 효과가 기본으로 주어지는지에 관한 내용은 map/terrain.txt 에 있습니다. 라지만 사실 이런 내용은 맵 모딩할 때나 쓸 내용인데...
실제 데이터를 보시면, 위에서 본 유닛 모디파이어를 사용해서 개별 병종마다 offensive, defensive 의 버프/디버프 정도를 적고 있습니다. 새로 추가된 유닛에 대해서 이를 적용시키고 싶다면 적용시키고 싶은 곳에 기록을 해 주시면 됩니다.
사실 이 부분은 저도 의문인 것이, 데이터를 보시면 아시겠지만 전투 코끼리와 낙타병에 대해서는 전혀 적용이 되어 있지 않습니다. 그렇다면 실제 게임 내에서 전투 코끼리와 낙타병은 도하 페널티나 지형 방어 보너스를 전혀 적용받지 않는다는 것인지.. 아니면 앞에서 본 적이 있는 base_type 데이터를 2차적으로 적용받는 것인지.. 이 부분은 저도 전투 쪽에 아는 것이 적다 보니 잘 모르겠네요. (2차적으로 적용받는 건가 하고 생각하면 또 horse_archers 에 대해서는 귀신같이 다 적용을 해 놨거든요.)
전술 파일 수정/추가하기
이 파트 역시, 자료 자체도 거의 없다시피 한 부분이라서, 저도 정확히 모르는 부분이 많습니다. 혹시 틀린 내용이 있다면 꼭 알려 주십시오.
전투 시 사용되는 전술들의 정의는 common/combat_tactics.txt 파일에 있습니다. (새로운 내용을 추가하거나 수정하시려면... 아시죠? 복사..)
파일을 열어보시면 정말 정신이 하나도 없을 정도로 내용이 많습니다. (이걸 깔끔하게 정리해 둔 것이 바로 위키의 전술표입니다. 깔끔하긴 한데.. 그래도 보기 힘들어요.) 그런데, 각각의 전술의 구조는 사실 하나씩만 떼어놓고 보면 그다지 낯선 게 아닙니다. 이번에도 하나만 예를 들도록 하죠. 말도 안 되는 사기전술로 타 문화권의 플레이어들에게 지탄받는 몽골의 retreat_and_ambush_tactic (후퇴와 매복) 전술입니다.
retreat_and_ambush_tactic = { days = 6 sprite = 1 group = defensive trigger = { phase = melee horse_archers = 0.2 flank_has_leader = yes leader = { culture_group = altaic } } mean_time_to_happen = { days = 3 modifier = { factor = 3 flank_has_leader = yes leader = { martial = 12 } light_troops = { who = horse_archers value = 0.3 } } } change_phase_to = skirmish horse_archers_offensive = 4.2 light_cavalry_offensive = 2.4 archers_offensive = 1.8 }
- day : 저는 해당 전술이 발동되어 지속되는 시간으로 이해하고 있습니다. 정확한 의미는 모르겠습니다.
- sprite : 전투 창에 표시되는 아이콘 번호입니다. (1=경보 2=중보 3=창병 4=경기 5=기사 6=궁수 7=기마궁수)
- group : 이 전술이 속하는 범주입니다. advance, charge, defensive, harass, skirmish, stand_fast, swarm, volley 의 값이 있는데, 각각의 경우에 어떤 기준과 효과가 따라오는지에 대해서는 저도 정확히 아는 바가 없습니다. 다만 그냥 대략적으로 느낌만 잡을 뿐이죠..
- trigger : 이 전술을 사용하기 위한 조건입니다. 많이 쓰이는 조건들을 간단히 설명드릴께요.
- phase : 현재 전투 페이즈. skirmish, melee, pursue 중 하나이겠죠.
- flank_has_leader = yes : flank(현재 측면) 부대가 리더를 가지고 있을 것. (모든 전술은 중앙, 좌측, 우측 별개로 전개되므로, 세 측면에 모두 전술이 다를 수도 있습니다.) 일반적으로 리더가 있어야 전술을 펼 수 있다는 점에서 이 옵션은 거의 항상 붙어다녀야 할 것 같죠?
- leader = { } : 아시겠죠? 이 전술을 발동시키기 위한 리더의 조건입니다. 보통은 문화나 무력 등의 수치 등을 조건으로 겁니다.
- <병종> = <수치> : 예시에서는 horse_archers = 0.2 라고 되어 있는데요. 이건 이 전술을 발동시키기 위해서 해당 병종이 최소 몇 퍼센트 이상 존재해야 하는가의 조건입니다. 즉, 이 전술은 최소한 기마 궁수가 20% 이상은 있어야만 발동의 가능성이 있다는 의미가 됩니다.
- location = { terrain = desert } : 아시는 그대로 해석하시면 됩니다. 현재 전투가 벌어지는 전장의 지형이 desert(사막)일 것 이라는 조건이죠. 여기에는 없지만, 여러 전술에서 현재의 지형을 트리거 내용으로 많이 이용합니다.
- is_flanking = no : 이건 저도 정확한 의미를 모르겠습니다만, 아마도 현재 부대가 양 측면의 부대가 아닐 것 이라는 조건 같습니다.
- days = NN : 트리거에 days = 10 과 같은 조건이 있는 경우가 있는데, 이는 현재 이 전투가 NN 일 이상 지속되고 있을 것. 이라는 조건입니다. (아래에서 설명할 mean_time_to_happen 안의 days 와는 서로 다른 거예요.)
- mean_time_to_happen : 이벤트에서도 많이 사용되는 mean_time_to_happen 인데, 여기서는 그 용법이 본래 의미의 MTTH 라기보다는 Weight Multiplier 와 비슷하게 쓰이는 것 같습니다. 이 숫자가 높을수록 이 전술이 선택될 가능성이 높아진다는 거죠. 대부분의 전술은 이 값이 기본적으로 3 이며, 추가적인 조건 (modifier) 에 의해서 값이 더 커지거나 작아지죠.
MTTH 이하에 적혀 있는 내용들은 모두 해당 전술의 효과에 관한 기술입니다.
- change_phase_to : 현재의 페이즈가 무엇이건 간에, 뒤에 지정된 페이즈로 전투 페이즈를 변경합니다. 즉 예시한 전술의 경우 현재 페이즈가 무엇이든 다시 skirmish 페이즈로 되돌아가는 거죠. (그리고 신나게 화살을 쳐맞겠죠. orz)
-
<병종>_offensive/defensive : 해당 전술이 전개되면 특정한 병종이 얻게 되는 공격/방어 버프/디버프입니다. 예를 든 전술이 발동하면, 기마 궁수(horse_archers)의 공격은 무려 420%의 보너스를 얻게 되며, 경기병(light_cavalry)의 공격도 240%의 보너스를 얻게 되죠. 으어 사기다...
-
siege = attacker / siege = defender : 현재 공성 중인 경우에 공성 공격측/방어측에 사용되는 전술임을 표시하는 플래그입니다. 일반 전술에는 붙지 않고, 공성 또는 농성 중인 경우에만 적용되는 전술이겠죠.
-
enemy = { } : 이것이 trigger = { } 나 MTTH 의 modifier = { } 내에서 사용되면 현재 전투의 상대방에 대한 조건을 표현하기 위한 스코프 정의인데, 효과 부분에서 이 문구가 사용되면 조금 의미가 미묘해집니다. 예를 들어, Clever Ambush 전술의 항목에 보면 효과 부분에 아래와 같이 기술되어 있습니다. 이것은, 이 전술을 사용함으로써 적이 해당 그룹에 해당하는 전술을 사용할 가능성을 높인다 라는 의미로 이해됩니다.
enemy = { group = advance factor = 3 }
대체 우리는 뭘 하자고 이걸 보고 있는 거였죠? 네. 우리는 새로운 병종을 추가를 했었고, 그 병종에서 사용할 만한 전술들을 여기에 추가하자는 거였습니다. 아예 새로운 유닛을 위한 새로운 전술을 추가해 넣는 것도 좋은 방법이겠지만, 기존에 존재하는 전술들 중에서 해당 유닛에게 적용될 만한 전술들을 trigger = { } 안의 내용을 수정하여 새로 추가한 유닛도 사용할 수 있도록 하고, 또 효과 부분을 수정하여 새로 추가한 유닛이 그 효과를 받도록 수정하는 정도로도 충분합니다. 너무 욕심부리지 말자고요.
군사 기술의 항목에 새 유닛 적용시키기
기술에 관한 기본적인 내용은 common/technology.txt 파일에 저장되어 있습니다. (수정하시려면 파일을 모드 폴더로 복사.. 같은 이야기는 더 안 할께요.)
특히 우리가 여기에서 관심을 두는 부분은 파일의 첫 부분의, 경보병, 중보병, 기병 기술에 관한 내용입니다.
TECH_LIGHT_INFANTRY = { modifier = { ARCHERS_OFFENSIVE = 0.6 LIGHT_INFANTRY_OFFENSIVE = 0.6 LIGHT_INFANTRY_DEFENSIVE = 0.6 ARCHERS_DEFENSIVE = 0.6 } } TECH_HEAVY_INFANTRY = { modifier = { PIKEMEN_OFFENSIVE = 0.6 HEAVY_INFANTRY_OFFENSIVE = 0.6 HEAVY_INFANTRY_DEFENSIVE = 0.6 PIKEMEN_DEFENSIVE = 0.6 } } TECH_CAVALRY = { modifier = { LIGHT_CAVALRY_OFFENSIVE = 0.6 KNIGHTS_OFFENSIVE = 0.6 horse_archers_OFFENSIVE = 0.6 camel_cavalry_OFFENSIVE = 0.6 LIGHT_CAVALRY_DEFENSIVE = 0.6 war_elephants_OFFENSIVE = 0.6 KNIGHTS_DEFENSIVE = 0.6 horse_archers_DEFENSIVE = 0.6 camel_cavalry_DEFENSIVE = 0.6 war_elephants_DEFENSIVE = 0.6 } }
이제 딱 봐도 아시겠죠? 해당 기술을 1단계 개발할 때마다 여기에 적용된 내용이 해당 병종에게 적용이 될 거란 말입니다. 새로 추가한 유닛에 맞는 기술 부분에, OFFENSIVE 및 DEFENSIVE 관련 내용을 추가해 넣으면 됩니다.
(6) 언어 파일
게임에 새로운 요소를 추가했으니, 이것을 로컬라이즈해서 표시하기 위한 언어 파일의 추가도 반드시 필요하겠죠. 아래 내용은 제가 새 유닛인 chariots 를 추가하면서, 언어 파일에 집어넣은 내용입니다.
chariots;이륜 전차;;;;;;;;;;;;x; chariots_MORALE;이륜 전차 사기;;;;;;;;;;;;x; chariots_DISCIPLINE;이륜 전차 규율;;;;;;;;;;;;x; chariots_OFFENSIVE_FIRE;이륜 전차 공격;;;;;;;;;;;;x; chariots_DEFENSIVE_FIRE;이륜 전차 방어;;;;;;;;;;;;x; chariots_offensive;이륜 전차 공격;;;;;;;;;;;;x; chariots_defensive;이륜 전차 방어;;;;;;;;;;;;x; chariots_morale;이륜 전차 사기;;;;;;;;;;;;x; chariots_modifier;전투 조정자는 이륜 전차 부대에게 보너스를 받는다: $PERC$;;;;;;;;;;;;x;
모두, 앞에서 추가했던 개별적인 요소들에 대한 언어 파일 출력 항목들입니다. 만약 상비군을 추가했다면, 해당 상비군에 사용한 상비군 조합 ID 에 대한 텍스트도 필요할 겁니다.
이번 회의 내용은, 어떤 분의 질문에 답변하다가 개인적으로 흥미가 생겨서 모딩 테스트를 수행해보고 나서 그 데이터를 기록으로 남기기 위하여 쓴 것입니다. 이 분야는 제가 모르거나 정확히 알지 못하는 내용이 많기도 해서, 위의 내용들은 그 정확도를 다른 회에 비해서 더욱 보증하기가 힘듭니다. 따라서, 혹시라도 위의 내용 중 잘못된 부분이 있다면 덧글을 통해서 알려 주시면 많은 분들에게 도움이 될 것입니다.
댓글
댓글 리스트-
답댓글 작성자가필드 작성시간 16.11.26 넵 감사합니다!
-
작성자가필드 작성시간 16.11.26 중기병 100, 경기병 50만 따로 떼어내서 새로운 상비군 만들어봤는데 맵 상에 나오는 유닛 조형이 경기병으로 나오더라고요;; 순서를 바꿔도 마찬가지.
아무래도 유닛 조형 결정하는 뭔가 다른 소스가 있을듯 하긴 합니다. -
답댓글 작성자tacitus 작성자 본인 여부 작성자 작성시간 16.11.26 그 부분은 저도 정확히 모르는 부분이라서요. 덧글의 제일 위에 있는 학습한국사 님의 덧글에 의한다면 GRAPHICAL_FACTOR 값에 의해 결정될텐데요...
-
답댓글 작성자가필드 작성시간 16.11.26 신기한게 상비군만 운영하면 경기병으로 나오는데 징집군과 섞으니 그제서야 중기병 조형으로 나옵니다ㅋㅋ
-
작성자윤하바라기 작성시간 20.09.16 제가 새로 추가한 상비군 이름을 한글로 바꾸려면 어떻게 해야하나요?? 상비군 한번 만들어본게 모딩 처음이라 잘 모르겠습니다 ㅠㅠ