KOEI/신장의 야망 시리즈

신장의 야망 12 혁신 추가 한글화 삽질과 반에디터 한글화 시도.

K66Google 2021. 6. 10. 21:49

모든 일은 하나의 댓글에서 시작되었다.

내가 이전에 블로그에 게시했던 혁신 엔딩 메시지 한글화 게시물(링크)을 통해, 그동안 자체적으로 혁신 한글화를 진행했던 분의 작업물을 공유받을 수 있었다.

작업물에 남아있는 미한글화 부분을 추가로 한글화하는데 몇 달 정도 걸릴 것 같다고 답변하였는데, 그 답변을 한 지가 3월 하순이었다. 어느새 두 달이 지났고, 6월도 이제 중순으로 접어들고 있다. 그동안 다른 일상에 밀려서 혁신 한글화는 아주 느리게 진행되었다.

아무튼 이 게시물에는 신장의 야망 혁신의 추가 한글화 과정 중에 있었던 온갖 삽질(?)들을 정리해보려고 한다.

 

1. 폰트 변경 삽질

작업물을 받고 MSG 에디터로 메시지 파일을 열어 미번역된 문장들을 번역하는데, 정작 필요한 한글 음절이 폰트에 없어서 골치 아픈 적이 한 두번이 아니었다. 예를 들어 다음과 같은 문장이 있다고 치자.

 

'이슬처럼 내려와서...... 이슬처럼 사라지는 내 몸...... 나니와의 도  속의 ......'

이라는 문장이 있는데, '' 자가 한글폰트에 없었다. 그래서 부득이하게

'이슬처럼 내려와서...... 이슬처럼 사라지는 내 몸...... 나니와의 Dream도 Dream 속의 Dream......'

이렇게 임시로 번역해놓을 수밖에 없었다. 그러나 특정 음절때문에 번역에 어려운 문장은 이것뿐만이 아니었다.

'사람의 일생은 무거운 짐을 지고  길을 가는 것과 같다……'
'최근의 불행,망상을 모아두었던 철제 그을、지금 부순다'
'락을 맞고 나서 천 소리는 귀에서 떠나지를 않았는데……'
'비을거면 비어라'
'져야할 때를、아는거야 말로 세상의 이 다운 것이고、사람도 사람다운 것……'

대체 표현, 우회 표현을 떠올리는 것도 한계가 있다.

결국 나는 번역을 때려치고 먼저 폰트를 창조·대지PK 한글화 방식에 사용된 A폰트체계로 다 갈아엎기로 하였다.

 

 

예전에 혁신 폰트 파일을 살펴본 적이 있었다. 당시에 난 Font24.n12 파일은 1536x24에 단색 1bpp로 보면 된다고 분석했었다. 그래서 또 분석할 필요는 없었고, 그저 폰트를 bmp 파일로 추출하고 포토샵으로 새 글자를 덮어 쓴 후 다시 이식시키면 될 거라고 생각했다.

그런데...

 

 

글자가 너무 자글자글하게 출력되었다.

분명 포토샵에서도, Crystaltile2에서도 폰트는 또렷하게 들어갔다. 그런데 왜 게임에서는 저렇게 출력되고 있단 말인가?

 

 

그래서 이번에는 맑은 고딕으로 폰트를 바꿔서 넣어보았는데, 여전히 자글자글하게 나온다.

도대체 무엇때문에 이러는 건가? 계속 고민하다가 한번 폰트 파일의 헥스 코드를 살펴보기로 하였다.

 

 

폰트 파일 내부에는 T11N이라는 헤더가 있었다, 그리고 그 뒤에는 80 01... 이라는 바이트가 있는데, 이걸 바이트 플립해보면 01 80이다. 01 80을 10진수로 환산하면 384다. 뭐? 384? 설마 가로 픽셀이 1536px이 아니라 384px였단 말인가?

뒤 쪽에 있는 05 00 00... 부터는 무슨 팔레트 코드 같아서 Crystaltile2에 자체적으로 있는 기능인 'DATA → 팔레트 변환' 기능을 통해 팔레트화 시켰다.

 

 

