메뉴 건너뛰기

조회 수 2259 추천 수 18 댓글 7
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
Extra Form

어느정도 프로그래밍 지식에 이해가 있다고 가정하고 쓰는 글임을 양해해주세요.

 

이전 블루리플렉션 한글화 과정을 쓴 적이 있지만 이번엔 거스트 게임 전반에 통용될 강좌를 쓰려 합니다.

(아틀리에, 밤이 없는 나라 시리즈, 블루 리플렉션)

 

GUST 제작사의 게임에 사용되는 아래 파일을 분석 및 수정해 한글화하는 과정을 다룹니다.

1. 폰트 2. 시스템 텍스트 3. 이벤트 텍스트  4. 이미지 파일

 

세부적인 코드에 대한 설명은 지양하고 어떻게 하면 된다라는 내용을 간략히 다룰겁니다. 오픈 소스에 대한 분석은 알아서 해주시기 바라며, 제가 작성한 코드는 간단해서 따로 주석이 필요없을 거 같네요.

 

이번 편에서 다룰 내용은 폰트입니다.

블루리플렉션, 아틀리에 아란드(루루아 제외)부터 아샤까지는 모두 공통된 g1n확장자의 폰트를 씁니다.

이에 대한 내용은 이전에 쓴 바 있어서 링크로 대신합니다.

http://itcm.co.kr/g_board/7623545

 

하지만 아틀리에 에스카로지(A15)부터는 g1t라는 포맷을 씁니다. (A는 아틀리에 시리즈, 뒤 숫자는 발매순서를 의미)

이 파일은 일종의 이미지 컨테이너로 내부에 한 개 이상의 이미지 파일을 담고 있습니다.

 

g1t 구조 및 unpack 및 repack에 대한 내용은 아래 소스 참조 (해외유저가 공개한 오픈소스)

https://github.com/VitaSmith/gust_tools/blob/master/gust_g1t.c

 

아틀리에 샤리 기준으로 폰트 파일은 아래 경로에 위치하고 있습니다.

Atelier Shallie DX\Data\x64\Font

 

폴더를 열어보면  MainFont_x64_0와 SubFont  g1t파일이 있는데 이 파일은 위의 소스를 통해 unpack해보면

dds확장자의 이미지 파일이 나오게 됩니다. MS사가 개발한 포맷으로 PS3이후의 압축이미지가 주로 이 형식입니다.

 

