KOEI/태합입지전 시리즈

태합입지전5 DX판 파일 구조를 조사해본다.

K66Google 2022. 5. 21. 22:54

올해 전반기는 참 알차게 보내고 있다.

작년 말부터 삼국지 스팀판 한글출력패치를 만들고, 그 후에는 몇몇 PC98 게임들을 한글화하고... 이제 좀 쉴려고 했다.

그런데... 또 나를 불타오르게 만드는 게임이 나왔다. 바로 태합입지전5 DX다.

 

태합입지전5 카페 스샷.

태합입지전5 구판(舊版)의 한글패치가 나왔던 시기가 언제였던가...

나는 옛 유적처럼 변해버린 태합입지전5 한글화 카페(링크)를 다시 찾아가보았다.

처음으로 0.1 버전이 나온 시기는 2011년 3월 초... 그리고 마지막으로 0.91 버전이 나온 시기는 2011년 6월 중순이다.

벌써 11년 전이란 말인가? 세월이 너무 빠르게 지나가버렸다.

 

 

몇 년 전, 한글화 쪽에 어느정도 발을 들이게 된 나는 태합입지전5의 한글화 구조가 어떤 식으로 되어있는 것인지 참 궁금했었다.

Crystaltile2로 바로 내용을 확인할 수 있는 LS11 메시지들과 달리 태합입지전5는 MSG 파일을 열어도 괴상한 바이트들만 나오고 도저히 일본어 같은 게 보이지 않았기 때문이다. 이벤트 파일 또한 마찬가지였다.

태합입지전5에서 사용된 런처 한글화 방식은 이번에 삼국지4 · 5 스팀판 한글화를 진행하면서 어느정도 배경지식을 쌓았으나, 파일 내 바이트 압축이나 암호화에 대한 해독 기술은 아직까지 나에겐 미지의 영역이다.

당시 한글화를 추진하던 땅땅치킨님은 과연 어떻게 파일을 해독할 수 있었던 것인지, 지금 생각해도 존경스럽기만 하다.

 

 

안타깝게도 태합입지전5 한글화 작업은 2011년 11월에 중단되고 말았다.

중단 이후에는 일부 유저들이 독자적으로 조금씩 한글화를 진행해갔으나, 한글화 방식이 메모리에 들어온 대사와 외부 메시지 파일의 대사를 비교해서 일치하는 게 있으면 그걸로 바꿔치기하는 방식이라서 그런지 메시지 치환이 정상적으로 이루어지지 않는 문제가 보고되는 등(링크) 사실상 흐지부지되었다.

 

 

그리고 세월이 흘러서 2022년 5월이 되었고, 태합입지전5 DX가 출시되었다. (하지만 스팀 한국 계정으로는 못 산다.)

나는 바로 게임을 구해서 조사해보기로 마음 먹었다. 어쩌면 약 11년 전에 중단된 한글화의 불씨를 다시 살릴 수 있을지도 모른다.

리마스터라고 해도, 코에이가 설마 옛날 파일 구조를 그대로 옮겨서 쓸거라고 생각하지는 않았다.

구판의 해상도는 800x600에 불과한데 리마스터도 그런 해상도로 출시할 것은 아니지 않은가? 분명 그래픽 파일은 새로운 구조로 바꿀 것이다. 그럼 폰트도 새로운 구조로 바뀔테고, 그러면 메시지 파일도...? 이런 생각을 하면서 나는 태합입지전5 DX판의 조사에 들어갔다.

 

 

1. 폰트

태합입지전5 DX는 일판, 중문간체, 중문번체 이렇게 3종류의 언어가 출시되었다. 일판과 중문번체판은 구판으로 이미 발매가 되었으니 그렇다 치고, 중문간체판은 어차피 정체자를 간화자로 바꾸면 끝나는 작업이니 이것도 좋다.

그런데 왜 한국어판은 나오지 않은 것인가? 디지털터치의 무관심? 역사문제 때문에? 수요가 낮아서? 도저히 모르겠다.

아무튼 일판 폰트 파일은 data\font의 FONT_JPN.G1T이고, Kukkii라는 프로그램으로 열면 된다. (Github 링크)

PNG 파일로 폰트 이미지를 뺄 수 있고, 포토샵에서 편집해서 다시 집어넣을 수도 있다. 이 프로그램이 없었으면 독음패치 제작은 꿈도 꾸지 못 했을 것이다. 개발자에게 감사할 따름이다.

(만들어진 독음패치는 이 게시물을 참조)

 

 

2. 그래픽

독음패치로 바꿨는데도 불구하고 시작메뉴와 마을메뉴의 버튼들은 계속 일본어로 출력되고 있다.

이유가 뭘까? 일단 대부분의 그래픽 파일 확장자가 G1T 였기 때문에, 나는 G1T와 관련된 프로그램을 검색해서 찾아보았다. 그러다가 알게 된 툴이 gust_tools 라는 것이었다. (Github 링크)

