본문 바로가기
미연시/한글화 강의

기본적인 한글패치 제작 방법 (미연시) ①

by 카토레아 2022. 12. 26.

가장 먼저 언급해두고자 합니다.

저도 이런 작업에 대해서 누구에게 배운 적도 없고, 프로그래밍을 잘 하는 것도 아닙니다.

제가 누굴 가르칠 수준은 아니라는 것은 잘 알고 있습니다만,

 

그렇기에 제가 아무것도 모르는 상태에서 시도했던 경험을 떠올려,

관련 지식이 전혀 없는 분들이 시도는 할 수 있게끔 도움을 주기 위해 부족하지만 글을 적습니다.

 

 

 

정말 아무런 지식이 없는 분들에게 설명한다고 생각하고

가능한 자세하게, 기초적인 한글패치 제작 방법에 대해 정리해보겠습니다.

너무 쉬운 부분을 길게 설명하더라도 이해 바랍니다.

 

일본어 / 미연시의 경우를 상정하고 글을 적겠지만,

다른 경우에도 기초적인 부분들은 같습니다.

 

 '크로스 채널'의 3가지 버전을 가지고 예시를 들며 설명할 계획입니다.

이번 글에서는 '크로스 채널 복각판'의 한글화 작업 과정을 예시로

기초적인 부분부터 시작해보겠습니다.

 

 

 

게임이 설치된 폴더의 모습

게임이 설치되어있는 폴더입니다.

이 상태에서 한글패치를 만드는 시도를 한다고 해봅시다.

어떻게 접근해야 할까요?

 

일단 게임 파일들 중에서 게임의 텍스트 데이터를 가지고 있는 파일이 분명 있을겁니다.

 

접근법을 생각해 보자면,

 

①텍스트 데이터가 들어있는 파일을 찾는다.

②외국어를 한글로 수정한다

③저장한다.

 

이런 과정으로 생각해 볼 수 있습니다. 

 

만약 메모장(.txt)파일로 되어 있다면 매우 편하겠죠?

 

하지만 보통의 경우 게임 파일은 쉽게 접근하지 못하도록 암호화가 되어 있습니다.

 

그럼 위의 과정에 과정을 더 추가합시다.

 

①텍스트 데이터가 들어있는 파일을 찾는다.

②파일을 수정할 수 있는 상태로 변환한다.

③외국어를 한글로 수정한다.

④수정한 파일을 다시 원래 형태로 변환한다.

⑤저장한다

 

zip파일이라고 생각하면,

압축파일 안에 있는 텍스트 파일을 수정하기 위해선

먼저 압축을 푼 다음, 수정하고 다시 압축을 해야겠죠.

 

이런 압축을 푸는 과정을 decryption, decoding, 복호화.

압축하는 과정을 encryption, encoding, 암호화 라고 부릅니다. 

 

이제 우리에게 필요한 것은 알집처럼 압축을 풀고 다시 압축을 해줄 툴입니다.

 

이런 encoding, decoding 툴을 개발하는 것은 어려운 일입니다.

역으로 추론하는 과정이기 때문에 구조를 분석하고 알고리즘에 대한 지식이 있어야 합니다.

 

하지만 괜찮습니다.

많은 게임은 이미 알려져 있는 압축 알고리즘을 사용하고 알려져 있는 파일구조를 가집니다.

검색을 통해 이미 개발되어 있는 툴을 찾을 수 있을 가능성이 큽니다.

 

인코딩, 디코딩 툴을 구했다고 가정하고 다음 과정을 생각해봅시다.

 

이제 게임 내 텍스트 데이터를 편집해서 다시 넣어줄 수 있을 겁니다.

 

하지만 아직 해야할 과정이 남아 있습니다.

 


 

모든 게임은 두가지로 나눌 수 있습니다,

자체 폰트를 사용하는지, 윈도우에서 폰트를 불러오는지.

 

자체 폰트를 사용하는 경우는 보통 콘솔 게임의 경우입니다.

PC환경에서 개발된 게임의 경우 대부분이 윈도우에서 폰트를 불러오는 방식을 사용합니다.

 

이 글에서는 먼저 윈도우에서 폰트를 불러오는 게임의 경우만을 설명하겠습니다.

자체 폰트를 사용하는 경우는 다음 글에서 다룰 예정입니다.

 

윈도우에서 폰트를 불러오는 PC게임이라고 했을 때,

일본어 게임의 경우 가장 중요한 작업은 게임 실행 파일의 언어를 고쳐 쓰는 작업입니다.

비유하자면 일본인 게임을 한국인으로 개조해 한글을 알아들을 수 있게 만들어 주는 것이죠.

 

컴퓨터 데이터는 16진수를 사용합니다.

0부터 15까지의 숫자를 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 로 표기합니다.

