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 00 と 22 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 |
とりあえず
こんな感じで書き換えできるようになった。