이 툴을 받아서 압축을 푼 뒤, 태합입지전5의 G1T 파일을 gust_g1t.exe에 드래그하면 dds 파일로 풀리게 된다.

(단, 확장자를 소문자로 바꿔야 gust_tools에서 인식이 된다. g1t로 바꾸라는 뜻이다.)

 

 

그러나 gust_tools로도 열리지 않는 G1T 파일이 있었는데, 대표적인 게 INITTOP과 MAINBOX라는 G1T 파일이었다.

해당 파일을 열어보니 헤더가 MRLK로 시작하고, 밑으로 GT1G4600이라는 헤더들이 여러개 보였다. 옛날에 NPK016 때문에 고생하던 게 생각이 났다.

그래서 옛날에 만들어두었던 헤더 자르기 프로그램으로 헤더들을 분리시켜서 분리된 파일 중 하나를 gust_g1t에 넣어보았다.

그렇게 하니까... dds 파일로 풀렸다!

 

 

시작 메뉴의 그래픽 파일은 INITTOP에 있었다.

글자는 아예 그래픽에 박혀있었다. 그래서 독음패치를 해도 바뀌지 않은 것이었다.

 

 

마을 메뉴의 그래픽 파일은 MAINBOX에 있었다.

이것도 시작 메뉴 그래픽처럼 글자가 그래픽에 박혀있었다.

 

나머지 파일들도 대충 이런 식으로 구성되어 있을 것이다. gust_tools에서 바로 열리면 좋은 거고, 안 열리면 MRLK 떼고 파편화시켜서 열면 되는 것이다.

이상 그래픽 조사 끝.

 

* 그래픽 조사 추가 사항

그래픽 파일은 DXT1 (알파채널 없는 경우) 또는 DXT5 (알파채널 있는 경우)의 dds 파일로 저장해야 한다.

그런데 이때 문제가 있다. 밉맵을 없음으로 해야 기존 파일 용량과 똑같아지는데, 이렇게 하면 gust_tools에서 인식을 못하는지 1KB 파일만 생성이 된다.

따라서 포토샵에서는 밉맵이 있게 출력해야 되는데, 또 이러면 파일 용량이 바뀌면서 MRLK 파일까지 헥스 에딧을 해야 하는 상황에 처하게 된다.

따라서 나는 그냥 때려치고 중국 유저가 만든 툴을 사용하기로 했다.

tk5dx_g1t.zip
0.11MB

( 출처 : ali213 )

 

tk5dx_g1t.cmd에 g1t 파일을 드래그하면 풀리고, 폴더를 드래그하면 폴더 안에 g1t 파일이 생긴다.

이런 식으로 시작메뉴와 마을메뉴를 작업하였다.

 

 

 

3. 메시지 - MSG

이제 본격적인 메시지 파일 분석에 들어간다.

구판에서는 메시지 파일이 25개로 쪼개져 있었는데, DX판에는 메시지가 하나로 통합되어 있었다.

일판 메시지 파일은 data 폴더의 TAI5MSG_JP.DAT 이다. 해당 파일을 Crystaltile2로 열어서 관심법으로 분석을 해보자.

 

일단 헤더 부분은...

0x00~0x03 : 1번 메시지 덩어리의 시작 오프셋

0x04~0x07 : 1번 메시지 덩어리의 크기

0x08~0x0B : 2번 메시지 덩어리의 시작 오프셋

0x0C~0x0F : 2번 메시지 덩어리의 크기

...

이런 식으로 되어가는 것 같다. 메시지 덩어리는 총 33개가 있는 것인가?

 

 

어쨌든 1번째 메시지 덩어리 끝 - 2번째 메시지 덩어리 시작 지점에 가보니까... 1번째 메시지 덩어리가 AA AA AA로 끝나는 점을 확인할 수 있었다. 00 같은 건 그냥 자릿수 채우기 용도로 보인다.

2번째 덩어리 초기에는 A5 A5 같은 것도 자주 보인다... 무슨 뜻일까?

 

 

이번에는 2번째 메시지 덩어리 끝 - 3번째 메시지 덩어리 시작 지점에 가봤다. 여기서도 AA AA AA로 끝났다.

AA AA AA는 끝 부분 외에도 위쪽에서 자주 보이고 있는데... 설마 이거 05 05 05 아닌가?

삼국지4나 삼국지5 같이 LS11로 압축되는 메시지 파일들은 문장 종료를 05 05 05로 끝내는 특성이 있다. 만약 태합입지전5도 그런 메시지 규격을 쓴다면... 흐음... 뭔가 수상하다.

그러면 밑의 A5 A5는 원래 00 00인 것일까? 일단 지금까지는 예상일 뿐이다. 정답인지 아닌지는 모른다.

 

 

삼국지1 한글화때 고유코드에게 시달린 게 생각난다... 설마 이것도 한 파일에 고유코드가 몇 십개씩 되지는 않겠지?

일단 0x00을 A5, 0x05를 AA라고 가정했을때...