16진수 4개를 묶어서 사용한다면 65536가지의 숫자를 표현할 수 있습니다.

 

컴퓨터가 사용하는 16진수를 사람의 언어로 변환하는 규칙 표(테이블)를 코드페이지라고 부릅니다.

CP949 코드테이블

우리가 사용하는 한글 윈도우는 8141이라는 16진수를 갂, 8142는 갃으로 읽고 있습니다.

우리나라는 cp949를, 일본은 shift-jis라는 코드페이지를 사용합니다.

 

예를 들어, 

'안녕하세요'라는 한국어 문장을 일본어를 출력하는 프로그램에 넣어준다고 생각해봅시다.

하지만 사실 우리가 넣어준 것은 '안녕하세요'라는 문자가 아니라,

한국어 문자 인코딩(cp949테이블)에 의해 16진수로 변환된 'BEC8B3E7C7CFBCBCBFE4' 라는 숫자입니다.

그러면 일본 프로그램은 'BEC8B3E7C7CFBCBCBFE4'를

일본 인코딩 테이블(shift-jis)에 따라 다시 문자로 변환하며

'セネウ酩マシシソ・'이라는 문장을 출력해버립니다.

 

따라서 디버거라는 도구를 사용해 실행파일의 코드페이지를 변경시킬 필요가 있습니다.

 

 

전체적인 과정을 정리하면 다음과 같습니다.

 

①텍스트 데이터가 들어있는 파일을 찾는다.

②파일을 수정할 수 있는 상태로 변환한다. // 디코딩 툴

+번역하기 편한 상태로 변환한다 // 변환 툴

③외국어를 한글로 수정한다.

+번역하기 편한 상태에서 다시 원래로 변환한다. // 변환 툴

④수정한 파일을 다시 원래 형태로 변환한다. // 인코딩 툴

⑤실행파일을 한글을 사용하게 수정한다. // 디버거

+이미지 번역 // 언팩 툴, 이미지 수정 툴

+바이너리 직접 수정 번역 // 헥스 편집기

+지역락 해제 // 디버거

 

 

실제 예시를 보며 더 자세히 설명하겠습니다.


 

 

 

크로스채널 설치 폴더

 

일단 처음에 데이터 파일 압축을 풀어야겠죠?

제가 사용할 툴은 GARbro입니다.

 

https://github.com/morkt/GARbro

 

GitHub - morkt/GARbro: Visual Novels resource browser

Visual Novels resource browser. Contribute to morkt/GARbro development by creating an account on GitHub.

github.com

 

GARbro는

비주얼 노벨 전용 리소스 탐색기로, 언팩&리팩을 포함해 다양한 기능이 들어있습니다.
가장 큰 장점은 오래 전부터 지금까지 쌓여온 비주얼 노벨 엔진에 대한 정보가 많이 들어있어

미연시의 경우 많은 게임이 이 툴을 사용해 언패킹이 가능합니다.

gui로 이루어져 있어 초보자가 사용하기에도 편리한 툴입니다.

비주얼 노벨 한글화를 시도하신다면 가장 먼저 사용해보는 것을 추천드립니다.

 

rio.arc 언패킹

파일을 하나씩 열어보니 Rio.arc에 스크립트 파일이 들어있는 것처럼 보입니다.

일단 전부 추출해봅시다.

우클릭-추출을 하거나 단축키 F4로 가능합니다.

 

rio.arc의 압축을 푼 모습

wsc파일들이 많이 생성됐네요.

혹시 모르니까 언팩이 잘 됐는지, 그리고 리팩이 잘 되는지 확인하기 위해

압축 푼 것들을 모아 다시 리팩하고(Rio.arc를 다시 만들고), 그 파일로 게임을 실행시켜보고,

실행에 문제가 없는 것을 확인하고 다음으로 넘어갑니다.

 

wsc파일의 헥스 데이터

Crystaltile2를 사용해 열어보니 스크립트 파일이라는 것이 확실해졌습니다.

 

Crystaltile2는 헥스 편집기 중 하나입니다.

보이는 것처럼 파일의 헥스 데이터(16진수로 이루어진)를 보고 편집할 수 있습니다.

 

지금 이 상태에서 헥스 편집기로 번역을 할 수도 있겠지만,

그러면 작업이 너무 불편하기 때문에

이 파일에서 텍스트 데이터만을 추출하고 싶습니다.

 

그런 기능을 하는 툴을 만들어 봅시다.

 

우리의 목표는 실행파일이 이 파일을 어떤 규칙으로 읽어들이고 있는지를 추론하는 겁니다.

숫자들 사이에서 규칙을 찾는 과정입니다..

 

규칙찾기

자세히 보니 자주 보이는 숫자와 함께 일정한 규칙이 보입니다.

 

규칙을 발견하셨나요?

 

 