가로 픽셀을 384px로 바꾸니 폰트가 깨져서 나온다. 어쩌면 타일 형태가 틀렸을 수도 있겠다 싶어서 형태를 여러가지로 바꿔보니까... N64/MD 4bpp에서 폰트가 좀 더 또렷하게 나오는 걸 확인할 수 있었다.

 

 

그렇다면 이 상태로 폰트 bmp를 내보내서, 포토샵으로 작업한 후 이식시키면 어떻게 될까?

 

 

허... 이제는 글자가 빵부스러기 처럼 나오고 있다. 이건 또 무슨 문제란 말인가...

대체 예전에 폰트를 이식한 분은 어떤 방법으로 이식을 한 것인지 무한한 존경심마저 들었다.

 

 

그렇게 헤맨 끝에 답을 찾았다. 답은 아주 싱거웠다.

혁신 폰트는 그레이스케일 폰트였다. 검은색과 흰색을 주로 쓰는 폰트였던 것이다.

 

 

Crystaltile2의 '팔레트-조합' 에서 맨 마지막 줄을 클릭하니 비로소 게임에서 보는 것처럼 글자들이 제대로 보이게 되었다. 팔레트로 의심되었던 헥스 코드는 그냥 눈속임이었던 건가.

어찌됐든, 포토샵 작업을 위해 '내보내기' 로 해당 팔레트 파일을 출력시켰다. 그리고 포토샵에서 폰트 bmp와 팔레트 파일을 불러와서 편집했다.

 

 

드디어 폰트가 깔끔하게 잘 이식되었다. 이제 '컴퓨터' 라는 글자도 출력할 수 있게 되었다. (기존 한글패치에서는 'Com' 으로 대체해서 표현했다.)

이렇게 첫 번째 삽질이 끝났다...

 

 

2. MSG(메시지 파일) 수정 삽질

다음으로 직면한 과제는, 기존 한글패치의 글자 매핑과 A폰트체계 매핑의 차이로 인해 잘못된 글자가 출력되는 것을 수정하는 일이었다.

상당히 오랜 시간동안 삽질을 할 것 같았으나... 다행히도 예전에 내가 만들었던 MSG 에디터의 기능 덕분에 하루만에 마칠 수 있었다.

 

 

바로 '메시지 일괄' 기능 덕분이었는데, 과정은 다음과 같다.

 

1. 문자 매핑을 기존 혁신 폰트로 지정하고 .txt를 출력한다.

2. 문자 매핑을 혁신-A폰트체계로 바꾸고 .txt를 입력받는다.

 

이렇게 하니까 하나하나 글자를 수정할 필요없이 그냥 텍스트 출력하고 텍스트 입력하는 걸로 글자가 알아서 치환되서 들어간다.

물론 문제는 약간 있었다. Shift-JIS의 8145 ( · , 가운데점) 코드가 .txt 입력 시에 ?로 바뀌는 문제였는데, 이건 에디터 내 '검색' 기능으로 '?'를 검색해서 고쳐주거나, Notepad++ 같은 프로그램으로 출력한 .txt를 모두 불러온 뒤 '?' 를 모두 검색해서 '·' (한자 + ㄱ) 로 고쳐준 뒤 .txt 입력을 하는 걸로 해결했다.

또한 일부 대사가 0바이트라서 .txt 입력이 안되고 오류가 뜨는 문제가 있었는데 이것도 텍스트 파일에서 띄어쓰기 한 번 해주고 입력하니 해결되었다.

 

이렇게 해서 기존의 한글화 분량을 A폰트체계에 맞게 이식하는 과정을 마쳤다. 이제 미번역된 메시지 파일을 번역해야 한다.

작업물에 더해서 내가 추가로 번역한 메시지 분량은 다음과 같았다.

 

1. MSG 파일 내 번역누락된 대사나 메시지 (사세구 등)

2. 지방모드 통일 이벤트

