teamhpd/PSP한글화강좌

puttysitesmileyssuteneteamhpd teamhpd/PSP한글화강좌

PSP 한글화 강좌 - 용사 주제에 건방지다
한글날 팀 강좌입니다.



1 소개


안녕하세요. 한글날입니다.
여기저기 기웃거리다 보니 PSP 한글화 강좌에 목말라 하는 분들이 제법 많으시더라구요. 그래서 도움이 될까 싶어 적어봅니다.

용사 주제에...를 한글화 강좌의 소재로 선택한 것에는 다음과 같은 이유가 있습니다.
  1. 롬의 용량이 작다.
  2. 폰트와 이미지, 텍스트 등이 모두 별개의 파일로 존재한다.
  3. 게임 자체 폰트와 PSP 내장 폰트 모두를 사용한다.
게임 자체 폰트라 함은 DS나 GBA 등의 게임에서 쓰는 그것을 의미합니다. PSP는 자체적으로 내장 폰트를 가지고 있습니다. 자체 폰트를 지니지 않고 PSP 내장 폰트를 이용하여 글을 출력하는 게임들도 많습니다.


본 강좌에서는 CrystalTile2와 WinHex Ver.14를 사용하겠습니다.

WinHex는 편집한 파일을 롬파일에 다시 덮어쓸때에만 사용하는 것이니 다른 대체 프로그램을 사용하여도 좋습니다.
PSP 롬파일의 확장자는 .iso로서 일반적인 CD/DVD 이미지파일인 iso와 읽는데 호환이 되니, 대몬과 같은 가상시디 프로그램을 이용하여 마운트한 뒤에 탐색하면 편합니다.


2 이미지파일

많은 게임에서 이미지 파일을 indexed-color 방식으로 저장하여 사용합니다. ㅡ4bpp이니 8bpp이니 이런 말을 사용하며, 팔레트의 색을 불러와서 출력하는 방식을 말합니다ㅡ 언뜻 생각하기에 팔레트에서 색을 불러와서 출력하는 것이니 속도에 불리하지 않을까 싶기도 하지만, 대부분의 GPU들은 이런 방식을 하드웨어적으로 지원하기 때문에 불리함이 없습니다. 용량 면에서 획기적인 장점을 가지니 더욱 단점을 가릴 수 있지요.

PSP 의 GPU는 기본 처리 단위가 16x8바이트의 블럭입니다. 그래서 PSP 게임에서는 대부분이 16x8바이트 블럭들로 구성된 이미지 파일을 가집니다. 8bpp 일경우에는 너비 16, 높이 8인 블럭들로 구성되고, 4bpp일 경우에는 너비 32, 높이 8인 블럭들로 구성됩니다. 블럭화되지 않은 이미지도 가끔 있습니다만, PSP에서 이미지를 찾을 때는 위 두가지 경우를 우선으로 설정하여 찾으면 좋습니다.

하지만 용자 주제에...에는 블럭화되지 않은 이미지 파일만 있군요.

크리스탈타일2를 이용하면 간단히 편집이 가능하니 예제는 생략하겠습니다.
용사 주제에...에 사용하는 모든 이미지 파일의 확장자는 .gim입니다.


3 폰트

용사 주제에...는 NDS에서 그러하듯이 폰트파일이름이 매우 친절합니다.
umd0:/PSP_GAME/USRDIR/data/font 폴더에 font.gim과 font.fnt 파일이 있습니다. 전자는 글꼴이 그려진 비트맵이고 후자는 비트맵에 있는 글자들을 등록하는 파일입니다.

3.1 폰트 비트맵 수정

크리스탈타일을 이용하여 font.gim을 아래와 같이 수정하였습니다. 카타카나 부분을 한글 독음으로 수정한 것입니다.
00_font_mod.jpg


font.gim의 LBA값은 0x54B0입니다. 이를 물리적 주소로 바꾸기 위해서는 클러스터 하나의 크기를 곱해주면 되는데 PSP의 롬에서는 0x800바이트이고, 이를 곱하면 0x2A58000입니다.
(디스크에 파일을 저장할 때 바이트 단위로 저장하지 않고 클러스터라는 수백~수천바이트 짜리 블럭 단위로 저장합니다. LBA는 디스크에서 해당 파일의 시작 클러스터 번호를 의미합니다.
LBA값은 UMD_GEN 프로그램을 이용하여 확인할 수 있습니다. UMD_GEN으로 롬파일을 열고 File메뉴에서 File List > Export를 선택하여서 목록 파일을 만들어서 메모장으로 열고 파일이름으로 검색하면 파일이름 왼쪽에 나오는 10진수 숫자가 그 파일의 LBA값입니다)

WinHex를 실행하여 롬파일을 열고 Alt + G키를 눌르고 위 주소를 입력하여 이동합니다.
font.gim을 열어서 Ctrl + A키 입력으로 전체 선택, Ctrl + C키 입력으로 복사하고
롬파일의 0x2A58000번지에 커서가 깜빡이도록 한 뒤에 Ctrl + B키 입력으로 붙여넣습니다.
두번의 대화창이 뜨는데, 첫번째는 0x2A58000번지에 클립보드의 내용을 붙여넣겠냐는 것이고, 두번째는 실행취소와 관련한 것입니다. 올바로 붙여넣었다면 아래와 같이 블럭지정이 되고 글자 색깔이 바뀝니다.

