KOEI/삼국지 시리즈

삼국지5PK 일판에 한글을 출력시키고 말겠다. (4부)

K66Google 2022. 2. 16. 17:38

(3부에 이어서 계속)

 

13. 덜어내기 작업 완료

마침내 덜어내기 작업까지 완료되었다. 덜어낸 문장은 약 1600개 정도다.

이제 메시지 쪽은 잘못 옮겨 적거나 제어코드를 빼먹은 게 아닌 이상 건드릴 것이 없다.

 

 

14. 메시지 파일에서 %s로 들어오는 문장의 조사 처리 지원

한글판 문장 이식이 끝나고, 계속 이런 곳 저런 곳 돌아다니면서 제대로 출력되고 있는지 확인하고 있었다.

그런데... 이런 문장이 떴다.

 

"재야 장수의 병사 변경할 수 없습니다."

 

아니... 분명히 앞의 '사' 자 때문에 '는' 으로 바뀌어야 하는데, 왜 '은'으로 출력되는거지?

도스창을 보니까... 아하... '병사' 로 문장이 안 들어오고 '%s' 로 들어와서 그런 거였다.

%s는 C언어에서 문자열을 취급하는 애인데... 그러면 %s가 들어간 문장들은 따로 다른 메모리 주소에서 처리를 한다는 건가?

 

일단 치트엔진과 Ollydbg를 통해 알아낸 바로는,

%s가 들어간 문장은 004DCEE8에서 다시 한번 처리를 하는 모양이다.

문장 완성은 0049CCC9인데, 여길 브레이크 포인트로 삼으면 안된다. %s 처리와 관련없는 애들도 모두 이쪽을 사용하고 있기 때문에 계속 브레이크가 걸린다. 따라서 다른 곳을 찾아야 한다.

 

나는 전에 하던 방식대로 004DCEE8에 메모리 브레이크(write)를 걸었다. 그리고 나서 다시 게임에서 메시지를 출력시키니까 0049D10B에서 멈췄다.

004DF658에는 문장 종료 주소가 들어가 있었다. 따로 바이트 카운트는 하지 않는 것 같다.

 

멈춘 함수의 꼭대기 부분은 0049D0FE였다. 거기서 Find reference를 한다. 그렇게 하니 0049D0E6이 나왔다. 다시 그 함수의 꼭대기인 0049D0D3에서 Find reference를 해보니까... 세상에!!! 결과값이 수 백개나 나온다. 게임 여러군데에서 여기를 호출하고 있기 때문이다. 하지만 우리가 필요한 건 메시지의 %s를 처리할 때 뿐이다. 일단 나온 결과값 전부에 브레이크 포인트를 걸고 다시 게임 속에서 메시지를 출력시켜본다.

 

그렇게 하니 00414A47에서 멈춘다. 이 단계를 넘어가면 004DCEE8에 메시지가 완성되서 들어오게 된다. 즉, 이 다음 주소인 00414A4C가 최종 브레이크 포인트다.

 

조사 도중 계산기 쪽에도 %s가 포함된 문장이 들어오는 것을 포착했다. 얘는 00414B0E에서 멈추므로, 다음 주소인 00414B13이 최종 브레이크 포인트다.

 

정리하자면 다음과 같다.

 

%s가 처리된 문장이 입력되는 주소 (시작 주소) : 0x4DCEE8

%s가 처리된 문장이 종료되는 주소 : 0x4DF658 (4바이트)

 

문장(대화상자) %s 브레이크 주소 : 0x414A4C

계산기 %s 브레이크 주소 : 0x414B13

 

이 정보를 바탕으로 치환 런처의 루틴을 수정한다.

런처에서 메모리의 문장을 읽다가 %s가 들어간 것이 포착되면 0x414A4C와 0x414B13에 추가로 브레이크를 건다. 그리고 조사 처리는 보류한 상태로 문장을 치환한다.

그러면 추가로 브레이크를 건 곳 때문에 2차 브레이크가 걸릴텐데 거기서 메모리의 문장을 다시 읽고 조사 처리를 하도록 한다.

 

드디어 %s로 들어오는 문자도 정상적으로 조사 처리가 가능해졌다.

 

 

