레이블이 중장전희인 게시물을 표시합니다. 모든 게시물 표시
레이블이 중장전희인 게시물을 표시합니다. 모든 게시물 표시

중장전희 L10N 파일 분석

* 본 포스트는 네이버 블로그에 2020-03-30에 작성한 글입니다.

1. 파일 개요

files/Android/language/*.ab : L10N 유니티 애셋번들 파일
.ab 파일 언패킹 후,
*_storyJsonDatas.txt  : 게임 내의 스토리 모드에서 사용되는 텍스트 스크립트 모음
*_LanguageData.txt : 게임 내 UI등에 사용되는 텍스트 모음

2-1. SC_storyJsonDatas.txt 파일분석 (JsonParser 포맷)

a. 0x000000 ~ 0x000003 : 파일 이름 길이

b. 0x000004 ~ 0x000017 : 파일 이름

c. 0x000018 ~ 0x00001B : 앞으로 읽어들일 바이트 수

d ~ g : JsonParser 스트림 포맷

d.0x00001C ~ 0x000031 : 파악못함.

e. 0x000032 ~ : 앞으로 읽어들일 Json 본문 바이트 수

: 하나의 바이트 값이 0x80을 넘어서면 다음 바이트에 1을 추가하여 바이트를 늘려감.
: 0x80보다 작은 값이 나오면 read 멈춤.
: 1 -> 0x01 -> 0x01, 128 -> 0x80 -> 0x80 0x01, 256 -> 0x00 0x01 -> 0x80 0x02
: abcd에 대해
첫바이트 -> (abcd % 0x80) + (abcd > 0x7F ? 0x80 : 0x00)
다음바이트 -> ((abcd % (0x80)^2) / 0x80) + ((abcd / 0x80) > 0x7F ? 0x80 : 0x00)
N바이트 -> ((abcd % (0x80)^N) / 0x80^(N-1)) + ((abcd / 0x80^(N-1)) > 0x7F ? 0x80 : 0x00)

f.0x000034 ~ : Json 본문

{
    "key1" : "value1",
    ...
    "keyN" : "valueN"
}





g. 0x076052 : 0x0B(파일 끝)( 이후 바이트를 완전 버림 : 앞서 c. 에서 계산되는 바이트에서 빠져야됨.)


2-2. SC_LanguageData.txt 파일분석

a. 0x000000 ~ 0x000003 : 파일 이름 길이

b ~ f : Dictionary<int, string> 스트림 포맷

b. 0x000004 ~ 0x000013 : 파일 이름

c. 0x000014 ~ 0x000017 : 앞으로 읽어들일 바이트 수


d. 0x000018 ~ 0x000559 : 메타 데이터

e. 0x0002BD ~ 0x0002C0, 0x000375 ~ 0x000378 : 텍스트 개수

f. 이후 텍스트 데이터

* 텍스트 데이터 분석

4 바이트 : 텍스트 Key Id

1 바이트 : 텍스트 유무 코드 (유 : 0x06, 무 : 0x09)

4 바이트 : 체크섬 코드 A

(optional : 텍스트 유) 1~ 바이트 : 텍스트 바이트 수 2-1.e 항목 참고

(optional : 텍스트 유) 1~ 바이트 : 텍스트 Value (UTF-8)

1바이트 : 다음 텍스트 유무 코드 (유 : 0x01, 무 : 0x0B (-> 파일끝))

4바이트 : 체크섬 코드 B (텍스트 유 : A+B = 0xffffffff)

4바이트 : End 코드 (항상 0xFC 0xFF 0xFF 0xFF)



3. 결론

텍스트 키와 값을 읽어들일 수 있고 또한 분석된 결과를 토대로 새로운 파일을 생성할 수 있게 되었다. 한글 텍스트와 중국어 텍스트를 합쳐서 중국어 리소스에 엎어 씌게 되면 결과적으로 해당되는 텍스트 키에 맞게 한글 또는 중국어가 나오게 할 수 있다는 말.

한글 텍스트는 다음 버전부터 제공되지 않고 업데이트 되지도 않을 테니, 새로운 패치 내용에 맞는 텍스트를 한글로 적용하기 위해서는 누군가의 번역데이터가 필요할 듯. 시트를 생성하고 시트 값을 바탕으로 텍스트 데이터를 만들 수 있는 프로그램을 제작하여야 겠지만..

귀찮기도 하고 배포한다고 사용할 유저수도 적고 뭐 ㅋ


4. 결과



5. 비고

중섭기준인데, 텍스트 키값은 변경하지 않았을 확률이 높으니 대만섭에서도 잘 돌지 않을까?

암튼 #중장전희 재밌음.

ZZZJ패치 1.0.3 변경사항

  •  Android11 의 저장소 보안강화로 인한 수동 패치 기능 추가
    v1.0.3 실행화면

    • 수동 패치 프로세스 설명
      1. Android/Data/패키지이름/files/Android/ 로 이동
        • 패키지이름
          • 중국섭 : com.bilibili.zzzj.bili
          • 일본섭 : com.bilibilijp.finalgear
          • 대만섭 : com.komoe.zzgp
        • Android11에서는 시스템 파일 매니저로만 접근 가능
          • 픽셀폰 기준으로 [파일] 앱 또는
            [설정 - 저장용량 - 내부 공유 저장용량 - 파일]으로 접근
      2. version.txt 을 열어 버전을 확인한다.
      3. version.txt 와 2에서 확인한 버전의 txt 파일(예: 1170137.txt) 두 파일을 임의의 폴더로 복사한다.
      4. ZZZJ한패 앱을 실행한다.
      5. 패키지에 맞는 [수동] 버튼을 누르고 3에서 파일을 옮겼던 폴더를 선택한다.
      6. 두 파일이 제대로 있다면 ZZZJ한패 앱에서 패치파일을 생성한다
      7. 두 파일을 옮긴 폴더로 이동하면 다음처럼 font와 language 두 폴더가 생긴 것을 확인할 수 있다.
      8. 폴더안에 있는 모든 파일(폴더 두개 포함)을 Android/Data/패키지이름/files/Android/ 으로 복사 또는 이동한다.
        • 아직까지 Android11에서 Android/Data 안으로 파일을 옮기는 방법이 존재하지 않으므로 PC에서 USB케이블을 연결하여 해당 폴더로 파일을 덮어쓰기 해야한다.
      9. 게임을 실행하고 제대로 동작하는 지 확인한다.

ZZZJ패치 메뉴얼

구글 플레이 주소 : https://play.google.com/store/apps/details?id=com.Redd.zzzjreplacer


  • ZZZJ한패 앱을 실행하기전,
    • 게임을 실행하여 최신 리소스 다운로드를 마칩니다.
    • 게임 프로세스를 종료합니다.

앱 실행 화면


  • SC-APP : 중국
  • JAP-APP : 일본
  • TC-APP : 대만
  • RESET : 한패를 취소합니다.




  • 언어파일 및 폰트파일을 다운받아 적용합니다.


  • Apply Korean Patch 까지 OK가 나왔다면 한패 적용은 끝이 납니다.
  • 어느 한 스텝에서 Fail이 나온다면 
    • 이전 화면에서 RESET 버튼을 누른 후,
    • 게임을 실행하여 리소스를 다운로드한 후에 게임프로세스를 종료
    • 다시 처음부터 진행
    • OS가 Android11인 경우, 현재 알려진 문제점을 확인해 주세요.

현재 알려진 문제점

  • Android 11 에서 App Version Check 스텝에서 항상 실패
    이 문제는 Android 11 정책으로 인한 파일 접근 권한 이슈로 인해 발생하였으며, 다음의 페이지에서 확인할 수 있습니다.
    (https://developer.android.com/about/versions/11/privacy/storage#file-access)
  • 구 버전의 디바이스 또는 에뮬레이터(녹스 등)에서 동작한 결과물인 다음의 파일을 PC를 통해 복사하는 방식으로 우회할 수 있습니다.
    • 폴더 
      • SC-App : 내부저장소/Android/data/com.bilibili.zzzj.bili/files/Android
      • JAP-App : 내부저장소/Android/data/com.bilibilijp.finalgear/files/Android 
      • TC-App : 내부저장소/Android/data/com.komoe.zzgp/files/Android
    • 파일
      • XXXXXXX.txt : 7자리 수로 이뤄진 txt파일 중, 가장 높은 숫자의 txt 파일
      • language 폴더 내의 언어파일(sc_data.ab / jap_data.ab / tc_data.ab) 
      • font 폴더 내의 sourcehansanscn_bold.ab