네버윈터나이츠 EE 커스텀 TLK 파일 사용 엘더스크롤 NWN DA

네버윈터나이츠EE 그러니까 1은 커스텀 TLK 파일을 지원합니다. 다만 아래 계보의 작품인 드래곤 에이지같은 경우와 달리 모드 게임들의 STRREF의 범위 값을 임의로 지정해줄 수가 없고 16777216이라는 고정된 범위에서부터 인덱싱이 됩니다.

이 값을 넣기 위해서 제가 쓰는 에디터를 기준으로 해당 문자열 ID를 부여하기 위한 밑작업을 해봅니다. nwnexplorer로 앞서 한글을 넣었던 dlg 파일에서 텍스트를 추출합니다. 그렇게 생성한 ks_ar0601_intro.dlg.txt에 추가 옵션을 넣기 위해 텍스트 추출 프로그램에 항목을 아래처럼 추가해봤습니다.

#include "iostream"
#include "stdio.h"
#include "stdlib.h"

int main(int argc, char* argv[])
{
FILE *IN1, *OUT;
char str[1024];
char out_id[16];
char in_name[255];
char out_name[255];
char fix_name[255];
char *fix_buffer;
char *temp;
char *strref; 
char *next_temp = NULL;
char *next_access = NULL;
int ck1 = 0; 
int ck2 = 0;
strcpy_s(in_name,argv[1]);

strcpy_s(out_id, argv[2]);
ck2 = atoi(out_id) + 16777216;

strcpy_s(fix_name, in_name);
fix_buffer = strtok_s(fix_name, ".", &next_access);
strcpy_s(out_name, fix_buffer);
strcat_s(out_name, sizeof(out_name), ".txt");
fopen_s(&IN1, in_name, "r");
fopen_s(&OUT, out_name, "w");
do {
fgets(str, 1024, IN1);
if (!feof(IN1))
{
if (strstr(str, "(12, Text") != NULL) ck1 = 1;

if (ck1 == 1)
{
if (strstr(str, ")") != NULL)
{
ck1 = 0;
temp = strtok_s(str, ",", &next_temp);
temp = strtok_s(NULL, ",", &next_temp);
strref = strtok_s(NULL, ")", &next_temp);
if (strref != NULL)
{
_itoa_s(ck2, out_id, 10);
ck2++;

fputs(out_id, OUT);
fputs(" :=", OUT);
fputs(strref, OUT);
fputs("\n", OUT);
}
}
}
}
} while (!feof(IN1));

fclose(IN1); fclose(OUT);
return 0;
}

위의 프로그램을 통해 추출된 ks_ar0601_intro.txt의 결과는 아래와 같습니다.

16778216 := 당신은 피곤한 눈에서 잠의 희미한 안개를 치우며 천천히 잠을 털어낸다. 조용하다...너무 조용하다 캐러밴 마차의 무거운 차축의 삐걱거리는 소리와 트레이드 웨이 도로 위에서 끊임없이 바퀴가 윙윙거리는 소리가 묘하게 없다.
16778217 := 피곤한 눈에서 재빨리 잠을 비벼본 후, 잠시 멈춰서 지난 며칠 동안의 사건들을 고려한다. 워터딥에서 살찐 하플링 상인 팔리아스가 대거포드 마을로 가는 트레이드 웨이 길을 따라 남쪽으로 향하는 캐러밴과 동행하도록 고용했다.
16778218 := 오랜 친구, 그리고 충실한 동반자, 탈라렌도 동행한다. 서로의 목숨을 몇 번이나 구해줬는지는 모르지만 길게 흐르는 검은 머리와 짓궂은 미소를 가진 이 노련한 투사는 가장 신뢰받는 동반자다.
16778219 := 작은 캐러밴 마차를 재빨리 둘러보면, 친구 탈라렌이 여기 없다는 것을 알 수 있다. 그 대신 뚱뚱한 하플링 상인 팔리아스가 땀에 젖은 손을 신경질적으로 쥐어짜는 것을 발견한다.
16778220 := "실례합니다만. 휴식한 지 얼마 안 돼서 깨워서 미안한데, 우리 여행이 조금 늦어질 것 같아. 나무 한 그루가 앞길을 막고 있어, 틀림없이 최근의 폭풍우로 쓰러졌다."
16778221 := "아이고, 물론 아니지. 너의 친구 탈라렌은 밖에서 기다리고 있어. 그리고 네가 그녀와 잠시 함께 하기를 바랬어."
16778222 := "그것 참 친절하게 해주시는군. 하지만 경비원들이 모든 것을 손에 쥐고 있다고 믿소. 그런데 네 친구 탈라렌이 밖에서 기다리고 있는데 같이 하겠느냐고 물었어."
16778223 := "아아, 훌륭해. 탈라렌에게 준비하고 나오는 너를 기대하라고 말할게. 자, 실례지만..."
16778224 := 팔리아스는 발뒤꿈치를 켜고 당신 혼자 짐을 챙기기 전에 인사를 한다.
16778225 := 
16778226 := 
16778227 := 
16778228 := 
16778229 := 이걸 위해서 날 깨운 거야?
16778230 := 탈라렌에게 무슨 일이 생긴 거야?
16778231 := 길을 치우는 데 내가 도와줄 수 있을까?
16778232 := 먼저 가셔도 됩니다.
16778233 := 나는 이미 깨어났으니 밖으로 나가는 편이 나을 것 같다.
16778234 := 탈라렌에게 내가 곧 나갈 거라고 전해줘.
16778235 := 
16778236 := 


이제 대거포드에 첨부되어 있는 커스텀 TLK인 ossian.tlk는 190항까지 사용하고 있습니다. 여기서 1000항부터 위의 내용을 차례대로 입력합니다. 위의 결과물을 약간 수정하면 TLK에디터의 배치작업 기능으로 한번에 입력할 수 있겠습니다만 일단 작업 순서상 dlg 파일에 1677216 값이 더해진 string id를 정확하게 입력하는게 더 중요하므로 여기서는 TLK 에디터 입력은 수동으로 한 셈 치겠습니다.


이렇게 ossian.tlk 파일이 준비가 되었다면 이제 GFF 에디터를 구동시켜서 1천이 더해진 16778216부터의 값을 각각의 엘레멘트에 대입해줍니다.

게임을 실행하기 전에 이제 ossian.tlk와 ks_ar0601_intro.dlg , 그리고 ks_ar0601_intro.dlg를 mod 파일 내에서 삭제한 대거포드 모드를 준비하고 실행해봅니다. 

다행히 원하는대로 출력이 됩니다. 

네윈나EE의 경우 영문권과 달리 유니코드문자권에서는 GFF 에디터를 통한 DLG 편집이 어렵기 때문에 커스텀 TLK를 활용할 수 밖에 없을 걸로 생각됩니다.

덧글

댓글 입력 영역