메뉴 건너뛰기

조회 수 1252 추천 수 16 댓글 4
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

일단 범용적이라 할 순 없겠지만 이번에 제가 패치를 준비중인

"블루 리플렉션"을 예를 들어 한글화 과정을 몇편에 걸쳐 소개드리려고 합니다.

 

강의라고 하면은 거창한거 같고... 아무튼 이 소개글은 어느정도의 프로그래밍 지식을 기본전제로 함을 양해해주세요.

가독성을 위해선 중요한 부분이지만 꼭 필요한 부분이 아니면 가급적 이미지는 쓰지 않도록 하겠습니다.

 

어쩌면 뭘 해보려는 사람한테는 뭔말인가 싶고 이미 잘 아는 분들한테는 잉여로운 글이 될수도 있지만...

아마 ps3 이후 거스트 게임에는 거의 공통적으로 적용될 수 있는 한글화 방법이라고 생각해서 씁니다.

일단 여기서는 게임의 PAK파일을 언팩,리팩하는 과정에 대해서는 생략합니다.

 

1. PAK파일의 언팩

QUICK BMS또는 전용 툴을 통해 PAK파일을 언팩합니다. 물론 언팩을 위한 스크립트는 있어야겠죠.

여기서는 다루지 않지만 https://forum.xentax.com/ 또는  https://github.com/AdmiralCurtiss/HyoutaTools/ 에서 힌트나 도구를 얻으실 수 있을 겁니다.

 

2. 시나리오 파일 찾기

기본적으로 복호화가 완료된 *.ebm 확장자를 가진 파일을 시나리오 스크립트로 쓰고 있습니다.

(bsb와 xml파일도 있지만 그걸 추출해내는 건 또 다른 로직이 필요하므로 다른 편에서 다루겠습니다)

 

이 파일들은 주로 event폴더에 위치하고있으며 분류에 따라 수백개의 파일로 나누어져있습니다.

아무튼 이 파일을 확인하기 위해선 Crystal Tile또는 EmEditor, 010Editor등으로 열어줍니다.

 

3. 스크립트 파싱

이진파일 16진수 보기 형태로 열어줍니다. 그러면 아래와 같이 제어코드가 섞인 스크립트를 확인할 수 있습니다.

4바이트씩 정렬하여 구조를 파악해봅시다.

c1.png

09 00 00 00 02 00 00 00  0B 00 00 00 00 00 00 00  7C 00 00 00 00 00 00 00  14 00 00 00 00 00 00 00 
00 00 00 00 2E 00 00 00  E3 81 A8 E3 81 86 E3 81  A8 E3 81 86 E3 80 81 E3  81 82 E3 81 AE E5 AD 90 
E3 81 8C E6 9D A5 E3 81 A6 E3 81 8F E3 82 8C E3  82 8B E3 82 88 00 02
00  00 00 10 00 00 00 00 00 
00 00 7C 00 00 00 00 00  00 00 14 00 00 00 01 00  00 00 00 00 00 00 34 00  00 00

 

회색으로 된  E3 81 A8로 시작하는 부분은 utf8로 된 대사입니다. 한글자가 3byte씩 차지하는 걸 볼 수 있습니다.

위와 같은 스크립트 구조를 볼 때 대사와 다음대사가 나오기 직전까지를 잘라서 분석해보고,

다시 전체를 보고 또 부분부분 잘라서 보는 것이 중요합니다.

 

사실 거스트 게임의 경우 기존에 분석된 자료가 꽤 있고 어느정도 커뮤니티에서 이야기도 자주 나오는 편이라 힘들여 분석하고 프로그램을 짜고 할 필요는 없었습니다. 하지만 전 잘 몰랐고 그냥 부딪혀보고 툴도 혼자 짜면서 별 삽질을 했었죠. 중요한 건 모르는 부분은 일단 넘겨보고 눈에 보이는 부분과 규칙성을 파악하는게 중요합니다.

 

결론적으로 분석결과에서 빨간색으로 강조된 hex값에 대한 설명은 다음과 같습니다.

09 : 현재 스크립트에 포함된 전체 대사 개수

02 : 대사 ID

7C : 캐릭터 ID (이걸 알아두면 대사의 화자 뿐만 아니라 폴더 구조 파악에 도움이 됩니다)

2E : 대사의 길이 (대사가 끝나고 00까지를 포함, 02 앞까지)

 

모르는 부분을 넘어가고 이를 클래스화한다면 아래와 같이 됩니다. (대사개수를 나타내는 4바이트 제외)

 

