메뉴 건너뛰기

조회 수 1628 추천 수 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 113945 47
꿀팁 [운영자 인증] ITCM 꿀팁정보 모음 (2017/3/16) 33 코코넛먹자 08.05 116576 68
공지 ITCM 내부 규정 안내 71 file ZardLuck 02.05 95856 89
잡담 둠 이터널 초반 간단 소감 13 file greenhuman 03.19 2879 16
스샷 아샤의 아틀리에 DX 한글출력 테스트 8 file RuTel 01.14 2740 16
잡담 친구 초대 퀘스트 자잘한 팁 14 Brownie 12.29 1995 16
잡담 전 이제 수집 목적으로 게임 구입을 일절 하지 않을 ... 34 S.T.E.E.L.N.A.I.L. 12.27 1261 16
잡담 친구 방송 이벤트 하실분들 오세요.(마감) 12 Nol9Sip4 12.28 436 16
잡담 [GMG/가격오류] The Black Death, War Tech Fighters,... 19 file 늑대와향신료 12.17 1330 16
잡담 어쌔신크리드 시리즈 약 1000시간 플레이.... 30 file Nemesis 12.02 3658 16
꿀팁 게임종합거래소(=게임세일즈=게임스카이즈=뉴게임스토... 4 박송배 11.21 4594 16
꿀팁 라이브러리 APNG파일 필요하신 분 가져가세요(데이터... 11 file Nemesis 10.05 3007 16
꿀팁 스팀 카드 초고속으로 판매하는 방법 8 file Reberas 09.06 3566 16
잡담 게임을 몇주간 못하고 있습니다. 24 Rs 08.20 263 16
잡담 최근 도전과제 그룹에서 시행되고 있는 프로젝트 8 file 루비틱 08.10 698 16
잡담 주말에 유비데이코리아에 다녀왔습니다.. 27 file Nemesis 08.05 945 16
잡담 분란 유도글 올려서 죄송합니다. 글은 삭제 했습니다. 14 greenhuman 08.02 1184 16
소개 [유저스크립트] ImprovedSteamWishList v0.1.0 13 file 늑대와향신료 07.16 741 16
잡담 개인정보를 엄청 수집하는 게임 7 file NoMercy 06.21 1513 16
잡담 스팀 웹 한국어 페이지는 언제쯤 살아날까요? 28 file Gemstaz 06.19 600 16
소개 Borderlands 2 새로나온 DLC 무료 배포중이네요(7월9... 11 file FruitTree 06.10 1173 16
잡담 베네스다 관련 반가운 소식~ 8 file 킬러조 03.26 1097 16
일상 드디어 1k 달성했어요 ㅠ 15 file lkua 03.24 376 16
잡담 Path of Exile 한국 서비스 결정 25 고래밥 03.20 3206 16
소개 블루리플렉션 한글화 과정 [ 1 ] 4 file RuTel 03.16 1628 16
잡담 4k 쟁여두기의 전령 달성 26 file RogueOut 03.01 526 16
영상 (수정/갱신) 두 번째 세계기록 달성 29 file Darkside 02.27 664 16
일상 영화 성적표(?)를 받았습니다! 8 file Nemesis 01.20 866 16
Board Pagination Prev 1 ... 206 207 208 209 210 211 212 213 214 215 ... 2766 Next
/ 2766
CLOSE

SEARCH

CLOSE