プログラミング・動画編集 備忘録

プログラミングや動画編集についての備忘録です

Starfield:ファイル解析2(メモ)

Starfield - Localization.ba2 ファイルの構造について。
正確な図では無いがこんな感じというもの。
なお、「翻訳グループ」といった名称は勝手に付けている名称。

アドレス バイト数 内容 説明
0x00000000 0x4 BTDX タグ。不明。とりあえずローカライズ用のファイルのタグとしておく。
0x00000004 0x4 02 00 00 00 不明。
0x00000008 0x4 GNRL 不明、ジェネラル(general)?
0x0000000C 0X4 1B 00 00 00 翻訳グループの件数。27件だが、言語種類が 9 で、翻訳グループの種類がそれぞれ 3 つで、27件。
0x00000010 0x4 C0 DE CA 06 このタグ全体での総バイト数で、タグ自体も含む。
0x00000014 0x12 不明。0x1Cまでの12byte分は何らかのフラグ的な情報か?
0x00000020 0x4 6A 60 E3 1E 言語種類。多分英語か。ここからを「翻訳グループ基本情報として、
36byteの構造が27回続く。
0x00000024 0x4 64 6C 73 74 翻訳グループ種類。64 6C 73 74 69 6C 73 74 73 74 72 69 の3種類がある模様。
おそらくそれぞれ、dlstrings ilstrings strings となると思われる。
0x00000028 0x8 8B B5 F6 29 00 01 10 00 不明。翻訳グループ27件、この部分は全部同じ。
0x00000030 0x4 EC 03 00 00 翻訳グループID情報の開始アドレス。この番地からこの翻訳グループでのID情報となる。
0x00000034 0x8 00 00 00 00 00 00 00 00 不明。翻訳グループ27件、この部分は全部同じ。
0x0000003C 0x4 68 71 11 00 翻訳情報の総バイト数。翻訳グループID情報の開始アドレスからテキスト情報の終わりまでのバイト数。
0x00000040 0x4 0D F0 AD BA 不明。翻訳グループ27件、この部分は全部同じ。とりあえず終端としておく。
: ここから残り26件、翻訳グループの基本情報が続く。
0x000003EC 0x4 BD 1F 00 00 翻訳情報の件数。
0x000003F0 0x4 78 73 10 00 テキスト情報部分の総バイト数。
0x000003F4 0x4 17 0E 00 00 IDと思われる。
0x000003F8 0x4 00 00 00 00 このIDのテキスト情報への、テキスト情報部分の開始点からの相対アドレス。
: ここから、翻訳情報の件数分IDとこの後の累計バイト数の情報が続く。
0x000101DC 0x4 55 00 00 00 テキスト情報のバイト数。テキスト情報Aのタイプのみ。
0x000101E0 0x55 UTF-8のテキスト情報。NULL終端。
: ここから、翻訳情報の件数分続く。
0x00AA86A6 0x1A テキスト情報。翻訳グループ種類が 73 74 72 69 の場合、テキスト情報部分でテキストのバイト数の情報がなくテキスト情報が続く
: 翻訳グループ数分、ID情報の塊りとテキスト情報の塊りが続いて終わり。
0x06CADEC0 0x2 1E 00 不明。この後に strings/starfield_de.dlstrings といった感じの文字列が続いてファイルの終了。
1E 00 部分はそのあとに続く文字列の種類を示しているのか、
その他に 20 0022 00 の3種類がある。

これで大体 BTDX の構造が把握できたので、とりあえず読み取るだけのものを作成。
次のような感じとなる。

後はテキストの文字数を減らしたり増やしたりして、バイト数や開始アドレスなどの情報を辻褄合わせたものがゲーム内で表示できればOK。

言語種類

Starfieldでサポートしている言語は次の通り。 help.bethesda.net

# 言語種類(4byte) 言語名
1 6A 60 E3 1E ドイツ語
2 A3 88 2A 90 英語
3 7A E4 2C F3 スペイン語 (スペイン)
4 2F 87 06 AF フランス語
5 D5 3E FD C1 イタリア語
6 FD 89 0D 87 日本語
7 9B 0F 91 49 ポーランド
8 2C EC FF F9 ポルトガル語 (ブラジル)
9 05 FE A9 D7 中国語(簡体字

並び順は Starfield - Localization.ba2 で出てくる順番。
最初に出てくる翻訳テキストのID 3607ニッサの貨物を届けた。これで彼女はレシピを完成させられるはずだ のそれぞれのテキストをGoogle翻訳して自動選択された言語で確認。

テキスト情報部分について

異なるIDで同一のテキストを利用しているケースがある。
例えば次の部分。

アドレス 16進数 10進数 説明
0x00000414 CB 1D 00 00 7627 ID部分。
0x00000418 AF 01 00 00 431 テキスト開始部分からの相対アドレスはず。ここでのテキスト内容は「Bereichsangriff」
0x0000041C CC 1D 00 00 7628 ID部分。
0x00000420 AF 01 00 00 431 違うIDだが、テキストは同一とするため、相対アドレスが同じ。

IDとテキストが1対1だと思い込んでいたので、当初何かのミスと思ったが、さすがにデータに異常があるはずもなかった。

データの最後の部分

0x06CADEC0 からはおそらく、言語種類と翻訳グループ種類に関する情報と思われる。
最初に2byteで何かの種類を示して、次に文字列の情報があるがnull終端ではない模様。
次のようになっている。

順番 何かの種類 文字列
1 1E 00 strings/starfield_de.dlstrings
2 1E 00 strings/starfield_de.ilstrings
3 1E 00 strings/starfield_de.strings
4 1E 00 strings/starfield_en.dlstrings
5 1E 00 strings/starfield_en.ilstrings
6 1E 00 strings/starfield_en.strings
7 1E 00 strings/starfield_es.dlstrings
8 1E 00 strings/starfield_es.ilstrings
9 1E 00 strings/starfield_es.strings
10 1E 00 strings/starfield_fr.dlstrings
11 1E 00 strings/starfield_fr.ilstrings
12 1E 00 strings/starfield_fr.strings
13 1E 00 strings/starfield_it.dlstrings
14 1E 00 strings/starfield_it.ilstrings
15 1E 00 strings/starfield_it.strings
16 1E 00 strings/starfield_ja.dlstrings
17 1E 00 strings/starfield_ja.ilstrings
18 1E 00 strings/starfield_ja.strings
19 1E 00 strings/starfield_pl.dlstrings
20 1E 00 strings/starfield_pl.ilstrings
21 1E 00 strings/starfield_pl.strings
22 20 00 strings/starfield_ptbr.dlstrings
23 20 00 strings/starfield_ptbr.ilstrings
24 1E 00 strings/starfield_ptbr.strings
25 22 00 strings/starfield_zhhans.dlstrings
26 22 00 strings/starfield_zhhans.ilstrings
27 20 00 strings/starfield_zhhans.strings

とりあえず

こんな感じで書き換えできるようになった。