3. 역사 이벤트 미한글화 분량

4. 가문 고유 기술 이벤트 미한글화 분량

5. 튜토리얼 (오리지널판에서만 사용된 파일은 한글화 하지않음)

6. 가보열전

7. 커맨드 해설, 도움말, 용어사전

 

 

3. 실행파일 수정 삽질

실행파일은 Crystaltile2로 열고, MSG 에디터에서 사용한 A폰트체계 TBL 파일을 불러와서 사용했다.

다음 대역에 대해 확인 절차를 걸치면서, 폰트 체계의 변화로 인해 달라진 글자가 있으면 수정했다.

 

- 7489C0 ~ 749590 대역
- 755940 ~ 7574C0 대역
- 7600F0 ~ 761210 대역
- 7629D0 대역

 

이뿐만 아니라 기존에 번역되지 않았던 BGM 감상 모드 시의 음악 제목(75AAFC 주변)도 조악하게나마 번역했다.

 

 

4. 반에디터 재한글화 삽질

혁신 반에디터는 어느 분이 한글화해놓은 것(링크)이 있어서 그걸 쓰기로 했다.

여기에다 창조·전국입지전 반에디터의 JIS2GBK.TBL, GBK2JIS.TBL를 가져와보니 한글 입출력이 A폰트체계에 맞게 잘 되었다.

 

 

그런데 윈도우 디펜더가 자꾸 혁신 반에디터를 가지고 바이러스 트집을 잡는다. 창조 반에디터는 아무 트집도 안 잡는데 왜 혁신 반에디터만 가지고 그러는 거지?

하도 이상해서 반 형님의 홈페이지에 가서 에디터를 받고 켜보니까 그건 트집잡지 않는다.

아무래도 에디터 재한글화까지 해야 될 것 같다. 또 다시 삽질해야 되는건가.

 

 

우선 그냥은 한글화가 불가능했다. 에디터가 PEcompact 2.x로 패킹되어 있었기 때문이다. (PEiD로 어떤 패킹이 적용되었는지 확인 가능하다.) 언패킹을 해야 한글화가 가능해지는데, 나는 기존에 알고 있던 언패커인 QuickUnpack이라는 툴로 해결했다.

 

<언팩 과정에 대한 짤막한 설명>

1. 구글에다 QuickUnpack 4.3이라고 검색해서 32bit(x86) 또는 64bit(x64) 버전을 받는다.

(나는 indo-in******* 어쩌구하는 사이트에서 받았다. 게시물에 나온 MEGA 링크로 들어가면 된다.)

 

2. 윈도우XP가 깔린 가상머신을 실행했다.

3. 가상머신에 퀵언팩(32bit)과 반에디터를 넣는다.

4. 퀵언팩을 실행해서 반에디터를 언팩한다. (방법은 여기 위키처럼 하면 된다.)

 

 

이렇게 하면 Crystaltile2의 유니코드 인코딩을 통해 반에디터를 한글화할 수 있다. (Reshack로는 한글화가 불가능하다. 비표준 EXE 타령을 하기 때문이다.)

 

자, 그럼 이렇게만 하면 한글화가 끝날까?

 

 

그러면 얼마나 좋을까.

보다시피 시나리오의 제목이 '오와리 통일'이 아닌 '坷客府 烹老' 로 출력되고 있다.

 

 

이 문제는 반에디터가 JIS2GBK.TBL 파일을 읽을 때 한국어 인코딩으로 읽지 않고 중국어 간체 인코딩으로 읽기 때문에 발생하는 것이다.

'오' 자와 '坷' 자가 같은 위치에 있고, '와' 자와 '客' 자도 역시 같은 위치에 있다. 인코딩만 달라졌을 뿐이다.

 

그럼 이걸 어떻게 해야 수정할 수 있을까?

CreateFontA? 이건 프로그램 자체의 인코딩을 수정하는 방법이다. 반에디터는 유니코드 프로그램이라서 관련없다.

