雑用担当の備忘録

技術的な話のみになります。翻訳データそのものはありません。 カテゴリ>その他>注意事項を必ず参照してください

TVECR 解析

概要:
  • フレームワークは UE4、ローカライズは UE4 の機能を使用。つまり locres バイナリデータの編集が必要。
  • pak は non compress、展開した状態でゲームが起動できるためリパックの必要はない。
  • Font は EFontCacheType::Runtime のため uasset のフォントに無い文字コードの場合は slate の font が使われる。
UE4の基本形といった所でしょうか。
まぁ、UEは内部のバージョンによって細々としたところが変わっていくので、今後色んな派生形が出てくると思います。

locres 編集した状態
EthanJP

フォントは置換していないが Runtime なので豆腐では無く日本語が表示される。
ただし、この場合若干の不具合も発生します。
最の字を見てみると、若干上の方が欠けています。
あとこのフォントでは CJK 互換の部分で C つまり中国のグリフが表示されます。

追記:移転後、フォント置換後の画像を表示していました。フォント置換前の画像に戻しました。

fuk リパック

fuk はアンパックした状態ではゲームが起動しない?ようなので
リパックする必要があります。

global.res(翻訳データ)リパックの仕方

global.res を data1.fuk にリパックする必要があります。

data1\locale\enus\global.res FileSize:190255, OrgFileSize:763086, Num0:701953, FileIdx:1371, FileOffset:7760670

これをもとにリパックしていきます。

まず、翻訳済みデータ global.res を data1.fuk の末尾にアペンドします。

アペンドする前の data1.fuk の末尾
09E6BF50: 87 E6 7F 03 55 79 07 CD 00 00 00 00 00 00 00 00

なので09E6BF60に global.res をアペンドする。
アペンドしたら末尾は上記の 09E6BF50 のように末尾まで XXXXXXXF まで 00 でパディングしてください。

0x9E6BF60  この値が新しい FileOffset になります。

翻訳済み global.res のファイルサイズを見ます。763,058 バイトだとします。

これからやることは上記のログを下記のようにするイメージ
data1\locale\enus\global.res FileSize:763058, OrgFileSize:763058, Num0:701953, FileIdx:1371, FileOffset:9E6BF60

まず FileSize 関連の変更

OrgFileSize:763086(0xBA4CE), FileSize:190255(0x2E72F)
LittleEndian で u32 なので CE A4 0B 00 2F E7 02 00 となるのでこのデータを検索して
global.res のファイルサイズ763058(0xBA4B2)から
B2 A4 0B 00 B2 A4 0B 00 に置き換える。
これで FileSize と OrgFileSize が変わった状態

次に FileOffset:7760670 を FileOffset:9E6BF60 に変更する。

offset は 0x7760670 / 0xF = 0x776067
67 60 77 00 の状態で格納されているのでこの値で検索、先頭データから検索する方が良いでしょう。
そこを 60 BF E6 09 に変更

これでリパックは完了です。

この状態だとフォントが置換されていないため豆腐で表示されると思います。


フォント置換

フォントは logic.fuk の locale\enus\font01.ttf と locale\enus\font01b.ttf を置換すると良い。
やり方は global.res と同じような感じ

これでも不具合が出る場合は logic.fuk locale\enus\font02.ttf
どこにあったか忘れましたが font00.ttf あるいは glyph_lib.swf も置換すると良くなるかも。

global.res 編集

文字データは data1.fuk の locale\enus\global.res に格納されている。
global.res はバイナリデータ

res の構造

struct Res {
    magic: u32,
    version: u32,
    entry_count: u32,
    entries: Vec<Entry>,
}
struct Entry {
    id: u32,
    offset: u32,
    size: u32,
}

export 処理:

entries[0] = 66 00 0D 00 80 18 01 00 36 00 00 00
offset = 0x11880, size = 0x36

シーク offset だが Res のヘッダー分(u32*3=0xC)もプラスする。
つまり 0x1188C から 0x36 バイト

3C 00 66 00 6F 00 6E 00 74 00 20 00 73 00 69 00
7A 00 65 00 3D 00 27 00 34 00 27 00 3E 00 3C 00
62 00 72 00 3E 00 3C 00 2F 00 66 00 6F 00 6E 00
74 00 3E 00 00 00

文字コードは UTF-16-LE で null 終端(00 00)
したがって "<font size='4'><br></font>" となる。
これを entry_count 繰り返す。

import 処理:

上記の文字列が "<font size='4'></font>" と変化した場合を考える。
"<br>" = 3C 00 62 00 72 00 3E 00 が削除なので

3C 00 66 00 6F 00 6E 00 74 00 20 00 73 00 69 00
7A 00 65 00 3D 00 27 00 34 00 27 00 3E 00 3C 00
2F 00 66 00 6F 00 6E 00 74 00 3E 00 00 00

となる。size が変わるということは、次以降の entry の offset が変わることに注意。

実装としては、文字列の size を計算しすべての offset を再計算してから
ファイルに出力すると良い。

↑このページのトップヘ