[한글화 강좌] 제 5장 - 포인터의 개념[한글화 강좌] 제 5장 - 포인터의 개념

Posted at 2011. 8. 29. 16:30 | Posted in 이전 카테고리/한글화 강좌 시즌 2
안녕하세요.
Hangeru 한글화 강좌 Season 2의 첫번째 강좌 게시물이군요 ^^;

이번 강좌에서는 포인터(pointer) 에 대해서 알아보겠습니다.








목차

포인터의 개념
게임 한글화에서의 포인터
포인터 찾기
    GBA(게임보이 어드밴스)
    PSP(플레이스테이션 포터블)
    GB(게임보이)

포인터의 개념

포인터는 사전적 의미로 무엇인가를 가리키는 것을 뜻하며 컴퓨터에서 사용하는 마우스 포인터, 프레젠테이션에서 사용하는 레이저 포인터도 화면의 무엇인가를 가리킬때 사용합니다.

이 포인터는 프로그램이나 게임에서도 같은 의미로 사용되는데 바로 데이터를 가리키는 주소값(번지)이라고 할 수 있습니다.
여기에서의 데이터는 대사, 그래픽, 프로그램 코드, 사운드 등 여러가지가 될 수 있겠지요.

포인터의 개념은 C언어 등에서도 필수적으로 배우는 부분이며 포인터에 대해 알면 게임 한글화에도 많은 도움이 됩니다.

그럼 포인터 값이 어떻게 저장되는가 알아보면...
컴퓨터나 게임기 등에서는 메모리나 저장장치에 주소를 부여하고 그 주소를 통해서 데이터를 불러옵니다.


위 그림을 보시면 안녕하세요 라는 대사는 0x100 번지에 저장되어 있습니다.(앞에 0x가 붙으면 16진수 라는 의미) 따라서 안녕하세요 라는 대사의 포인터 값은 0x100이 됩니다.(게임에 따라 포인터를 저장하는 방식이 다릅니다. 게임 별 포인터 구조는 하단에서 다룹니다.)

게임 한글화에서의 포인터

그럼 게임 한글화에서는 포인터가 어떻게 사용될까요?
게임 한글화를 도전해보신 분들이라면 대사 공간이 부족해서 대사 줄이기가 필요한 경우가 있으셨을 겁니다.
이는 포인터에 있는 번지의 저장 공간이 제한되어 있거나 뒤쪽에 데이터가 있어서 넘어가면 안되기 때문인데 이럴 때 포인터를 변경하면 쉽게 한글화를 할 수 있습니다.

100평짜리 창고가 있다고 예를 들어봅시다.
이 100평 짜리 창고에는 17인치 모니터가 50개, 21인치 모니터가 50개 들어있습니다.
그리고 이번에 17인치 모니터를 모두 빼내고 27인치 모니터를 50개 넣으려고 합니다.
하지만 이 창고에는 17인치 모니터가 50개 들어갈 공간밖에는 남아있지 않습니다.
이럴 때는 다른 창고에 모니터를 넣어야겠지요?

한글화에서도 마찬가지입니다.
히라가나/가타카나를 1바이트로 사용하는 게임에서  "ありがとう"라는 대사가 있다면 한글로 "고마워"라고 입력해야하는데 일본어는 총 5바이트이고 한글은 각각2바이트 총 6바이트가 되어 1바이트 공간이 부족하군요. 이럴 때에 대사 위치를 다른 곳으로 옮기고 포인터 값을 수정해주면 대사를 줄일 필요 없이 한글화가 가능하게 됩니다.

포인터 찾기

게임에서 실제로 대사, 폰트, 포인터를 찾는 건 구조가 게임마다 다르므로 강좌만 보고는 알 수 없는 부분입니다. 하지만 하드웨어 특성에 따라 게임기 별로 자주 사용되는 포인터 방식이 있습니다.
이번 강좌에서는 이 자주 사용되는 포인터 방식 몇가지를 소개해드리겠습니다.

GBA(게임보이 어드밴스)
게임보이 어드밴스는 포인터 찾기 쉬운 게임 기기 중 하나입니다.
게임보이 어드밴스에서는 카트리지에서 데이터를 불러올때 카트리지 주소값에 [0x8000000]을 더해서 불러옵니다.
즉 롬파일의 0x100 번지의 값을 불러올때 실제로는 0x8000100 의 값을 불러오는 것이지요.
따라서 GBA의 포인터 값에는 실제 주소값에 [0x8000000]이 더해져 있습니다.
그리고 데이터는 모두 바이트 플립되어 있으므로 [0x100]의 포인터 값을 찾으려면 [0x00010008] 으로 검색하면 됩니다.