포토샵이 있으신 분은 dds플러그인을 받으시거나 ( https://developer.nvidia.com/nvidia-texture-tools-exporter )

페인트닷넷 ( http://paint.net ) 프로그램을 받아서 열 수 있습니다. 

 

font.png

 

g1t나 dds파일은 단순히 이미지 데이터만 담으므로 폰트의 좌표는 실행파일에서 찾아야 합니다.

exe파일을 010 에디터 등으로 열어 MainFont 문자열을 검색해봅시다.

exe.png

4개의 검색결과가 나옵니다. 조금 내려다보면 아래와 같이 일종의 구조화된 형식이 보일 겁니다.

 

4C 06 53 00 03 00 03 00 FF FF FF FF 31 00 00 00 0A 00 00 00 00 00 00 00 01 00 00 00

85 06 BF 00 03 00 03 00 FF FF FF FF 31 00 00 00 0A 00 00 00 00 00 00 00 02 00 00 00

 

위를 구조체화하면 아래와 같이 바꿀 수 있습니다.

해외 포럼에서 정보를 찾았습니다. (  https://forum.xentax.com/viewtopic.php?f=35&t=21988 )

 

 struct Glyph
        {
            public uint UTF8;
            public ushort X;             public ushort Y;
            public ushort Width;             public ushort Height;
            public int PaddingLeft;          public int PaddingTop;
            public int PaddingRigth         public int PaddingBottom;

        }

 

위에서 UTF8로 문자를 표시한다는 걸 알았으니 히라가나 あ를 검색해봅시다.

あ는 E3 81 82 이고 바이트정렬을 거꾸로 하면 82 81 E3 이 됩니다.

 

HEX값으로 82 81 E3을 찾아봅시다. 그러면 아래와 같은 값을 볼 수 있습니다.

82 81 E3 00 DD 07 42 06 1D 00 20 00 04 00 00 00 0C 00 00 00 24 00 00 00 00 00 00 00

 

위 해외 포럼의 소스를 참고하여 해당 주소부터 utf8 문자가 \\가 나올때까지 파싱결과를 파일로 출력하도록 했습니다. 그럼 아래와 같이 문자당 각 28bytes(0x1c)의 폰트테이블 정보를 알 수 있습니다.

 

offset:15017336, Char: ぁ, X: 88, Y: 878, W: 27, H: 29,L : 0 ,T : 4, R : 36, B : 17 
offset:15017364, Char: あ, X: 828, Y: 648, W: 34, H: 36,L : 0 ,T : 1, R : 36, B : 10 
offset:15017392, Char: ぃ, X: 1907, Y: 861, W: 26, H: 24,L : 0 ,T : 6, R : 36, B : 21 

(....)

 

다만 좌표 정보를 안다해도 정말 폰트이미지와 일치하는지 눈으로 확인하기 쉽지 않기에

저는 아래와 같이 그림파일로 변환하는 코드를 짰습니다. 

 

소스가 길어서 링크로 대신할게요.

https://gist.github.com/imrutel/9b5dddb7cd3e7f76ee338189d3ffb47d

 

그러면 아래와 같이 실행파일내 폰트 테이블을 그림파일로 확인할 수 있습니다.

font3.png

 

코드를 수정하면 위 폰트들을 한글 2350자로 대체할 수도 있겠습니다. 그러면 블루리플렉션때와 같이 한글=한자에 대응하는 폰트테이블을 만들어 출력할 수 있겠지요. 사실 위와 같은 방법을 쓰고자한건 실행파일을 수정하면 스팀API가 체크해서 오류를 띄우는 게임도 있기 때문입니다. 다만 샤리는 어째선지 실행파일을 수정하고도 실행이 가능합니다. 그러므로 직접 한글을 출력할 수 있게 새로운 폰트 좌표정보를 넣어주면 됩니다.  

 

UTF8에는 예를 들면 한글 '가'  (헥스값 EA B0 80  reverse order : 80 B0 EA) 

를 넣어주고 좌표는 글자와 전체 폰트 높이,너비를 고려하여 파일을 수정하도록 코드를 짜면 되겠죠.

 

Char: 가, X: 0, Y: 1800, W: 36, H: 36,L : 0 ,T : 0, R : 36, B : 9 
Char: 각, X: 36, Y: 1800, W: 36, H: 36,L : 0 ,T : 0, R : 36, B : 9 
Char: 간, X: 72, Y: 1800, W: 36, H: 36,L : 0 ,T : 0, R : 36, B : 9 

(...)

 

다만 실행파일의 전체크기를 늘릴 수 있는 방법을 찾진 못해서 한자영역을 한글로 대체해야 합니다.

만약 폰트이미지의 크기를 늘릴 필요가 있다면 아래 하이라이트된 4byte값을 수정하면 됩니다.

font4.png

2byte씩 메인폰트의 너비와 높이를 나타냅니다.

00 80 00 10 에서 08 00 는 2048 높이고, 10 00 는 4096의 너비입니다.  (2048x4096의 이미지 크기)

 

코드를 통해 새로운 폰트정보로 교체해주었다면 아래와 같이 paint.net등의 프로그램으로 이미지를 열어서 폰트이미지에 기존 글자는 두고 한글만 새로운 좌표에 추가해주면 되겠습니다.

font5.png

 

혹은 이미지 편집이 서툴다면 위의 그림파일로 폰트정보 출력하는 소스를 참고해 비트맵파일을 조작해서 프로그램으로 넣어도 되겠구요.

 

아래와 같이 코드를 통해 이미지의 한자영역만 지워버린 다음

graphics.FillRectangle(Brushes.White, glyph.X, glyph.Y, glyph.Width, glyph.Height);
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.FillRectangle(Brushes.Transparent, glyph.X, glyph.Y, glyph.Width, glyph.Height);

 

한글 완성형 2350자를 넣어도 충분하겠습니다.

 

아무튼 실행파일을 수정 하고 폰트dds이미지는 수정 후에 위에서 알려드렸던 소스 ( https://github.com/VitaSmith/gust_tools/blob/master/gust_g1t.c ) 를 통해 g1t로 리팩합니다.

 

 

이벤트 파일(.ebm)의 텍스트 수정은 아래 링크를 참고해주세요.

http://itcm.co.kr/g_board/7571389

 

\Atelier Shallie DX\Event\event내의 파일들을 수정하면 됩니다.

event.png

 

아무튼 실행파일과 폰트, 이벤트 텍스트까지 수정하고 나면 아래와 같이 한글출력이 가능합니다.

20200528181003_1.jpg
 

UI (시스템) 텍스트의 추출 및 한글 번역문으로 대체하는 과정은 다음 편에서 다루겠습니다.

글쓴이 님의 최신글
  1. 2020-06-30 22:17 요청게시판 > 문의
  2. 2020-06-30 20:44 이야기 > ITCM 떠나기 전 인사드립니다. *68
  3. 2020-06-30 04:47 이야기 > 스압)아이마스 원포올 오늘 플레이 *2
  4. 2020-06-30 02:23 이야기 > 콘솔겜 가격정보 사이트 (PS,스위치,엑박 등) *11
  5. 2020-06-30 00:36 이야기 > 아; 출석 하루 빠졌었네요. *9

Who's RuTel

imrutel.png

 

[시스템정보]

Samsung Odyssey Gaming Laptop NT800G5S-XD71A

I7-7700HQ, 16G RAM, GTX 1060

Intel E3-1230 V2, ZOTAC GTX 1070 Mini

ASRock Z77 Extreme4Memory 8G (4G X 2)

 

64-bit Windows 8.1, Antec VP650P V2
Samuel 17 @ COUGAR DUAL-X 120mm White LED FAN


SSD Crucial MX100 256GB @ SanDisk X110 128GB @ SanDisk U110 32GB

Corsair Carbide Series Air 540, Samsung U32h850 , Razer Marauder, XENICS STORMX M2

▼ 펼쳐 보기
  • profile
    2020.06.16 16:45

    한글 패치는 진짜 언제나 압도적으로 감사할 따름이네요..ㅜ.ㅜ

  • profile
    Medusa 2020.06.16 19:40

    정말 좋은 내용인데 뭔 소린지 모르겠어요

  • profile
    impeach 2020.06.16 20:08
    뭔가 대단한 내용이라는 감이 오는데 까막눈이라 제대로 알아들을수 없으니 구름만 쳐다보고 있습니다. ㅋㅋㅋ
  • profile
    이드v 2020.06.16 21:34

    엄청 어렵드아앙

  • ?
    RuTel 2020.06.16 21:39

    한글화 입문 시 그래도 이렇게 분석자료가 있으면 도움이 될거 같단 의견이 있어 공유한건데
    전혀 모르는 분들도 사용할 수 있는 툴을 만들어 릴리즈하는게 낫겠네요...

  • profile
    아렌식 2020.06.16 21:54

    한 1퍼센트 이해했으려나요... orz 대단하십니다!

  • profile

    1726641b65782f70.jpg

     

    쉽네요 


CLOSE

SEARCH

CLOSE