Starfield:ファイル解析1(メモ)
概要
これまで趣味でSkyrimeやMorrowindのMod作成用のエディタを作ってきたので、今回 Starfield でも同じようなものを作ってみようと思っている。
Skyrimなどの時はこちらのサイトを参考にさせてもらった。
en.uesp.net
Starfield はとりあえず「Starfield file format」で検索かけたらこちらが見つかった。 starfieldwiki.net
まだ解析途中のようなので、とりあえずわかりやすそうなローカライズのファイルを調べてみることにする。
ローカライズのファイル
Starfield - Localization.ba2
というファイルがあるので多分これ。
FavBinEdit にてUTF-8にて、ゲーム中のメッセージを検索すると見つかるので多分そうなのだろう。
ざっと流し見すると、 0x03C17A68
番地から日本語がずらっとあるので、この辺りからなのかもしれない。
最初の4byteが文字列のbyte数(赤枠部分)で、そのbyte数分読み込んで末尾は 0
となっている。(青枠部分)
ではこれがどこまで続くかとなると、赤枠部分の手前 4byte 部分。0C EA 11 00
(リトルエンディアンなので、実際には 11 EA 0C
)がこの日本語の全データ長となると思われる。
0x03C17A68
から 0x11EA0C
分ジャンプすると次の部分の先頭に飛んだので、日本語1つ分サイズが合わないが・・・(おいおい調べていく)
一旦ここで日本語が途切れるが、少しスクロールさせると日本語があるので、何らかの種類別になっていると思われる。
ただ、この前後で 4文字のタグらしきものが見当たらないので、もっと大きな範囲で設定されているのかもしれない。
ともかくも、やはりデータ長+データ本体の繋がりで出来ているので、最初から順に読み取った方がわかりやすいのかも。
とりあえず日本語部分を抜き出してみる。
Visual Studio 2022のC# Windowsフォームでざっくり作成。
久々に触るので操作どころかコードの書き方も大分忘れている。
とりあえず、日本語のある部分で100個分だけ取り出してみる。
var openDlg = new OpenFileDialog(); if (openDlg.ShowDialog() == DialogResult.OK) { var path = openDlg.FileName; var br = new BinaryReader(new FileStream(path, FileMode.Open, FileAccess.Read)); var bs = br.BaseStream; var count = 0; bs.Seek(63011432, SeekOrigin.Begin); while (bs.Position != bs.Length) { var len = BitConverter.ToInt16(br.ReadBytes(4), 0); var str = Encoding.UTF8.GetString(br.ReadBytes(len - 1)); br.Read(); textBox1.Text += str + "\r\n"; if (count++ > 100) { break; } } }
一応抜き出せている。とりあえずここまで。