15. 이름 입력 시 루비문자 입력 못 하게 하기 / 신규등록 시 뜨는 ???? 없애기

루비문자는 무장의 일본어 발음을 표기할때 쓰는 기능이다. 일본어의 후리가나(振り仮名), 요미가나(読み仮名)와 같은 역할을 한다고 보면 된다.

그런데 한글판에서는 이 기능이 필요가 없다. 우리가 한글을 못 읽는 것도 아니고, 한국어 로케일로 바뀌었기 때문에 입력해도 위의 스샷처럼 [굉낫독렇...] 뭐 이런 식으로 표시될 것이다.

루비 문자와 관련된 위치는 이름 목록 아래쪽에 바로 있다. (0xCC860) 여기를 모두 0x20 (공백) 으로 바꿔버리고, 원래 안내 문구인 '토씨를 입력해주세요'도 '결정 버튼을 눌러주십시오'로 바꿔서 플레이어로 하여금 결정 버튼을 누르도록 유도한다.

 

자, 루비문자는 이렇게 처리를 마쳤다. 그런데... 장수 신규 등록시에 뜨는 ????는 어떻게 해야 없애버릴 수 있을까?

대충 의심은 간다. 일본어 Shift-JIS의 전각 공백인 0x8140 때문에 그런 것이 아닐까 하고...

 

하지만 실행파일에서 81 40, 40 81을 A1 A1으로 바꿔도...

Ollydbg에서 0x8140과 비슷한 코드들을 수정해봤지만 도저히 바뀌지가 않았다.

 

Ollydbg 상에서 삽질을 거듭하다가 한글화가 안 된 삼국지5PK 실행파일을 열고 맨 처음부터 한 단계 씩 바꿔가면서 어느 시점에서 ?로 바뀌는지 확인해보았다. ADD EDX, 0x161 변경 때부터 ?가 튀어나오기 시작한다. 그럼 로케일과 관련이 있다는 거니까 이 녀석이 0x8140일 가능성이 더욱 높아진다.

 

아무래도 2바이트 문자를 출력하는 TextOutA 함수에다 브레이크 포인트를 걸고 지켜보는 수밖에 없겠다.

걸릴때마다 계속 진행 눌러가면서 보니... C1 40으로 들어오고 있었다. 뒷 바이트가 0x40인 걸 보니 0x8140에 무언가가 더해져서 0xC140이 된 걸로 보인다.

 

이번에는 TextOutA 출력 직전의 함수에 가 본다. 맨 처음에 반각 필터링 할 때와, 뒷 바이트가 0xFE인 글자들을 출력시킬때 갔던 동네다.

이번에는 함수 꼭대기 부분 (0041ED66) 에 브레이크 포인트를 걸고 진행하기로 한다. 여기에 브레이크를 걸면 EAX값에 프로그램 자체 문자코드를 확인할 수가 있다.

여기에 여러 값이 지나가다가 21 21이라는 값이 들어왔다. 21 21.... 내가 대항해시대2 윈도우판 한글화할때 봤던 낯익은 코드 같은데...

 

혹시 0x8140으로 값을 넣는게 아니라, 프로그램 자체 문자코드인 0x2121로 값을 넣고 있는건가? 검색해보니 아주 수상쩍은 코드가 하나 나왔다. (MOV EAX, 0x2121)

 

왠지 의심이 많이 드는 코드다.

이걸 0x2122로 수정하면 어떻게 될까?

 

의심이 적중했다.

바로 여기가 ?와 관련이 있었던 곳이다. 이걸 어떻게 해야 한국어 전각 공백인 0xA1A1으로 바꿀 수 있을까? 수작업으로 변하는 값을 계속 확인해보았다. 추론은 다음과 같다.

 

* 고유코드 추론

고유코드 - 일본어 - 한패 실행파일 출력
  21 21   -  81 40  - C1 40