public class ebmEntry
{
            public uint Ident;
            public uint Unknown2;
            public uint Unknown3;
            public int CharacterId;
 
            public uint Unknown5;
            public uint Unknown6;
            public uint Unknown7;
            public uint Unknown8;
            public uint Unknown9; // 밤이 없는 나라의 경우 4byte추가
            public uint TextLength; 
            public string Text;

}

 

 

아무튼 이를 토대로 ebm 바이너리 파일을 읽어들인다면 먼저 4바이트를 읽어 전체대사 개수를 얻습니다.

그 뒤 해당 크기에 맞게 읽어들이고 TextLenght를 찾았을 때는 특정 길이만큼만 읽어들여 저장하고

이를 반복하면 되겠죠.    (https://github.com/AdmiralCurtiss/HyoutaTools/tree/master/Gust/ebm 참고)

 

아래는 c#으로 쓰여진 코드고 메소드(function)의 정의가 빠져있지만 프로그래밍 기본 지식이 있다면 크게 이해에 어려움을 없을거라 생각됩니다. 대사 전체갯수를 구한 다음에 갯수만큼 반복문에서 아래 메소드를 호출하여 EntryList를 추가합니다. 저의 경우 특별한 대사가 없는 경우 ( ! ? ... 등)에는 모두 continue하여 포함하지 않도록 했습니다.

 

* bIsAzure (true일때 밤이없는나라 스크립트로 4byte추가로 읽어들임)

public ebmEntry(Stream stream, bool bIsAzure = false)
            {
                Ident = Util.ReadUInt32(stream);
                Unknown2 = Util.ReadUInt32(stream);
                Unknown3 = Util.ReadUInt32(stream);
                CharacterId = (int)Util.ReadUInt32(stream);
                Unknown5 = Util.ReadUInt32(stream);
                Unknown6 = Util.ReadUInt32(stream);
                Unknown7 = Util.ReadUInt32(stream);
                Unknown8 = Util.ReadUInt32(stream);
                TextLength = Util.ReadUInt32(stream);
 
                long pos = stream.Position;  // 현재 파일 위치 저장
                Text = Util.ReadNulltermString(stream); // null을 발견할때까지 text읽고 이를 string변환
                stream.Position = pos + TextLength;  // 현재위치에서 TextLength만큼 이동
 
                if (bIsAzure) // 밤이없는나라의 경우 4바이트가 더해진 구조므로 더 읽어들임
                    Unknown9 = Util.ReadUInt32(stream);
            }

 

다시 쓸때는 대사의 길이가 달라지는 부분이 있을때니 번역문의 길이에 맞춰 TextLenght를 수정하고

바이너리 파일을 쓰면 그만이겠죠.

 

저는 필요에 따라 아래와 같은 GUI 프로그램을 만들었지만 그냥 텍스트파일을 준비해서 교체하는 식으로 하든 편한 방법으로 하면될거라 생각합니다.

t2.png

 

중요한 건 수정된 대사가 그냥 적용되는 게임은 별로 없으므로...(안타깝지만 영문이면 모를까 한국어는 폰트에 포함되지 않는 경우가 다반사입니다)

결과를 게임에서 확인해보고 폰트가 ?든 ~든 출력되지 않든 이상이 있으면 폰트를 찾아서 수정할 필요가 있습니다.

 

한글화의 경우 보통 exe파일을 뜯어 아예 폰트를 불러오는 어셈블리를 수정해버리거나 DLL인젝션을 통해 외부의 폰트를 불러오게 하는 등의 방법이 쓰입니다.

그게 여의치 않을때는 원래의 폰트 파일을 수정하고 번역문이 그 폰트 하나하나에 대입할 수 있도록 사용자 테이블을 만들어주는 과정이 필요합니다. 일단 저는 해당 게임에서 출력하는 폰트가 뭔지 어떻게 수정해야 좋은지 상당한 삽질을 거쳤습니다 ( ..)

 

그 부분은 다음 편에서 다룰게요.

 

 

 

글쓴이 님의 최신글
  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

▼ 펼쳐 보기
Atachment
첨부 '2'
  • profile
    왜냥 2019.03.16 02:31

    정말...대단하십니다! 비단 루텔님뿐만아니라 한글화해주시는 모든분들께 다시한번 감사의 마음을 느끼네요. 그저 저같이 그저 한패검색해서 즐기는유저에게는 너무나 감사하다는말씀밖에는 못드리겠네요. 건강항상잘챙기시길바라며 지나가다가 감사한마음에 한글자 적어봅니다! 행복하세요!!!

  • ?
    RuTel 2019.03.16 22:54
    사실 알고나면 크게 대단할 건 없는데 제가 경험이 부족해서 삽질을 꽤 했네요. =_=
    그래서 정리하고자 이런 글을 쓰게 되었습니다.

    격려와 응원의 말씀 정말 감사합니다~!왜냥님
  • profile
    몽까찌 2019.03.18 19:02
    오 감사합니다
    프로그래밍 지식은 어느정도있지만
    한글화하려고 파일분석하는것에 감이안잡혔는데
    저같은 사람을 위해서라도 더더 더 올려주세여!ㅋㅋㅋㅋ
  • ?
    RuTel 2019.03.23 23:01
    넵 이어서 폰트파일 수정하고 테이블 작성하는 편과
    나머지 텍스트들을 번역,수정하는 방법도 올려보겠습니다

List of Articles
분류 제목 게임 글쓴이 날짜 조회 추천
공지 ITCM <스팀그룹> 비공개 전환 안내 및 초대요청 2318 ITCM 08.24 97442 46
꿀팁 [운영자 인증] ITCM 꿀팁정보 모음 (2017/3/16) 33 코코넛먹자 08.05 93866 67
공지 ITCM 내부 규정 안내 70 file ZardLuck 02.05 82235 88
잡담 와 이번달은 개근할 것 같네요 file NDog 03.30 181 3
소개 트로피코6 리뷰등록 시작 7 file 코코넛먹자 03.30 938 8
잡담 몬헌월드 어쌔신크리드 콜라보 이벤트가 확정되었습니다. 3 file 엔틱군 03.29 746 7
잡담 2년만에 스팀에서 구입했네요 (feat. 보더랜드2) file 엔틱군 03.29 600 3
잡담 블러드라인 2가 나오는군요! 8 오드비 03.29 393 5
잡담 갑자기 먼슬리 결제가 돼서 깜놀.. 3 구수후 03.29 558 1
스샷 (용량스압조심)넬케와 전설의 연금술사들 프리미엄박스 2 file RuTel 03.29 289 3
잡담 메트로 엑소더스 지역락땜에 플레이가 안되네요. 8 Friv 03.29 592 2
공지 ITCM 서버 점검 관련 공지입니다. 1 whals98 03.29 387 7
잡담 디비전2 서부다운타운 보조임무 버그 4 file Medusa 03.29 1432 3
꿀팁 캐서린 풀 보디 체험판 나왔길래 바로 플레이 해봤습... 4 file 보석함 03.29 713 1
잡담 텐센트도 클라우드 게임 서비스 시작하려나 보네요.. 3 crys 03.29 397 3
잡담 리스크 오브 레인 2가 발매되었습니다. 2 RedPain 03.29 596 3
잡담 GOG에 워크래프트1&2 가 떳네요 7 Swany 03.29 1136 5
잡담 보더랜드 프리시퀄 어떤가요? 13 킬러조 03.29 3795 2
소개 Dakar 18, 3일간 무료 및 50% 할인(사막 오프로드 게임) 1 file kerakera 03.29 478 2
잡담 레데리 스틸북이 왔군요. 그리고 GOG 워크래프트 1&2 6 file greenhuman 03.29 482 5
잡담 워프레임 6주년 4 file Prof.Kain 03.29 39459 7
질문 어크 에지오콜렉션 PS4랑 PC중에 뭐가 더 그래픽 좋은... 5 hslhs**** 03.28 1667 0
잡담 세키로 엔딩 봤습니다 7 file 뚜루두루 03.28 1986 8
잡담 [DJMAX RESPECT] D2 6B MX ( 98.68% MAX COMBO ) 2 file sese_Kitsugai 03.28 217 2
잡담 역전재판 123: 나루호도 셀렉션... 9 ipuni 03.28 752 2
잡담 파나티컬 SEGA MegaDrive 번들정보는 삭제했습니다. 엔틱군 03.28 558 5
소개 That Dragon, Cancer (암이라는 이름의 드래곤) 한글 ... 10 file LSW 03.28 2887 35
잡담 이제 베데스다도 완전히 한글화로 돌아섯나봅니다ㅎㅎ 10 hslhs**** 03.28 1220 10
Board Pagination Prev 1 ... 305 306 307 308 309 310 311 312 313 314 ... 2714 Next
/ 2714
CLOSE

SEARCH

CLOSE