메뉴 건너뛰기

조회 수 1614 추천 수 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 <스팀그룹> 비공개 전환 안내 및 초대요청 2334 ITCM 08.24 112518 47
꿀팁 [운영자 인증] ITCM 꿀팁정보 모음 (2017/3/16) 33 코코넛먹자 08.05 115492 68
공지 ITCM 내부 규정 안내 71 file ZardLuck 02.05 94687 89
잡담 그린맨 게이밍 우회구매해도 될까요? 5 나무바다 03.25 1522 0
잡담 젤다의 전설과 사이쿄 슈팅 라이브러리 3 file greenhuman 09.24 1131 1
질문 워킹데드 더 파이널시즌 한글패치는 이제 구할수가 없... 5 vurtne 11.11 6360 1
질문 cdkeys 페이스북 쿠폰 받으신분 계시나요? 2 무료함 07.30 1565 0
질문 윈도우 10엑박패드 상하 반전 오류 해결책 있나요?? 7 아로하 11.12 1513 0
질문 마피아2 전화만 걸면 튕깁니다 ;; 11 화이트캣 09.26 902 2
일상 람보르기니 장점 1 file nameGT 03.16 944 0
잡담 드래곤에이지 인퀴지션 고티 고민되네요. 5 rsnest 12.21 1235 3
일상 독일의 운전면허 취득 2 file nameGT 03.16 849 0
질문 질문이요 2 누가바 02.10 720 0
질문 엑스컴2 구매에 관련하여 질문드립니다 4 아크 02.12 897 1
질문 험블 스팀키 남은것들 살만한 곳이 있나요? 3 육오삼원 01.05 1342 0
잡담 직접 찐 토탈워 사가 움짤 2 8 file 하임 09.10 1041 4
잡담 이제 우회등록이 많이 편해졌네요. 9 gameo 09.03 5030 11
잡담 Steep open beta 곧 시작 신청하신분 있는가요? 8 file 유리물고기 11.10 775 2
잡담 STEEP 오픈 베타키 3개 1 file 유리물고기 11.13 683 4
잡담 결국 소닉을 사버렸네요. 14 file dsad 06.03 908 7
잡담 게임 1년 정도 쉬었다하니 좀 재미있네요. 2 흐으으음 08.24 947 6
잡담 이제 창작마당에서 모드를 돈 받고 판다고 하네요 19 RedBaron 04.24 1467 6
질문 번들스타, 스타딜 manual authorisation 3 file 슨므니 04.06 1041 1
잡담 쬐끔 아는 지식으로 행동하다가 망하다? 19 file 달동상남자 04.05 1545 5
질문 스팀 구매시 수수료에 대해 궁금합니다. 6 Hoo 04.06 1103 2
잡담 오버워치 신 맵 보면서 가장 의문점이 드는것이... 6 코기 08.25 803 2
잡담 1세대 기기들은 역시 지켜봐야 하는건가 싶네요 14 WeLoo 03.07 1206 5
질문 넵튠 시리즈 현재 기프트 구매로 등록하는거까지 막혔... 4 스팀스팸 11.23 834 0
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 1239 Next
/ 1239
CLOSE

SEARCH

CLOSE