케로로

GBA 케로로 중사 격주 케론프리 대작전에 한글을 출력시키고 말겠다. (2부)

K66Google 2020. 10. 5. 21:56

GBA 케로로 중사 격주! 케론프리 대작전 입니다!! 라는 게임이 있다. 국내에서는 '케로로 레이싱게임' 이라는 명칭으로 더 알려진 게임이다. (온라인게임 케로로 레이싱과는 관계없음)


지난 시간엔 롬파일을 Crystaltile2로 열어서 두 개의 폰트 영역이 있다는 것과 각각의 폰트 영역 주소, 바이트수, 폰트의 글자·배경 판단 기준 등 대부분의 정보를 분석하였다. 그리고 분석한 정보를 토대로 폰트 도트를 찍으면 헥스 코드로 변환하여 롬파일에 덮어씌워주는 프로그램까지 제작하였다.


쓸데없는 짓처럼 보일 수도 있겠지만, 이런 짓이라도 하지 않으면 이 게임은 영영 한글화가 되지 못할지도 모른다. 그래서 나중에 흐지부지될 수 있어도 착공식이라도 해보려는 것이다.


서론이 너무 길었다. 아무튼 나는 폰트 2350자를 수동으로 다 찍는다는 것은 사실상 불가능하다고 생각하고, 자동으로 입력해볼한 폰트를 구하기로 하였다.

마침 한식구 카페의 7x11 에슘길체(출처)가 눈에 들어왔다. 현재 GBA 케로로에 있는 8x15 폰트 영역에 대입이 가능하다.

(6x12는 안타깝게도 폭이 작아서 대입할 수가 없다...)


폰트 bmp 파일을 받고, 프로그램에 다음과 같은 알고리즘을 추가했다.


1. bmp 파일의 픽셀을 식별한다. 최초 시작 위치는 첫번째 글자의 왼쪽 맨 위 타일이다. (참고)

2-1. 글자 타일(검은색)이면 도트창에 검은색을 찍고 오른쪽 픽셀로 이동.

2-2. 배경 타일(흰색)이면 도트창에 흰색을 찍고 오른쪽 픽셀로 이동.

2-3. 구분선 타일이면 다음 줄로 넘긴다.

3. 마지막 줄까지 다 찍었으면 헥스 코드로 변환하고, 롬파일에 덮어쓴다.

4. 다음 글자의 왼쪽 맨 위 타일로 이동.


이 작업을 한글 2350자 모두 넣을때까지 반복한다.


작업 도중에 보니까 중복 글자와 2350자에 포함되지 않은 글자가 있어서 [로(중복), 쌰, 쎼, 쓔, 쬬] 해당 글자들은 삭제하고 폰트를 자동으로 삽입하였다.


그런 다음 대사 주소로 가서 대사를 바꿔보았다. 참고로 이 게임은 반각 문자를 지원하지 않아서 기호나 영문, 숫자 모두 전각으로 입력해야 한다.



그랬더니 드디어 완전한 한글 문장을 볼 수 있게 되었다. 글씨가 뭔가 지저분하게 보이지만 더 이상 폰트에 머리 쏟기는 싫다... 그냥 무슨 글자인지 알아볼 수 있는 것만으로도 만족하자...


이제 남은 건 6x12 영역이다. 처음에는 가로폭 6으로 만들어진 폰트를 찾아보기로 했으나 안타깝게도 찾을 수가 없었다.

그래서 내가 직접 계획해보기로 하였다.


먼저 중성 및 종성 영역이다.

해당 영역을 일단 4가지 타입으로 분류를 했는데... 이건 그냥 보기용이다. 실제 구분은 초성 영역을 통해 이루어진다.



초성 영역이다. 총 3가지 타입으로 구분해놓았다.


 초성

 호환되는 중성 및 종성

 왼쪽 초성 영역

 ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅣ

 중앙 초성 영역

 ㅗ ㅛ ㅜ ㅠ ㅡ 및 이것의 종성추가형.

 왼쪽 위 초성 영역

 나머지 전체.


이제 2350자에서 지원하는 중성 및 종성 조합수를 계산해보자.

유니코드만 놓고 봤을때, 중성 및 종성 조합수는 총 588벌이 있다. (출처)

이걸 EUC-KR (2350자)의 글자 하나씩 대입해서 각각 어떤 조합에 해당하는지 프로그램을 돌려본 결과는 다음과 같다. (너무 스크롤이 길어서 txt 파일로 올림.)