(뒷 바이트 40은 한국어 인코딩 CP949에 글자가 없으므로, 이 이후로는 41로 맞춘다.)
  21 22 - 81 41 - C1 41
  23 22 - 82 41 - C2 41 
  25 22 - 83 41 - C3 41
  27 22 - 84 41 - C4 41
  29 22 - 85 41 - C5 41
  2B 22 - 86 41 - C6 41
  2D 22 - 87 41 - C7 41
  2F 22 - 88 41 - C8 41

  31 22 - 89 41 - C9 41 
  33.. - 8A.. - CA..
  35.. - 8B.. - CB..
  37.. - 8C.. - CC..
  39.. - 8D.. - CD..
  3B.. - 8E.. - CE..
  3D.. - 8F.. - CF..
  3F.. - 90..  - D0..

  61 22 - A1 41 - A1 41 
  61 62 - A1 82 - A1 82
  7F 22 - B0 41 - B0 41

  81 22 - B1 41 - B1 41

* 앞 바이트 정리 (고유코드 - 한패 실행파일)
21~3F : C1~D0
41~5F : D1~E0 (추정)
61~7F : A1~B0
81~9F : B1~C0

 

그럼 앞 바이트는 61이겠고, 뒷 바이트는 A1을 넣어야 하니까 A1 - 40 = 61... (16진수 뺄셈)
그럼 21 + 61 = 82... (16진수 덧셈) 정답은 61 82인가? 

 

아니었다. 
정답은 61 81이었다. 이유는 잘 모르겠지만 중간에 문자가 없는 0x7F를 그냥 넘겨서
그런 것 같다.
아무튼 ?가 사라지고 공백이 제대로 출력되면 된 거다. 이제야 좀 깔끔해졌군.

 

 

16. 진형 설명 칸을 늘리고 찌꺼기 제거

진형 설명 칸에 들어가봤더니 무장열전처럼 오른쪽에 설명이 짤리고 있다. 어떻게 해야 될까?

일단 너비는 약 310px 정도로 측정이 된다.

 

310이 16진수로 136이니까... 68 36 01 00 00 으로 검색해본다. 안 나온다.

그럼 픽셀을 1 올려서 검색한다. 그렇게 68 38 01 00 00으로 검색하니까 0x6380 대역에서 뭔가 수상한 값이 떴다.

 

EC는 236... 138은 312... 312x236 픽셀? 과연 여기와 관련이 있는 걸까?

 

여기가 맞았다.

너비를 312px에서 340px (154) 로 바꿔주니 모든 글자가 다 정상출력되고 있다.

그런데...

 

다른 진형으로 바꾸면 글자가 다 안 지워지고 저렇게 찌꺼기가 남아있다. 아놔 진짜... 이건 또 어쩌라는거여...

 

처음에는 공백 문자 (0x20) 으로 밀어버릴까 하고 생각했으나 그냥 위에 겹쳐서 출력된다.

그래서 너비가 아닌 높이를 늘리는 것도 시도해봤으나 이 또한 마지막 줄 문장이 계속 남아있어서 보기에 안 좋다.

 

일단 너비를 높이는 걸로 가고, 지워지는 범위를 한 번 계산해 보았다.

대략 130x160 정도인가.

 

이 단서를 가지고 이번에는 Ollydbg에서 찾아보았다. 68 xx xx xx xx 코드는 Ollydbg 상에서 PUSH xx 이런 식으로 나온다. 130이 16진수로 0x82니까 PUSH 0x82... 검색결과가 없으면 1 내려서 PUSH 0x81... 이런 식으로 검색해가며 찾아보았다.

 

PUSH 0x80으로 검색했을때, PUSH 0x9C와 함께 붙어있는 코드가 있었다. 9C는 10진수로 156이다.

그럼 128x156.... 130x160과 크기가 꽤 비슷하다. 지푸라기 잡는 심정으로 브레이크 포인트를 걸었다. 그리고 진형 선택 창을 여니까... 브레이크가 걸린다. 지푸라기를 제대로 잡은 모양이다.

아래쪽의 0x80을 다른 값으로 수정해본다. 0x9B (155px)로 바꾼다.

 

그랬더니 드디어 글자가 찌꺼기 없이 갱신되었다! 가로 픽셀을 155px까지 늘려줬으니 이제 괜찮을거다.

 

 

17. 무장 메시지 창 늘리기