002_font_gim_written.jpg



Ctrl + S키입력으로 저장한 뒤 롬을 실행하면, 카타카나가 나올 부분이 한글로 바뀌어 나오는 것을 확인할 수 있습니다.

snap000007.jpg


snap000008.jpg



3.2 글 수정

우선 폰트를 아래와 같이 수정합니다.

003_font_mod2.jpg


용사 주제에...는 Shift-JIS 코드로 글을 저장합니다. "마", "왕"으로 수정한 곳은 ぁ와 あ이며, Shift-JIS에서 이들은 각각 82 9F, 82 A0에 해당합니다.
크 리스탈타일2로 umd0:/PSP_GAME/USRDIR/data/zukan/zukan.fbe 파일을 엽니다. 그리고 아래와 같이 "한국어"라고 적힌 곳을 클릭하면 알려진 코드페이지를 선택할 수가 있는데 Shift-JIS를 선택합니다.

004_codepage_1.jpg



아래로 내려보면 이와 같이 일문의 글들을 발견할 수 있습니다.
005_maou_found.jpg


조금전에 마와 왕에 대응해놓은 ぁ와 あ에 해당하는 82 9F, 92 A0으로 수정하였습니다.
006_string_changed.jpg


zukan.fbe의 LBA값은 0xAEF0입니다. 롬파일에 적용한 뒤 실행합니다.
아래와 같이 보입니다.
snap000009.gif

snap000010.jpg


그런데 위에는 기존의 폰트와는 다른 모양의 글씨들이 나타납니다. 바로 처음에 언급한 바 있는 내장 폰트를 이용하여 출력한 것들입니다.


4 JIS2UCS 매핑 테이블

4.1 설명

PSP용 일본 게임들의 대부분은 용사 주제에...와 마찬가지로 문자코드로서 Shift-JIS를 사용합니다. 저장 매체의 크기가 여유롭다 보니 고유코드를 만들어가면서까지 여유 공간 확보를 할 필요가 없어서인듯 합니다. (물론 스X어에닉스처럼 소신 있는 제작사도 있지요)
그런데 PSP가 가진 내장 폰트는 유니코드에 대응합니다. Shift-JIS로 쓰인 글을 내장 폰트를 이용하여서는 바로 출력할 수가 없다는 의미죠.
여기에서 JIS2UCS 매핑 테이블이 등장합니다. Shift-JIS로 쓰인 글자의 코드값을 테이블에 넣으면 해당 글자의 유니코드값을 얻을 수 있고 이를 통해 내장 폰트를 이용하여 글자를 출력할 수 있게 되는 겁니다.
그런데 JIS2UCS 테이블의 이름에서 보듯이 입력값은 JIS(JIS X 0201) 값입니다. Shift-JIS를 바로 쓸수가 없지요. 다행히 JIS와 Shift-JIS는 간단한 계산으로 상호변환이 가능합니다.
(왜 Shift-JIS를 바로 쓰지 않고 JIS로 변환해서 쓰는지는... 아마도 Shift-JIS는 00 00에서 EF FC까지 사용하지만 JIS는 74 26까지 사용하므로 범위가 좁아 공간 이용에 장점이 있어서가 아닌가 싶습니다)


눈치채셨습니까?
Shift-JIS 값을 넣으면 그것에 해당하는 유니코드값이 나오는 테이블이니. 테이블을 수정하면 일문 Shift-JIS 값이 일문 유니코드 값을 가리키지 않고 전혀 다른 한글 유니코드 값을 가리키도록 할 수 있게 됩니다.
잔다르크 한글화가 이 방식을 이용하여 PSP 내장폰트를 사용합니다.


Shift-JIS에서 JIS로 변환하는 계산식
-첫번째 바이트를 c1, 두번쨰 바이트를 c2라고 부르며, 식에 등장하는 모든 숫자는 16진수입니다.
1. c2가 0x7F보다 크면 1을 뺀다.
2. 1번값이 9E보다 작으면 1, 아니면 0
3. 2번값이 1이면 1F를, 0이면 7D를 1번값에서 뺀다.
4. c1이 9F 이하이면 70을, E0 이상이면 B0을 c1에서 뺀다.
5. 4번값에 2를 곱한 뒤 2번값을 뺀다.
6. c1에 5번값, c2에 3번값을 대입한다.


JIS에서 Shift-JIS로 변환하는 계산식
1. c1이 5F보다 작으면 70, 아니면 B0
2. c1에 1을 더한 후 2로 나누고, 1번값을 더한다.
3. c1이 홀수이면 1F, 아니면 7D를 c2에 더한다.
4. 3번값이 7E보다 크면 1을 더한다.
5. c1에 2번값, c2에 4번값을 대입한다.


4.2 수정