EUC-KR (2350자)의 중성 및 종성 조합 분석.txt


이 파일의 결과를 토대로, EUC-KR에서 지원하는 중성 및 종성 조합수는 270개라는 것을 알아냈다.

해당하는 조합들은 다음과 같다.


* 중성 종성 조합 - EUC-KR에 들어간 조합 (총 20x13 + 10 = 270개)

ᅟᅡᅟᅡᆨᅟᅡᆩᅟᅡᆪᅟᅡᆫᅟᅡᆬᅟᅡᆭᅟᅡᆮᅟᅡᆯᅟᅡᆰᅟᅡᆱᅟᅡᆲᅟᅡᆴᅟᅡᆶᅟᅡᆷᅟᅡᆸᅟᅡᆹᅟᅡᆺᅟᅡᆻᅟᅡᆼ

ᅟᅡᆽᅟᅡᆾᅟᅡᇀᅟᅡᇁᅟᅡᇂᅟᅢᅟᅢᆨᅟᅢᆫᅟᅢᆯᅟᅢᆷᅟᅢᆸᅟᅢᆺᅟᅢᆻᅟᅢᆼᅟᅢᆽᅟᅢᇀᅟᅣᅟᅣᆨᅟᅣᆫᅟᅣᆭ

ᅟᅣᆯᅟᅣᆲᅟᅣᆷᅟᅣᆸᅟᅣᆺᅟᅣᆼᅟᅣᇀᅟᅣᇂᅟᅤᅟᅤᆫᅟᅤᆯᅟᅤᆷᅟᅤᆸᅟᅤᆼᅟᅥᅟᅥᆨᅟᅥᆩᅟᅥᆪᅟᅥᆫᅟᅥᆬ

ᅟᅥᆮᅟᅥᆯᅟᅥᆰᅟᅥᆱᅟᅥᆲᅟᅥᆷᅟᅥᆸᅟᅥᆹᅟᅥᆺᅟᅥᆻᅟᅥᆼᅟᅥᆽᅟᅥᆾᅟᅥᆿᅟᅥᇀᅟᅥᇁᅟᅥᇂᅟᅦᅟᅦᆨᅟᅦᆫ

ᅟᅦᆮᅟᅦᆯᅟᅦᆷᅟᅦᆸᅟᅦᆺᅟᅦᆻᅟᅦᆼᅟᅧᅟᅧᆨᅟᅧᆩᅟᅧᆫᅟᅧᆮᅟᅧᆯᅟᅧᆱᅟᅧᆲᅟᅧᆷᅟᅧᆸᅟᅧᆹᅟᅧᆺᅟᅧᆻ

ᅟᅧᆼᅟᅧᆾᅟᅧᆿᅟᅧᇀᅟᅧᇁᅟᅧᇂᅟᅨᅟᅨᆫᅟᅨᆯᅟᅨᆷᅟᅨᆸᅟᅨᆺᅟᅨᆻᅟᅨᆼᅟᅩᅟᅩᆨᅟᅩᆩᅟᅩᆪᅟᅩᆫᅟᅩᆭ

ᅟᅩᆮᅟᅩᆯᅟᅩᆰᅟᅩᆱᅟᅩᆳᅟᅩᆴᅟᅩᆶᅟᅩᆷᅟᅩᆸᅟᅩᆺᅟᅩᆼᅟᅩᆽᅟᅩᆾᅟᅩᇀᅟᅩᇁᅟᅩᇂᅟᅪᅟᅪᆨᅟᅪᆫᅟᅪᆯ

ᅟᅪᆱᅟᅪᆷᅟᅪᆸᅟᅪᆺᅟᅪᆻᅟᅪᆼᅟᅫᅟᅫᆨᅟᅫᆫᅟᅫᆯᅟᅫᆷᅟᅫᆸᅟᅫᆺᅟᅫᆻᅟᅫᆼᅟᅬᅟᅬᆨᅟᅬᆫᅟᅬᆯᅟᅬᆷ

ᅟᅬᆸᅟᅬᆺᅟᅬᆼᅟᅭᅟᅭᆨᅟᅭᆫᅟᅭᆯᅟᅭᆷᅟᅭᆸᅟᅭᆺᅟᅭᆼᅟᅮᅟᅮᆨᅟᅮᆩᅟᅮᆫᅟᅮᆮᅟᅮᆯᅟᅮᆰᅟᅮᆱᅟᅮᆴ

