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

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

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;
                    }
                }
            }       

一応抜き出せている。とりあえずここまで。