사람들이 하도 한글날팀의 2ndG 한글화를 기대하는데 찬물끼얹는 것 같아 조용히 제 블로그에만 퍼다 올립니다. 한글화 방식에 대한 짤막한 정보도 있고 해서 킵해두려 합니다. 출처는 예~~~~전에 게임동아에 올라온 글을 펌질했습니다.
※ 2009. 1. 1. 수정 : 네 루머 또는 구라였네요~~ 어쨌든 다행입니다.원문 내용 보기
안녕하세요
몬헌 2nd 한글화 관련 글을 게재한 후 올려주신 여러분들의 글을 많이 읽었습니다. 몬헌 2nd 한글화가 이렇게까지 큰 파장을 일으킬 줄은 몰랐는데, 역시나 몬헌의 숨은 매니아 분들이 이곳 저곳 많이 계셨군요. ^^ 가장 논란이 되었던 문제가 몬헌 2nd 한글화 패치는 불법이냐 합법이냐에 관한 글이 가장 많았고 가장 민감하게 본 부분이기도 합니다. 변호사로 현직에 계신 분이 쓴 글도 많았고, 헌터스까페의 모회원님은 직접 법 조항을 올려주시기도 하셨네요. ^^ 저도 나름대로 인생을 적당히 살았고, 회사 생활을 하면서 법의 중요성을 알기에 주의깊게 읽어봤습니다.
한글화를 바라는 많은 분들에게는 정말 죄송한 얘기지만, 한글화 작업은 더 이상 진행하지 않기로 결정했습니다. 최근에 올라온 모 인터넷 게임잡지 기사글에서 있던 글처럼, 한글화하여 발매하지 않은 회사의 책임이냐, 불법으로 한글화를 진행하여 수익을 내지 못해 이어 지는 악순환이냐...는 말처럼 현재 이 상황이 누구의 잘못인지에 대해서 누구하나 명확한 답변을 내리기 힘들 것 같네요. 한글화 패치 스터디를 같이하고 싶어하는 지원해 주신 팀원분들께 죄송하다는 말씀을 전하고요.. 개인적으로 한글화를 해 보시고 싶으신 분들을 위해 제가 지금까지 분석한 내용을 공유하는 것까지가 제가 해 드릴 수 있는 전부인 것 같습니다. 정확하진 않지만 개인적으로 스터디하시기에 조금이나마 도움이 되셨으면 합니다. 죄송한 마음에 조금 자세하게 공유하도록 하겠습니다.
분석한 내용은 아래의 목차로 되어 있습니다.
1. 스트링 부문
1.1 몬헌 2nd에 저장되어 있는 스트링 포멧
1.2 UTF-8과 Unicode의 변환 방식
1.3 몬헌 2nd에 스트링이 저장된 영역
1.4 스트링 변환 시 유의점
2. PGF 폰트 부문
2.1 몬헌 2nd에서 폰트 불러 쓰는 방식
2.2 한글+숫자+영어+특수문자+(일어: 옵션) 폰트
2.2.1 Pgf헤더를 분석 후 Kor0.pgf 추가 방식
2.2.2 Tool을 이용하여 폰트 만들기
그럼 조금은 길 수 있는 분석 내용을 시작하도록 하겠습니다. 나름대로 힘들게 찾은 내용이네요. ^^;
1. 스트링 부문
1.1 몬헌 2nd에 저장되어 있는 스트링 포멧
몬헌 2nd에 저장된 모든 스트링은 Unicode의 인코딩 방식 중 하나인 UTF-8로 저장되어 있습니다. 일어,한문,한글 등 3바이트 저장을 기본으로 하고, Space(0x20), CR(0x0D), LF(0x0A), 영문,숫자 등 ASCII 값이 1바이트로 같이 저장되어 있기도 합니다. 저장된 영역은 부분부분 나눠져 있다가 보다 같은 종류끼리 모여 있으며 1.3에서 설명할 영역부분에 나눠져 저장되어 있습니다.
1.2 UTF-8과 Unicode의 변환 방식
Unicode를 인코딩하는 방법중의 하나가 UTF-8입니다. 저장에 사용될 바이트 수에따라 첫바이트의 상위 4비트에 값을 표시하고, 나머지 바이트의 첫 시작 비트는 10으로 시작하는 구조입니다. 즉, 한 Unicode를 저장할 때 3바이트가 저장될 경우 1110이 첫바이트의 상위 4비트에 들어값니다. 자세한 사항은 인터넷 검색하시면 아실 수 있으세요. ^^ 예를 들어 한글 ''말''이라는 문자의 Unicode는 "B9 D0"입니다. 이를 2비트로 나타내면 "1011 1001 1101 0000"이 되는데, 3바이트 UTF-8로 저장하기 위해서 3바이트로 저장될 것이니 처음에 "1110"이 붙고 나머지 "1011 1001 1101 0000"의 코드가 붙는데, 나머지 2바이트의 처음은 "10"은 붙어서 저장되게 됩니다. 즉 변환된 UTF-8코드는 "1110 1011 1010 0111 1001 0000"이 되어서 결국 "EB A7 90"으로 저장되게 됩니다. 다행히 이렇게 저장된 UTF-8데이터는 UltraEdit v13부터 안정적으로 보여주더군요. v12는 조금 불안하니 스터디 해 보실 분은 v13을 구해서 해 보세요. 참고로 UltraEdit에서 Hex와 Text변환 단축키는 Ctrl+H 키입니다.
1.3 몬헌 2nd에 스트링이 저장된 영역
몬헌 UMD에서 ISO로 떴을 때, 추출한 프로그램의 옵션에 따라 크기가 틀리겠지만, 제 파일의 경우 797MB(836,302,848 Byte)였습니다. 이 파일을 기준으로 저장된 스트링의 위치는 다음과 같습니다.
0x1260C305 ~ 0x12686D1A : 아이템, 무기, 방어구, 설명, 기본 문구 등
0x1812EBC8 ~ 0x1812FA68 : Download 관련 문구
0x1DDDEDC5 ~ 0x1E048C80 : 촌퀘/집퀘 설명 등
0x1E4B9E80 ~ 0x1E4F19D5 : 트레저 헌터 설명 등
현재 생각하기로 90%정도 스트링이 추출된 것으로 생각되는데, 추출한 알고리즘이 저장된 영역에서 UTF-8은 1110(E)가 첫바이트에 들어가므로 3바이트 단위로 E로 시작하는 데이터가 2개 이상이면 출력하도록 프로그램을 만들었습니다. 어느정도 영역이 나오면 E로 시작하는 영역을 출력해 보면 100%에 근접하는 스트링을 추출하실 수 있습니다. 구체적으로 아래 영역의 UTF-8 범위 및 1바이트 ASCII코드가 겹쳐서 사용하고 있었습니다.
0xE382A0 ~ 0xE383BF // Katakana
0xE38180 ~ 0xE3829F // Hiragana
0xE38080 ~ 0xE380BF // CJK Symbols and Punctuation
0xEFBC80 ~ 0xEFBFAF // Halfwidth and Fullwidth Forms
0xE4B880 ~ 0xE9BEBF // CJK Unified Ideographs
조금 더 정확히 추출하시려면 위의 영역을 사용하는 부분을 추출하시면 됩니다.
위의 ISO파일 내 스트링 저장 Offset은 대략적인 Offset이고 그 근방에 Ex xx xx Ex xx xx 등과 같이 E로 시작하는 3바이트가 연속해서 있으면 그 부분이 스트링 부분이라고 생각하시면 됩니다.
또한 일일이 모든 부분을 검사하지 않았지만, ISO파일 내의 저 영역을 따로 파일로 저장하면 스트링부분을 쉽게 얻을 수 있을 겁니다. 한글화 방법은 스트링 영역에 저장된 바이트 수만큼만 한글 데이터로 변환한 UTF-8코드로 수정해 넣으면 됩니다.
제가 한 방식은 해당 영역에서 각 스트링을 추출한 후(0x00 = NULL까지) 아래의 포멧으로 텍스트 문서를 출력시켰습니다.
"0x1260C305_009_???"
이런 식으로 출력된 Text파일을 UltraEdit로 열어서 한글로 아래처럼 수정했습니다.
"0x1260C305_009_회복약"
여기서 0x1260C305는 ISO파일 내 Offset이고 009는 저장될 Max Byte수 입니다. 이 수를 넘기면 Overflow가 발생해서 PSP가 멈추는 현상이 발생합니다.
이렇게 한글로 변경된 후 UTF-8로 저장하면 "회복약"에 맞는 UTF-8코드가 저장되게 되므로, 패치프로그램을 해당 Offset에 지정된 수의 바이트만큼 한글 UTF-8코드를 저장하도록 만든 후 실행하면 간편히 패치작업이 이루어 집니다. 프로그래밍을 조금만 하실 수 있는 분이시라면 쉽게 제작이 가능할 것 같습니다.
1.4 스트링 변환 시 유의점
스트링을 한글로 변환시켜 이미지 수정 후 게임을 진행할 때, 잘못된 데이터가 들어가 있으면 폰트 변환하는 부분에서 오동작을 일으켜서 PSP가 멈추는 현상이 발생합니다. PSP가 멈출때는 100% 잘못된 스트링 데이터가 들어가서 나타난 현상이며 다음의 경우 이상현상이 나타납니다.
- 기존에 일어로 저장된 바이트 수를 초과하여 저장될 경우
- 마지막에 항상 NULL문자(0x00)이 저장되어야 하지만 그 부분까지 UTF-8로 인식되어 저장될 때.(예: 마지막 부분에 EB A7 90 00으로 마지막 00이 들어가야 하지만 EB A7 90으로 00(NULL문자)가 들어가지 못한 경우)
초반에 위의 문제들로 멈춤현상이 잦았는데, 원본 길이만큼의 데이터를 알맞게 들어가도록 수정한 후 5성 진입까지 락업없이 잘 진행되었습니다.
스트링 추출후 보이는 ~C00, ~C01 등의 문구는 정확한 의미는 모르겠으나, 컬러 코드로 보여집니다.
2. PGF 폰트 부문
2.1 몬헌 2nd에서 폰트 불러 쓰는 방식
다행히 몬헌 2nd는 PSP내에 저장된 내장 폰트를 사용합니다. 이 방식이 아니었다면 한글화는 거의 불가능했을 것으로 사료됩니다. 몬헌 2nd는 PSP 기본 폰트인 Jpn0.pgf파일만 참조하여 해당 유니코드의 폰트를 출력하는 형태라서 Kr0.pgf가 PSP에 깔려있다 하더라도 한글로 변환된 UTF-8데이터를 치환해도 한글은 표시되지 않습니다. 한글을 표시하기 위해서 임시로 Kr0.pgf를 Jpn0.pgf로 이름을 바꾸어서 테스트하실 수 있습니다. 한글 저장된 UTF-8데이터가 Pgf폰트파일을 열어서 해당 Unicode에 맞는 폰트의 주소를 폰트파일에 있는 Table을 참조하여 읽어와서 표시하는 방식을 취하므로 한글만 표시되고, 숫자, 영어, 일어 등 Kr0.pgf에 저장되어 있지 않은 폰트는 전혀 표시가 되어있지 않습니다. 현재 공개된 TTF2PGF 툴을 사용하여 TTF포멧을 PGF로 변환하여 사용할 수 있는데, 소스 분석결과 Latin만 변환가능한 구조라서 사용할 수 없습니다. 현재 일어쪽 폰트도 사용가능 하도록 포럼에서 진행중이라고 하는데, 시간이 지나면 공개될 것 같습니다. 이를 이용해 일어+한글+숫자+영어+특수문자+한문 이 같이 저장된 TTF를 구해서 변환하면 모든 문자를 표시할 수 있습니다.
이는 현재 일어+한글+숫자+영문+특수문자가 저장된 PGF파일을 적용하여 한글 패치 버전을 테스트한 결과 모두 올바르게 표시됨을 확인했지만 PGF폰트 문제로 한글패치 뿐만 아니라 원본 일어 버전도 특정 부분에서 글자가 랜덤하게 바뀌는 문제가 발생해서 사용할 수가 없습니다. 폰트 부분의 개선은 꼭 필요하고 시간이 지나면 반드시 나올 것이라 생각됩니다.
2.2 한글+숫자+영어+특수문자+(일어: 옵션) 폰트
2.2.1 Pgf헤더를 분석 후 Kor0.pgf 추가 방식
PGF헤더를 분석해서 Kor0.pgf폰트를 Jpn0.pgf에 추가하는 방식으로 위의 폰트를 생성할 수 있습니다. 하지만 일어, 한글, 한문 폰트의 경우 Latin에 비해 뒤늦게 나온 폰트라 Latin의 헤더와 조금 차이가 나서 해외 포럼에서도 진행중이지만 아직 분석이 끝나지 않았다고 합니다. 분석한 자료가 날라가서 있는 자료만 공유하겠습니다.(Latin폰트 기준)
- 문자 개수: PGF파일의 0x14번지부터 4바이트
- Family Name: 0x35번지
- Style Name: 0x75번지
- 폰트에 저장된 Unicode 나열 주소: 0x1760번지
- PtrHeader의 최소 비트 수: 0x1C번지의 4바이트
- PtrHeader의 시작 주소: 0x4078번지
즉, Latin폰트 기준으로 0x1760번지부터 해당 폰트파일에 저장된 Unicode의 값들이 나열되어 있고, 실재 폰트 모양에 대한 데이터는 파일 마지막에 순차적으로 저장되어 있습니다. 해당 폰트 모양의 데이터를 찾기 위해 시작 주소가 Table에 저장되어 있어야 되는데, 이것이 PtrHeader입니다. 0x1C번지에는 각 주소값이 저장될 비트수가 저장되어 있는데, 예를 들어 1023개의 문자가 저장됐을 경우 2의 10승 1024로 저장할 수 있으므로 10이라는 값이 0x1C번지에 들어갑니다. 이 비트수를 이용해 0x4078번지부터 10비트씩 차곡차곡 해당 Unicode별 폰트 모양이 저장된 시작주소 번지로 Jump할 수 있는데, 그 값은 상대번지값이 들어값니다. 예를 들어서 전체 폰트모양의 크기가 첫번째 20바이트, 두번째 30바이트, 세번째 40바이트가 저장되었다면, 저장된 값은 0, 20, 50, 90 이런식으로 들어가게 됩니다.
PtrHeader에 저장된 값을 추출하기 위해선 PtrHeader에 저장된 16비트 Hex값을 순차적으로 LSB부터 MSB까지 계속해서 나열한 다음, 0x1C에 저장된 크기만큼 끊어서 해석하면 정확히 그 위치가 추출됩니다.
한글, 일어, 한문 폰트도 이와 같은 형태로 제공된다면 Unicode값 나열하는 부분에서 Jpn0.pgf에 한글 Unicode추가하고, 문자 개수와 이것저것 맞춰준 다음 Kr0.pgf의 한글폰트 모양을 가장 마지막에 붙이고 PtrHeader 뒤에 한글폰트 시작 주소를 넣으면 될 거라고 생각하고 시도를 했으나 아쉽게도 위의 폰트들은 Latin폰트 이후에 추가되어서 헤더도 틀리다고 합니다. ㅡ.ㅜ
폰트에 관심있으신 분은 해외 포럼을 통해서 자료를 참고하시면 가능하리라 믿습니다.
2.2.2 Tool을 이용하여 폰트 만들기
간단하게 Tool을 이용하여 폰트를 만드는 방식입니다. TTF2PGF가 한글,일어,한문도 지원되면 현재 많이 나와있는 한글+일어+영어+숫자+특수문자 TTF를 구해서 단순히 변환만 시키면 손쉽게 만들 수 있습니다. 꼭 TTF2PGF가 아니더라도 폰트관련 유틸리티를 잘 이용하면 한글이 포함된 폰트를 만드실 수 있을 것 같습니다.
여기까지 입니다... 몬헌 2nd를 사랑하는 유저로서 가타가나와 히라가나를 외울려고 시도도 여러번 해 봤지만 매번 실패하고, 수 많은 몬헌 매니아들이 한글화를 애타게 원했지만 매뉴얼만 달랑 한글화하여 발매한 상태에서 답답한 마음에 개인적으로 한글화를 시도해 봤습니다. 과연 한국에서 몬헌 2nd를 즐길만한 연령층 중에 몬헌에 나오는 일본어를 제대로 읽을 줄 아는 사람이 몇프로나 될까요... 저 처럼 몬헌의 아이템을 그림으로 인식하는 사람들이 많을텐데, 너무나 답답한 마음에 스터디를 시작했습니다. 몬헌 다음 버전에는 꼭 한글화가 되어 발매되서 많은 유저들이 편하게 할 수 있으면 하는 바램입니다.
한글화 얘기를 꺼내서 물의를 일으킨 점 죄송하게 생각하고, 완성하지 못한 채 그만두게 되어 다시 한번 죄송하게 생각합니다. 그래도 한글화에 뜻있는 분들을 위해 제가 지금까지 노력하여 분석한 내용을 최대한 자세히 적을려고 하니 이렇게 두서없는 글이 되어 버렸네요. 프로그래밍을 전혀 모르시는 분이시라면 많은 부분에서 의아해 하실 수 있겠지만 프로그래밍을 해 보신 분이라면은 어느 정도 전달이 되었다고 생각합니다.
그럼 이만 물러가도록 하겠습니다. (--)(__)
Posted by 모질이