뒷 바이트는 [ 5 6 7 8 9 A B C D E F 0 1 2 3 4 ] 이렇다고 치고,

앞 바이트는 [ A B C D E F 0 1 2 3 4 5 6 7 8 9 ] 이렇다고 치자.

사실상 모든 게 다 추측이다.

 

 

처음에는 게임 종료를 눌렀을때 나오는 대사 안에 있는 종료(終了)의 예상 암호화 값으로 찾으려고 했다.

그런데 알고보니 그 대사는 실행파일 쪽에 있었다. 따라서 방침을 바꿔서 자택에서 체력(분력)회복을 눌렀을때 나오는 대사 안에 있는 원기(元気)의 예상 암호화 값으로 찾아보도록 한다.

元気의 Shift-JIS의 값은 8c b3 / 8b 43이다. 예상 암호화 값은 21 58 / 20 e8인데... 검색해도 나오지 않았다.

그런데 31 58 / 30 e8은 있었다. 아무래도 AF에서 A0... 이런 식으로 빠지는 게 아니라 B0으로 그냥 계속 +1되는 암호화 구조였던 것 같다.

 

 

31 58 30 e8로 검색해서 31 58을 41 58로 [수정하고 저장하고 실행하고 확인하는] 삽질을 하니까, 0xC6540 대역의 바이너리를 바꿨을때 원기가 '륩기'로 바뀌는 게 확인되었다. '륩'은 한글 폰트(A폰트체계)의 9C B3에 해당된다.

이러한 과정을 통하여 마침내...

 

 

MSG에 숨어있던 암호화 수수께끼가 풀렸다... 바로 이런 식이었다.

(참고로 코에이는 이런 수법을 신장의 야망 천하창세 MSG에서도 써먹고 있었다. 천하창세 MSG는 고유코드가 무려 4개씩이나 되고, 4바이트씩 로테이션으로 적용되고 있었다.)

 

 

예상한 암호화 값을 토대로 복호화 프로그램을 만들어 보니 문장들이 성공적으로 치환되었다. 복호화에 성공했으니 암호화도 따 놓은 당상이다.

그런데 복호화된 파일을 보니 여기에도 반각 가타카나가 판을 치고 있다. 설마 메시지 용량 제한까지 있는 건 아니겠지?

실행파일도 64비트 시대인데 설마...

아무튼 이상으로 MSG 조사는 끝.

 

 

4. 메시지 - 이벤트 (*.TS5)

태합5 구판에서 가장 이해할 수 없었던 파일은 바로 이벤트 파일이었다.

구판 한글패치 파일을 다시 살펴보니, MSG 파일은 동봉되어 있는데 이벤트 쪽 파일은 그렇지 않다는 걸 확인할 수 있었다.

아마 MSG는 나처럼 복호화/암호화 툴로 편집한 것 같고, 이벤트는 메모리에 올라온 대사를 가로채는 방식으로 설계한 것 같다.

TE5 파일은 여전히 정체불명이지만, TS5 파일은 다행히도 DX판에서는 암호화가 해제되어 있어서 Crystaltile2 상에서 바로 열어서 일본어 대사를 확인할 수 있었다.

(구판처럼 암호화되어 있었으면 분석을 때려칠려고 했었다. 한글화가 사실상 불가능해지니까...)

 

 

일단 TS5 파일의 헤더 구조는 이런 식으로 되어있는 것 같다.

0x00~0x03 : 파일명과 관련 (4바이트)

0x04~0x07 : 파일 내 이벤트 수 (4바이트)

0x08 이후 : n번 이벤트의 시작 오프셋 (4바이트)

 

1번 이벤트 시작 오프셋의 이전 4바이트 : 파일의 종료 지점 (4바이트)

 

 

이벤트 쪽도 대사에 반각 가타카나 천국이다.

그런데 MSG 파일 쪽에서는 탁음 · 반탁음 히라가나도 반각 가타카나 구조에 맞춰서 들어가 있었는데 여기선 그냥 전각 히라가나로 들어가 있다. 심지어 멀쩡히 전각으로 들어가있는 청음 히라가나도 있었다. 대체 기준이 뭘까?

아무튼 더 들어가면 머리 아프니까 이걸로 이벤트 조사도 마친다.

 

 

5. 실행파일

그냥 Crystaltile2에서 일본어로 열어보면 잘 나온다. 신장의 야망 혁신 실행파일처럼 TBL 장착해서 편집하면 될 것으로 보인다. 다만 그대로 파일을 수정하면 Steam에서 파일 변조 감지에 걸릴 게 뻔하므로 그걸 못 하도록 처리하고 수정해야 한다.

이것으로 실행파일 조사도 끝.

 

--------------

이상으로 태합입지전5 DX판 파일 구조 조사를 마친다.

일단 위의 조사 결과를 토대로 3일 동안 MSG 에디터를 제작했다. 이건 며칠 후에 공개할 생각이다.

그럼 이만...