ᅟᅮᆶᅟᅮᆷᅟᅮᆸᅟᅮᆺᅟᅮᆼᅟᅮᆽᅟᅮᆾᅟᅮᇀᅟᅮᇁᅟᅮᇂᅟᅯᅟᅯᆨᅟᅯᆫᅟᅯᆯᅟᅯᆷᅟᅯᆸᅟᅯᆺᅟᅯᆻᅟᅯᆼᅟᅰ

ᅟᅰᆨᅟᅰᆫᅟᅰᆯᅟᅰᆷᅟᅰᆸᅟᅰᆺᅟᅰᆻᅟᅰᆼᅟᅱᅟᅱᆨᅟᅱᆫᅟᅱᆯᅟᅱᆷᅟᅱᆸᅟᅱᆺᅟᅱᆼᅟᅲᅟᅲᆨᅟᅲᆫᅟᅲᆯ

ᅟᅲᆷᅟᅲᆸᅟᅲᆺᅟᅲᆼᅟᅲᆾᅟᅳᅟᅳᆨᅟᅳᆫᅟᅳᆭᅟᅳᆮᅟᅳᆯᅟᅳᆰᅟᅳᆱᅟᅳᆵᅟᅳᆶᅟᅳᆷᅟᅳᆸᅟᅳᆺᅟᅳᆼᅟᅳᆽ

ᅟᅳᆾᅟᅳᆿᅟᅳᇀᅟᅳᇁᅟᅳᇂᅟᅴᅟᅴᆫᅟᅴᆯᅟᅴᆷᅟᅴᆸᅟᅴᆺᅟᅴᆼᅟᅵᅟᅵᆨᅟᅵᆫᅟᅵᆮᅟᅵᆯᅟᅵᆰᅟᅵᆱᅟᅵᆶ

ᅟᅵᆷᅟᅵᆸᅟᅵᆺᅟᅵᆻᅟᅵᆼᅟᅵᆽᅟᅵᆾᅟᅵᇀᅟᅵᇁᅟᅵᇂ



이제 해당 조합들의 도트를 찍어놓고 프리셋처럼 텍스트 파일로 저장시킨다.

참고로 스샷을 보면 왼쪽에 무슨 번호들이 있는데, 이건 유니코드 한글 코드 값을 응용한 중성·종성 조합의 식별번호다.


'나' 자를 예로 들자면 이건 유니코드 값으로 B0 08이다. 10진수로 바꾸면 45208이다. 45208을 588로 나누었을때의 나머지를 구하면? 520이란 값이 나온다. 그럼 프로그램은 520번 프리셋을 가지고 온다. 그럼 그 프리셋에는 ㅏ자 도트가 찍혀있을 것이다.



* 초성 조합

ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ


초성도 마찬가지로 도트를 찍고 프리셋처럼 파일로 저장시킨다. 단, 초성은 한 글자당 3벌씩 도트를 찍어야 한다.

(왼쪽 영역, 중앙 영역, 왼쪽 위 영역)


초성끼리의 구분은 다음과 같은 공식으로 하면 된다.


(유니코드10진수 - 44032) / 588


이러면 ㄱ은 0, ㄲ은 1, ㄴ은 2... 이렇게 식별값을 얻을 수 있다. 이때 프로그램 상에서는 일의 자리 버림 처리를 해야 한다. 안 그러면 중간에 다른 초성이 나오게 된다.


-----------------

이런 식으로 초성 식별번호와 중성·종성 조합 식별번호를 얻어낸다음 If문을 사용해서 중성·종성 조합과 매치되는 초성 프리셋을 불러오고, 중성·종성 프리셋도 불러오게 하는 것이다. 설명으로 풀어쓰니 참 복잡하다.


아무튼 복잡한 설계를 다 마치고 6x12 영역에도 2350자의 한글을 자동으로 붙여넣었다.

물론 글자 폭으로 인해 ㄲ, ㄸ, ㅃ, ㅆ, ㅉ 같은 쌍자음들은 알아보기가 좀 힘들다. 이건 뭐 어쩔 수 없다...


이제 Crystaltile2에서 문장을 수정한 뒤 어떻게 출력되는지 보도록 하겠다.



잘 들어갔다. 이정도면 그럭저럭 봐줄만하다.


이것으로 GBA 케로로 중사 격주 케론프리 대작전에 한글을 출력시키는 계획은 성공으로 끝났다.


다음 편에는 NDS 케로로 중사 연습이다 전원집합 1·2편과 NDS 케로로RPG에 대한 분석을 해보도록 하겠다..