위에서 보다시피 텍스트 파일로 되어 있습니다.
대사는 Shift-JIS 코드를 사용하고 있으며, 제어코드 +가 메세지 표시, "가 선택지 시작, '과 ( 등이 선택지 대사, >가 선택지 갯수, #과 $ 등이 해당 선택지를 눌렀을 경우 파일 내에서 이동할 오프셋 주소값을 나타낸다는 것을 알 수 있었습니다.
(즉, 포인터입니다.)
그리고, 포인터가 파일 중간에 위치해 있으므로 대사 길이를 변경할 때마다 오프셋 값들을 모두 바꿔줘야 하는 불편함이 있습니다.
(이건, 프로그램을 돌려서 재조정을 해주는 것이 효율적입니다.)
다음은, Lovegun사의 Ace of Spades라는 게임의 스크립트 파일입니다.
파일 확장자는 S로 열어보면 다음과 같습니다.
분석을 해본 결과...
처음에 나오는 2바이트는 헤더 크기(4바이트)를 제외한 데이터 전체 크기값을 나타냈고, 다음 2바이트는 전체 줄 수를 나타냈습니다.
그 다음부터 괴상한 문자들로 도배가 되어있는데, 이건 Shift-JIS 코드에 특정한 공식을 대입해서 변환시킨 형태입니다.
(Shift-JIS값 81 40이 21 21로, 81 41이 22 21로 바뀌거나 하는 식...)
각 대사는 00으로 구분하고 있으며 파일 끝부분은 B1 0D로 표시하고 있습니다.
저 코드 부분의 변환을 제외하곤 그리 한글화하기 어려운 편은 아닙니다.
다음은, Mugen에서 제작한 호니스위퍼라는 게임의 스크립트 파일입니다.
Mugen에서 내놓은 호니스위퍼 시리즈는 TGL사의 파랜드스토리 시리즈에서 사용한 시스템을 그대로 사용하고 있기 때문에 스크립트 구조도 동일합니다. 파일 확장자는 MSG로 열어보면 다음과 같습니다.
얼핏 보면 무척 복잡해 보이지만 사실은 간단한 구조입니다.
에디터 상에서 00값을 0D 0A로 일괄변환을 시켜주면 다음과 같이 됩니다.
텍스트 파일이네요?
대사는 Shift-JIS 코드로 되어있고, 대사 앞에 있는 ja, he 등은 게임상에서 각 캐릭터의 이름으로 대체되어 표시됩니다.
k는 해당 줄이 해당 대사창에서 마지막 줄이라는 의미입니다.
또한, 반각문자를 사용할 수 있고, 대사 길이 변경이 용이합니다.
대사를 수정한 후, 0D 0A를 다시 00으로 바꿔주면 되겠습니다.
(뭐, 그냥 헥스창 상태에서 수정해도 됩니다만...)
마지막으로, Parsley사의 RE-NO라는 게임의 스크립트 파일입니다.
파일 확장자는 TXB로 스크립트 파일을 모아놓은 아카이브 형태입니다. 열어보면 다음과 같습니다.
앞에 헤더가 있는데 512(200h)바이트로 되어 있습니다. 첫번째 바이트는 첫번째 텍스트 블록의 시작 오프셋을 나타냅니다. 그 다음 4바이트마다 다음 텍스트 블록의 시작 오프셋을 나타내는데 00 00 00 00이 아닌 마지막 오프셋 값은 파일 끝의 오프셋을 의미합니다.
IBM PC 계열은 숫자 데이터를 저장할 때에 역순으로 저장합니다. 때문에 00 00 02 00으로 저장되어야 할 값이00 02 00 00으로 저장이 됩니다.
각종 포인터 관련한 수정 시에 이 점을 주의할 필요가 있습니다.
위에서 바이트값을 표시할 때 쓰인 것은 16진수인데, 16진수는 2진수 표기를 축약시켜 놓았다고 보면 됩니다.
1바이트당 00h~FFh(0~255)의 값을 표현할 수 있습니다. 오프셋값의 16진수 표현은 윈도우 내장 계산기의 기능을 이용하면 편리합니다.
뭐, 이에 대한 설명은 이정도로 하고...
FLZ0이라는 부분이 있는데 이건 해당 블록의 데이터가 압축되어 있다는 의미입니다. 이 게임에서는 LZ계열 압축을 사용하고 있습니다.
그 다음 2바이트는 압축을 해제했을 시의 블록 크기를 의미하고, 다음 2바이트는 압축된 상태의 블록 크기를 의미합니다.
데이터가 압축되었기 때문에 중간중간 알아먹을 수 있는 것도 있지만 대부분은 알아먹을 수가 없습니다.
이것의 압축을 해제한 상태를 보기로 합시다.
압축을 풀면 다음과 같이 됩니다.압축을 푸니까 대사가 Shift-JIS 형태로 되어있는 것을 알 수 있습니다.
각 텍스트 블록은 역시 헤더를 가지고 있으며, 헤더의 첫번째 2바이트는 전체 줄 수를 의미하고 그 다음부터 줄수*2만큼 각 줄의 시작 오프셋값이 나열되어 있습니다.(이 오프셋값은 각 텍스트 블록의 시작위치를 0으로 하는 상대좌표값입니다.)
각 줄의 대사는 00으로 끝나도록 되어 있습니다.
압축이 되어있는 것을 제외하면 그리 복잡한 구조는 아니라고 볼 수 있습니다.
이상으로 열거해 보았고... 이 게임에서 쓰인 압축에 대해 간단히 알아보면...
LZ계열 압축은 사전을 통한 압축입니다. 파일을 읽으면서 사전에 없는 데이터는 사전에 등록시키고 사전에 데이터가 있을 경우는 사전에 있는 데이터 중에서 가장 긴 형태를 찾아서 그 데이터의 오프셋과 길이 값으로 대치시켜서 압축을 시키는 방식입니다.
LZ계열 압축은 수 많은 변형이 있는데 이 게임에서 사용된 것은 포인터와 데이터의 구분에 플래그값을 사용하는 LZSS라는 방식입니다.
LZSS 방식은 데이터의 첫 바이트가 항상 00 또는 FF로 시작합니다. 왜냐하면 처음에는 사전이 비어서 사전으로부터의 참조를 할 수 없기 때문입니다.
00 또는 FF는 사전을 참조하는 포인터가 없이 데이터로만 구성되어 있음을 의미합니다.
플래그값은 1바이트로, 총 8비트로 되어있기 때문에 플래그값 다음에 올 수 있는건 포인터와 데이터를 합쳐서 8개 까지입니다.
데이터는 1바이트, 포인터는 2바이트로 구성되어 있습니다.
플래그값의 각 비트값을 체크하여 1일 경우 데이터, 0일 경우 포인터(또는 그 반대...)로 인식하여 데이터를 읽게 됩니다.
포인터의 구조를 분석하면 사전상에서의 오프셋 값을 표시하는 데 12비트, 복사해 올 길이를 표시하는 데 4비트를 사용하고 있습니다.
오프셋 값에 12비트를 사용하고 있으므로 총 0~4095까지의 값을 사용할 수 있어 사전의 최대 크기는 4096바이트가 됩니다.
길이값에 4비트를 사용하고 있으므로 총 15개까지 지정할 수 있을 것 같지만 압축 효율상 최소 3바이트 일때만 포인터 형태로 변환하므로 실제로는 3~18바이트를 의미합니다.
사전은 압축되지 않은 데이터가 발견될 때마다 데이터가 추가되며, 사전에 데이터가 가득 찼을 경우에는 사전의 시작 오프셋의 포인터가 앞으로 이동하게 됩니다. 그리고 시작 오프셋 이전의 데이터는 의미를 잃게 되며 새로 변경된 오프셋이 사전의 시작 오프셋인 0으로 설정됩니다.
뭐, 설명은 대충 이정도로 하겠습니다.
이것으로, 한글화 강좌는 여기서 마무리 짓도록 하겠습니다.
만약 범용툴을 사용해서 한글화를 할 경우라면 크리스탈 타일2를 써보세요. 대사장보다 사용하기 편리한 것 같습니다.(한식구 카페에 가면 구할 수 있습니다.)
'한글화 강좌' 카테고리의 다른 글
#05 자주 쓰이는 도스 명령어 일람 (0) | 2012.10.04 |
---|---|
#03 대사파일 분석 (0) | 2012.09.17 |
#02 한글화를 위한 준비와 과정... (0) | 2012.09.11 |
#01 HDI 파일을 생성해보자. (2) | 2012.09.10 |