대사의 앞뒤로 일정한 숫자가 들어간다

스크립트의 앞뒤로 일정한 규칙들이 보입니다.

①문장의 앞부분에는 보라 + 노랑 + 초록 + 빨강(0041xx00000F) 구성의 일정한 서열이 들어간다. 

②문장의 끝부분에는 파랑 서열이 들어간다.

③빨강(00000F)과 파랑(254B2550)은 변하지 않는다.

④보라(00)도 변하지 않는 값으로, 서열 사이를 구분하는 역할을 한다.

⑤노랑은 뒤에 오는 스크립트가 지문일 경우 41, 대사일 경우 42의 값을 가진다.

⑥초록은 00에서 시작해 문장마다 1씩 증가한다.

⑦앞에 0F, 뒤에 00이 붙어 구분한다.

 

 

이 규칙을 이용해 스크립트만 추출하는 툴을 빌드하면 됩니다.

 

 

chatGPT를 사용해 함수를 짭니다.

정말 잘 알려준다

 

이런식으로 필요한 함수를 얻어옵니다.

 

wsc파일에서 원어 스크립트를 추출하는 코드 예시
번역한 파일을 다시 wsc파일로 만드는 코드 예시

 

누더기 코드가 되었습니다만, 저만 사용할거니 잘 돌아가기만 하면 그만입니다.

코드에 대해 자세히 설명하지는 않겠습니다.

예시의 사진은 처음에 작동을 테스트해봤던 코드입니다.

작동이 되면 되는대로, 안되면 안되는대로 고쳐나가면 됩니다.

 

다만 여기서 약간의 중요한 포인트가 있다면,

파이썬에서 일어를 한글로, 다시 한글을 일어로 바로 바꾸려고 하니 문자 인코딩 문제가 발생하더군요.

그래서 인코딩할때는 헥스를 바이트로 변환해서 중간다리를 거쳐가는 방법을 택했습니다. 

 

추출 결과물 예시

 

많이 왔으니

했던 과정을 다시 정리해보겠습니다.

 

Rio.arc에서 wsc파일들을 추출했고,

각 wsc파일에서 텍스트 데이터만을 추출했고,

추출한 텍스트를 번역한 다음,

다시 wsc 형식으로 만들고,

wsc 파일들을 모아서

다시 Rio.arc로 만들어주면 됩니다.

 

글로 쓰니 길지만 단순한 분해와 재조립 과정입니다.

 

 

 

이제 실행파일만 수정해주면 됩니다.

 

 

OllyDbg를 사용합니다.

 

게임파일을 열었을 때의 모습

실행파일(exe파일)을 열어주고,
ctrl+n을 누르고 CreateFont 함수를 검색합니다.

 

엔터

 

 

하나 있네요. 다시 엔터.

 

 

함수에서 위로 올리면서 근처에 있는 80을 찾아서 81로 수정합니다.

createfont함수에서 charset값이 80이면 일본, 81이면 한국인걸로 알고 있습니다.

따라서 함수지점 근처에 80이라는 상수값이 있으면 charset(문자 인코딩)값일 확률이 높습니다.

수정하고 copy to executable → all modification → copy all → 우클릭 save file로 저장합니다.

 

 

이제 로케일 에뮬레이터를 사용하지 않고 게임을 실행시켜 한글이 잘 출력 되는지 확인하면 됩니다.

 

하지만 일본 윈도우가 아니면 실행이 안되게 막아놔서 한글로 실행이 안됩니다.

 

 

GetSystemID함수를 검색합니다.

 

 

근처에 11이라는 값이 보입니다. 12로 수정합니다.

GetSystemID함수는 윈도우 국가가 어디인지 검사합니다.

11이면 일본 12면 한국일겁니다.

 

 

수정하니 한글이 잘 나옵니다.

 

 

게임을 실행하면 처음에 나오는 박스

 

게임 실행시 나오는 dialogbox도 번역해줍시다.

 

에디터로 열어서 들어있는 선택지의 문장을 검색해서 직접 수정해줍니다.

주의해야할 점은 이때는 지정된 길이를 넘겨서는 안됩니다.

포인터를 수정하면 되긴 하겠습니다만 귀찮으니 적당히 맞춰서 번역합니다.

 

 

Resource Hacker를 사용해서 박스에 있는 문자들도 번역해줍니다.

 

잘 나옵니다.

 

 

 

 

 

결과물은 이렇습니다.

 

 

더 세부적인 내용들도 있지만, 실행해가며 디버깅을 하는 과정에 가깝고,

 

글의 취지에 맞게 기본적인 흐름은 어느 정도 설명이 되었다고 생각해

 

다음 글에서 스팀판의 경우를 예시로 좀 더 자세하게 적기로 하며 이만 줄이겠습니다.

 

 

 

댓글