파일 불러오기 시의 인코딩을 책임지는 함수는 대체 뭘까... 그렇게 헤매던 도중 stackoverflow의 어느 게시물을 보았다.

(아마 구글에 Codepage WinAPI 라고 검색해서 나왔던 것 같다.)

 

 

그 게시물의 답변 중에 MultiByteToWideChar이라는 함수가 눈에 들어왔다. 어쩌면... 혹시 이건가?

나는 Ollydbg로 에디터를 불러와서 해당 함수의 모든 부분에 브레이크 포인트를 걸었다.

그리고 시나리오 파일을 열때 어디에서 멈추는지 확인하기로 하였다.

 

 

그렇게 하니까 0040DEDA에서 멈췄다. 그리고 오른쪽 아래에 StringToMap에는 '족경' 이라는 글자가, CodePage에는 '0x3A8' 이라는 값이 떴다.

3A8을 10진수로 환산하면 936인데, 936은 중국어 간체 인코딩을 의미한다. (932=일본어, 949=한국어, 950=중국어 번체)

CodePage는 ECX라는 레지스터가 담당하고 있으니, ECX값이 어디서 들어오는 지 거슬러 올라가면서 확인해봐야 한다.

일단 ECX는 [EBP+0x4]와 연관된 것으로 보인다.

 

 

워낙 삽질을 많이 했기 때문에 주요 내용만 여기에 기록한다.

우선 3A8이 오른쪽 하단창에 언제 처음으로 올라오는 지 확인해봤더니 위 스크린샷처럼 00414863으로 내려갈 때였다.

(오른쪽 하단은 EBP와 연관되어 뜨도록 설정해놓았다. 오른쪽 하단 마우스 오른쪽 클릭 - Address - Relative to EBP 로 설정하면 된다.)

 

EBP-A8에서 3A8이 뜨는 걸 확인할 수 있었다. 그 시점에 EBP는 0019F760이었다.

그렇다면 19F760 - A8 = 19F6B8 인데.. 거기에 3A8이 있다는 소리인가?

 

 

그래서 난 왼쪽 하단 창에서 0019F6B8로 이동했다. (Ctrl + G로 이동 가능)

그렇게 하니까 정말로 거기에 3A8이 있었다. 그러나 어셈블리 상에서 언제 이 값이 수정되는지 알 수가 없다.

여기서 나는 메모리 브레이크 포인트를 걸기로 하였다. 이 주소의 값을 바꾸려고 할때 브레이크가 걸리게 해보는 것이다.

(해당 주소에 마우스 오른쪽 클릭 - Breakpoint - Memory, on write)

 

 

브레이크 포인트를 걸고 프로그램을 재실행해서 시나리오 파일을 불러오려고 하니까 여기 지점에서 멈췄다.

이 지점에서 왜 멈춘걸까? 여기서도 난 삽질을 반복했다.

 

 

삽질 끝에 드디어 알아냈다. 위 스크린샷에 적힌 '삽질의 현장' 부분을 지날때 한번 메모리 주소를 썼다가, 아래의 파란색 동그라미 시점에서 또 한번 메모리 주소를 쓴다. 결론만 말하면, 아래쪽에 파란칠을 한 부분을 바꿔줘야 한다는 뜻이다.

 

 

3A8을 3B5 (949의 16진수)로 고친 후에 저장(Copy to executable) 한다.

 

* 정리

00407B04, 00407B15 = 0x3A8을 0x3B5로 수정.

 

 

이렇게 하니까 마침내 반에디터가 TBL 파일을 한국어 인코딩으로 읽어들인다. 한글 입출력까지 드디어 지원이 가능해진 것이다.

이제 시나리오 제목·설명 그리고 기타 사항들을 수정하는 일만 남았다...

 

 

5. 맺음말

이렇게 온갖 삽질을 거친 끝에, 마침내 한글패치가 배포 가능한 수준에 이르렀다. 배포는 이 게시물에서 하기로 한다.

그리고 이러한 삽질의 기록들이 누군가에게 도움이 되었으면 한다.

그럼 이만...