본문 바로가기
GAMES/게임 주저리

어셈블리 수정 없이 1바이트 폰트에서 조합형 한글 사용하기

by NSM53 PROJECT 2009. 7. 27.

 

1바이트 폰트를 사용하는 게임은 0x00~0xFF 256개라는 글자수 제한 때문에 한글화에 어려움이 있습니다. 완성형 글자는 2350개이고 일반적으로 사용하는 글자수가 1000자 내외임을 감안해도 많이 부족한 숫자입니다. 어셈블리로 확장을 하면 해결되는 문제이지만 프로그래밍을 모르는 사람 입장에선 난감한 문제일 수밖에 없습니다. 프로그래밍을 알아도 리버스 엔지니어링에 도통하지 않다면 역시나 어려운 문제죠.

하지만 한 가지 방법이 있기는 합니다. 바로 윈도용 3벌식 폰트(직결식)의 방법을 응용하는 겁니다. 그런데 가장 중요한 선결 조건이 있습니다.

가변폭을 지원하는 폰트일 것.

좀더 정확히는 좌표의 x축을 움직일 수 있는 폰트인데 경험적으로 가변폭 폰트면 99% 좌표값을 조정할 수 있습니다.

위의 스크린샷처럼 고정폭인 경우에는 불가능합니다. 주로 8x8 폰트를 사용하는 게임들이 그렇습니다. 

가변폭 폰트를 사용하는 게임이라면 영문판이든 일문판이든 상관없이 공병우 박사님의 3벌식을 윈도 폰트로 구현한 직결식을 응용할 수 있습니다.

이곳에 직결식에 관한 글이 있으니 참고하시면 좋을 겁니다.

자 각설하고, 핵심은 초성, 중성, 종성을 각각 만들고 x축 위치값을 조절해 글자가 겹치게 만드는 겁니다. 그러니까 글자는 그대로 두고 글자의 위치값을 - 로 만들어서 겹치는 거죠. x축을 -만큼 이동시킨다는 개념입니다.

 

▲ 윈도용 직결식 폰트를 폰트 에디터로 열어 본 모습

게임 한글화는 특수한 경우를 제외하고는 대부분 입력이 필요없기 때문에 위 스크린 샷의 배열을 그대로 사용할 필요는 없으며 윈도용 직결식 폰트와 달리 받침의 유무에 따라 폰트를 따로 만들어 주면 완성형 폰트처럼도 구현이 가능합니다. (아, 이름을 입력하는 경우가 있긴 하군요...)

실제로 PC 게임인 모로윈드, 오블리비언, 폴아웃3가 이러한 방법을 응용해 한글을 구현했습니다.

간혹 확장 아스키 코드 영역을 사용 못하는 게임도 있기는 하지만 완성형 폰트처럼 만들 것이 아니라면 60여 글자로도 가능은 합니다.

그럼 설명만 할 게 아니라 직접 보여드리겠습니다.

샤이닝 포스1 영문판입니다. 보이는 것처럼 가변폭입니다. 대사 부분이 허프만 압축으로 되어 있는데 일반적인 허프만 알고리즘으로는 풀리지 않더군요. 좀 더 찾아봤더니 멀티플 허프만이라나 뭐라나... 

 

어차피 테스트를 위한 것이니 전부 수정할 필요는 없고 'MNO You' 만 수정을 해서 폭을 조절해 보죠.

 

자 이렇게 'MNO You'가 '곽할'이라는 한글로 나옵니다 :) 수정된 부분이 영문에 겹치는 것도 보이는군요.

 

윈도용 직결식 폰트와 달리 받침이 없는 폰트를 따로 만들면 이처럼 완성형과 같은 모양도 구현이 가능합니다.

그런데 샤이닝 포스의 경우엔 한가지 문제가 있습니다. 캐릭터 이름을 8x8과 16x16 폰트 둘 다 사용한다는 겁니다. 이럴 경우 8x8 폰트는 직결식을 쓸 수 없기 때문에 16x16에서 표시되는 것과 글자가 달라지는 문제가 있습니다. 현재로서는 16x16 폰트의 영문을 건드리지 않고 캐릭터 이름을 영문 그대로 쓰는 것 외에는 별다른 뾰족한 방법이 생각나지 않네요.

그리고 또 하나, 이러한 방식을 사용하면 글자 하나당 2~3바이트를 필요로 하기 때문에 대사 확장은 거의 필수입니다.

어쨌건 이런식으로도 한글 구현이 가능합니다 :) 

 

댓글