메뉴 건너뛰기

조회 수 500 추천 수 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인젝션을 통해 외부의 폰트를 불러오게 하는 등의 방법이 쓰입니다.

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

 

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

 

 

 

글쓴이 RuTel님의 최신글
  1. 2019-05-25 18:19 이야기 > 라이자의 아틀리에, 올해 가을 발매예정 *3
  2. 2019-05-25 10:39 이야기 > 게임중독에 대한 뉴스가 나오네요 *11
  3. 2019-05-24 23:15 이야기 > 확실히 전 아재가 맞는거 같습니다... *8
  4. 2019-05-24 01:54 이야기 > (스압 7MB) 루루아의 아틀리에 제3장
  5. 2019-05-23 01:29 이야기 > (스압 11MB) 루루아의 아틀리에 제2장 *3

Who's RuTel

profile

imrutel.png

 

 

[시스템정보]

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

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

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

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

List of Articles
분류 제목 게임 글쓴이 날짜 조회 추천
공지 관리자에게 쪽지보내실때 참고해주세요!!! whals98 05.08 751 19
공지 방송관련글 카테고리가 추가되었습니다. 1 ITCM 08.23 1342 20
공지 ITCM 안드로이드 어플 V1.1 15 CMDev 08.10 3976 34
공지 핫라인 개설!!! 24 매양 01.18 5318 38
공지 시디키즈, G2A등 리셀러 정보 글 작성 금지 매양 10.04 7120 27
공지 나눔 글은 나눔게시판을 이용해주시기 바랍니다. 4 매양 09.26 3471 14
공지 ITCM <스팀그룹> 비공개 전환 안내 및 초대요청 1926 ITCM 08.24 27431 37
꿀팁 [운영자 인증] ITCM 꿀팁정보 모음 (2017/3/16) 33 코코넛먹자 08.05 8456 67
공지 ITCM 내부 규정 안내 - 2017.7.11 UPDATE 65 file ZardLuck 02.05 25574 85
잡담 윈도우10 은 모니터 드라이버가 필요없을까요? 2 고래밥 03.16 406 0
질문 itcm계정 메일변경 가능한가요? 2 wwwww 03.16 93 0
잡담 영화 "박열"을 봤습니다 2 RuTel 03.16 278 10
스샷 DOA 6 - 코어 파이터즈 (무료버전) 10 file Altiplano 03.16 779 3
소개 모바일용 스팀링크 업데이트로 외부에서 스팀게임가능 4 jach 03.16 625 4
잡담 디비전2 질렀습니다^^ 14 file 준이베어 03.16 597 10
잡담 스팀 사용자 평가의 재검토(Feat. 평가 폭탄 점수 제외) 16 Gemstaz 03.16 853 11
잡담 앤썸 손절 소감 17 file Harp 03.16 1134 14
질문 스팀에서 설치된 게임 찾는 방법이 있나요? 2 초코공장 03.16 341 0
잡담 레드핫 이집트 공연이 끝났네요... 5 은월향 03.16 221 4
잡담 알렉스 엑스트라 배틀 1주차+특별기획 BGM file Prof.Kain 03.16 94 2
소개 블루리플렉션 한글화 과정 [ 1 ] 4 file RuTel 03.16 500 16
잡담 스팀 게임으로, 진격의거인2, 원피스월드시커, 진삼8,... 주인공 03.15 402 0
잡담 스팀에서 ps4패드 연결하면 왜.. 7 주인공 03.15 477 0
잡담 생각보다 한글화 호응이 좋으네요 6 RuTel 03.15 921 20
질문 직구로 보조배터리 구매해 보신분 계신가요? 8 greenhuman 03.15 232 1
잡담 똥색 감성은 적응이 안되는군요. 13 file Rs 03.15 212 3
잡담 PS4용 데메크를 샀던 이유 4 file Medusa 03.15 417 1
잡담 미국 스팀상점으로 접속하는 방법이 있나요? 8 한입만줘 03.15 368 0
잡담 Xbox One S 질렀습니다! 6 file 반디멍멍 03.15 475 8
잡담 에픽스토어 트래킹의혹 7 crys 03.15 746 6
잡담 양대 그래픽카드 이벤트로 게임들 헐값에 얻어가네요ㅎㅎ hslhs**** 03.15 525 2
스샷 갓 오브 워 - 클리어 10 file Altiplano 03.15 195 3
질문 트로피코5 컴플 세일 언제쯤 할까요 5 KungFuPanda 03.15 228 0
잡담 워해머2가 험블로 풀릴 일이 있을까요? 22 ordelsut 03.15 629 0
Board Pagination Prev 1 ... 27 28 29 30 31 32 33 34 35 36 ... 2431 Next
/ 2431
CLOSE

SEARCH

CLOSE