메시지 폭이 길어서 말풍선이 메시지 창 오른쪽 끝에 도달했다.

대충 너비는 약 366px, 높이는 약 128px로 측정되었다.

담당관 위치를 보면 메시지 창에 딱 걸쳐있는 상태다. 폭을 늘리면 걸치지 않고 가려져야 한다.

 

높이 128px를 단서로 68 80 00 00 00 으로 검색해보아다. 그렇게 하니 0xF6DE에 이런 값이 나왔다.

 

68 80 00 00 00 / 68 70 01 00 00

 

여기의 너비 값을 수정하고 (70 01 -> 90 01) 저장, 실행해서 확인해본다. 담당관을 보니 이제는 걸치지 않고 가려져 있다. 확장 성공이다.

 

 

18. 동영상 검은화면 문제 (667EB705 오류)

그렇게 실행파일의 여러 문제들을 고치다가, 다시 런처를 켜보려고 하니 667EB705 오류가 떴다.

청천벽력같은 일이었다. 설마 내가 헥스 코드를 잘못 건드려서? 지금까지 해온 게 다 물거품이 된건가...?

...아니었다. 런처를 빼고 그냥 실행하니까 동영상이 음성만 출력된다. 실행파일의 이름을 바꾸고 출력하니 그때는 또 정상적으로 출력된다. 그렇다. 코에이 게임에서 흔히 일어나는 동영상 검은화면 문제인 것이다. 내가 저 오류는 삼국지9PK에서 봤는데, 5PK까지 이럴 줄은 몰랐다.

 

dxwrapper를 써봤으나 동영상 문제가 해결되지 않았다. 다른 방식을 찾아봐야 한다.

 

어쩌면 레지스트리에 실행파일 이름 같은 게 기록되는 게 아닐까 하고 나는 레지스트리 편집기의 검색창에 'San5WPK' 라고 검색했다. 오랜 검색 끝에...

 

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Direct3D\Shims\EnableOverlays

 

여기에 삼국지5PK 실행파일이 등록되어 있다는 걸 확인할 수 있었다. 그 외에 삼국지9PK와 신장의 야망 혁신도 있었다. 모두 내가 플레이하면서 동영상 검은화면 문제를 겪은 게임들이다.

값을 0으로 바꿨더니 다시 동영상이 정상 출력된다. 이걸로 해결.

 

 

19. 환경설정을 배치 파일(.bat) 환경에서 .exe 환경으로 교체

이건 삼국지5PK와는 약간 무관한 사안일 수도 있지만 언급하고 간다.

그동안 제작했던 한글 출력패치는 배치 파일(.bat)을 통해 스팀 클라우드 폴더에 복사하거나 불러오는 방식이다.

이 때문에 일부 컴퓨터 환경에서는 배치 파일이 백신으로 인해 실행 제한이 걸리면서 스팀 클라우드 지원 등이 정상작동하지 않을 수 있다는 생각이 들었다.

 

그래서 이번에 삼국지5PK 한글 출력패치를 배포하는 김에 다른 삼국지 버전들의 한글 출력 패치도 배치 파일이 아닌 VB.Net으로 만들어진 exe 파일을 사용하도록 바꾸었다.

 

 

20. 맺음말

삼국지5PK 스팀 런처 한글화 스샷.

포토샵과 Reshack을 사용해 스팀 런처 한글화까지 마치고...

마침내 삼국지5PK 스팀 일본어판 한글 출력패치가 세상에 나올 수 있게 되었다.

한글화 과정에서 겪었던 모든 일을 서술하니 스크롤 압박으로 인해 4부까지 나눠서 쓰게 되었다. (4부도 스크롤 압박이 심해서 하마터면 5부까지 쓸 뻔했다.)

나중에 삼국지4PK 한글화 과정을 쓸때는 이미 언급된 부분은 생략하는 식으로 가야 할 것 같다.

 

한글화 과정에 관심이 있는 분들에게 이 4부작 연대기가 한글화 지식에 도움이 되었으면 한다.

그럼 이만...

 

- 삼국지5PK 일판에 한글을 출력시키고 말겠다. (완결) -