그럼 실제 게임에서 찾아 보겠습니다.
예제는 포켓몬스터 에메랄드 일본어판 입니다.
(모든 GBA 게임이 아래와 같은 포인터 구조를 사용하는 것은 아니며 게임 내에서도 여러가지 포인터 구조를 사용하기도 합니다.)



대사 いや- おまたせ おまたせ!를 롬 파일을 열어 찾습니다.
 

대사의 주소값은 0x277095 이군요.
그렇다면 이 값에 0x8000000 을 더하고 바이트 플립시키면 포인터 값은 0x95702708 이 됩니다.

95702708으로 검색하면 포인터가 나옵니다.

대사 공간이 부족해서 다른 곳으로 옮기려면 새로운 공간에 대사를 입력하고..

새로운 주소값인 0x08915900을 바이트 플립해서 입력한 뒤..

게임을 시작하면 짜잔! 대사가 바뀐 것을 보실 수 있습니다.

PSP(플레이스테이션 포터블)
강좌 준비중입니다...

GB(게임보이)
강좌 준비중입니다...
//

[게임 한글화 특별 강좌]NFTR 폰트에 대해 알아보기! 제 1편[게임 한글화 특별 강좌]NFTR 폰트에 대해 알아보기! 제 1편

Posted at 2011. 5. 18. 01:27 | Posted in 이전 카테고리/한글화 강좌 시즌 1
오랜만에 쓰는 한글화 강좌입니다~

NFTR 폰트에 대해 궁금해 하시는 분들이 많아서 특별 강좌를 작성합니다.


추천은 블로깅에 큰 도움이 됩니다!
손가락 한번 꽉 눌러주세요!


본편에서도 말씀드렸듯이 NFTR 폰트는 Nitro FonT Resource의 약자로 닌텐도 DS SDK(닌텐도 DS 게임 개발 키트)에서 제공하는 표준 폰트 방식입니다.

따라서 개발자가 닌텐도 DS SDK 표준을 따른다면 NFTR 폰트를 사용할 것이고 그렇지 않다면 다른 폰트를 사용하게 됩니다.

그렇다면 NFTR 폰트는 어떻게 이루어져 있는가 알아봅시다.

NFTR은 폰트 헤더, 파일 정보 헤더, 폰트 이미지, 폰트 너비, 폰트 맵(테이블) 총 5가지 영역으로 구성되어 있습니다.
(다만 같은 영역이 여러개 존재합니다.)
폰트 헤더 영역에는 각 영역의 위치 정보와 파일 크기, 헤더 크기, 파일 갯수등의 정보가 들어있습니다.

NFTR 폰트의 헤더 영역입니다.

NFTR 파일임을 알려주는 RTFN 매직스탬프(바이트 플립이므로 거꾸로하면 NFTR)와 코드가 들어있고 파일의 크기와 헤더 크기, 포함된 파일 갯수 등의 정보가 들어있습니다.

NFTR 폰트는 단순 파일이 아니라 여러가지 파일이 패키징 되어있는 형태입니다.
즉 파일 정보 헤더, 폰트 이미지, 폰트 너비, 폰트 테이블등이 모두 별개의 파일이지만 패키징 되어 하나처럼 보이는 것입니다.

또한 모든 값인 바이트 플립(Byte Flip)화 되어있는데 바이트 플립이란 데이터를 거꾸로 배열하는 것을 말합니다.
즉 0x00 0x30 0x25 0x10 이라는 값이 있다면 0x10 0x25 0x30 0x00 이렇게 바이트 단위로 잘라 거꾸로 저장하게 됩니다.
이유는 컴퓨터가 데이터를 읽을 때의 방식 때문이지만 자세히 설명하지는 않겠습니다.

다음은 파일 정보 헤더를 보겠습니다.

정보 파일은 FNIF(바이트 플립이므로 실제로는 FINF, File Information)로 시작하며, 각 데이터 영역의 위치와 기본적인 폰트 정보가 들어있습니다.
(0x1E-0x1F는 출력시 실제 폭과 색상에 관한 데이터 같으나 확실하지는 않습니다.)
폰트 이미지 데이터의 값이 0x34, 0x00 , 0x00, 0x00 이므로 거꾸로하면 0x00000034(0x34)가 됩니다.
단 실제 위치는 각 데이터 값에서 0x08 만큼을 빼주어야합니다.
0x34 - 0x08을 하면 0x2C가 되고 0x2C의 데이터를 보시면 PLGC라는 값이 보이는데 이것이 바로 이미지 데이터의 헤더입니다.

물어보신 분들이 정확히 어느 부분이 궁금하신지 몰라서 우선 1편은 여기에서 끊도록 하겠습니다.
이 부분까지 이해하셨다면 뒤부터는 이해하기 쉬운 편이므로 추가로 궁금하신 사항이 있으신 분들은 댓글 남겨주시기 바랍니다.

뒤 강좌는 이후 남기도록 하겠습니다.

//