앞에서 ぁ와 あ에 마와 왕을 대응시켰습니다. JIS2UCS테이블을 수정하여서, Shift-JIS의 ぁ와 あ가 유니코드 마와 왕에 대응하도록 수정해보죠.
용사 주제에...는 참 친절합니다. JIS2UCS테이블이 별개의 파일로 나와 있으며 파일 이름 또한 jis2ucs.bin입니다. umd0:/PSP_GAME/USRDIR/data/font/ccc 폴더에 있습니다.

위의 Shift-JIS에서 JIS로 변환하는 계산식에 따라서 82 9F와 82 A0를 값으로 하는 ぁ와 あ는 각각 JIS의 24 21, 24 22에 해당합니다. JIS2UCS 테이블에서 24 21에 해당하는 곳으로 갑니다. Shift-JIS나 CP949(윈도우에서 사용하는 완성형 한글코드)에서는 첫번빼 바이트가 높은 자리입니다. 따라서 24 21은 0x2421에 해당하고, UCS(유니코드)는 한글자가 16비트(2바이트)인 문자체계이므로 0x2421에 2를 곱하면 ぁ의 유니코드값이 있는 주소가 됩니다.
007_ucs_a_found.jpg


여기가 찾고자 한 곳입니다. 그런데 좀전에 Shift-JIS로 코드페이지를 바꿀 때를 기억합니까? 거기엔 유니코드도 있었지요.
008_ucs_a_found_codepage.jpg


ぁ와 あ의 값이 41 30, 42 30으로 되어 있습니다. UCS(유니코드)는 높은 자리의 바이트가 뒤쪽에 나타납니다. 즉 41 30은 순서가 바뀌었다는 뜻이죠. 0x3041이 바로 ぁ에 대응하는 유니코드값입니다.
위 두 값을 마와 왕에 해당하는 유니코드값으로 수정하겠습니다. 마와 왕은 유니코드로 각각 0xB9C8, 0xC655입니다. 순서를 거꾸로 하여서 C8 B9 55 C6으로 수정합니다.
009_ma_wang_modified.jpg


그리고 zukan.fbe에서 PSP 내장 폰트로 출력되던 글귀를 ぁ와 あ에 해당하는 Shift-JIS값인 82 9F 82 A0으로 수정합니다.
010_changed_to_a_a.jpg


저장하고 롬을 실행하면 이렇게 출력이 됩니다. 단 이 경우에는 우리 팀에서 소개한바 있는, jpn0.pgf에 한글 글꼴을 추가한, 소위 말하는 몬헌폰트라는 것이 설치된 PSP에서만 한글을 확인할 수 있습니다.
snap000011.jpg



5 주저리

이렇게 PSP용 한글화 강좌를 대충이나마 끝냈습니다. 강좌라는 것을 처음 쓰다 보니 흐름이 좋지 않은 부분이 있을지도 모르겠습니다. 설명을 빠뜨린 부분이나 없었으면 좋겠네요.
2장 이미지수정에서 용사 주제에...에 블럭화된 이미지를 찾을 수 없다는 점에서 적잖이 당황했네요.
3장 폰트에서 테이블표라는 것을 만들지 않았지요. Shift-JIS이므로 읽을 때 테이블표가 그다지 필요하지 않기 때문입니다. 테이블표 작성을 원한다면 맨 마지막의 특별부록을 읽어보세요.

HEX에디터와 계산기, 그리고 가장 중요한 근성만 있다면 한글화에 불가능은 없습니다. (심지어 압축조차도... 물론 이 경우에는 어마어마한 크기의 근성을 요구하겠지만요)

초보자가 이것만 읽고 따라하기에는 강좌에 구멍이 많습니다. 하지만 GBA 한글화 강좌를 읽어 본다면 많은 차이가 없다는 것을 느낄 수 있을 겁니다.
화이팅입니다.


특별부록 font.fnt
첫번째 4바이트는 등록된 글자 수이고 그 다음부터 이어지는 11바이트나 10바이트 블럭이 첫 4바이트 값만큼 나타납니다.
블럭의 첫번째 1바이트는 글자의 바이트 수를 의미하며 바로 다음에 그만큼의 Shift-JIS 코드값이 나타납니다.
그리고 이어지는 2바이트 네 개는 폰트맵에서의 left, top, width, height가 되지요.
ID
Password
Join





- 전 이런 놈입니다.

격언> 문제를 해결하는 첫걸음은 그것을 누군가에게 털어놓는 것이다. (존 피터 플린)

Recent Changes

D  Echoes Of War(The... @ 2012-05-18 [03:44 pm] by windlesszone
D  Diablo3 @ 2012-05-15 [04:49 pm] by windlesszone
D  Diablo3/story/wizard @ 2012-05-15 [04:48 pm] by windlesszone 4 changes
D  Diablo3/story/wit... @ 2012-05-15 [04:16 pm] by windlesszone
D  Diablo3/story/monk @ 2012-05-15 [04:14 pm] by windlesszone





Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2012-05-07 09:53:19
Processing time 0.1068 sec