##はじめに
この記事はカルネージハートポータブルの大会支援用ツールを作った時の話です。
かなり昔に作ったものであんまり覚えていないですが記憶を頼りに書いてます。
##使用ソフト
セーブデータの解析にはStirlingというバイナリエディタを使用しました。
Stirlingの下記3つの機能を使っています。
- 2つのファイルの差分を比較する機能
- struct.defファイルを編集して構造体を定義する機能
- 選択範囲のデータの合計をステータスバーに表示する機能(設定で追加)
##セーブデータの解析
1、カルネージハートのセーブデータは固定長なので同じサイズの構造体をstruct.defに追記します。
書式はstruct.defに書かれている内容を参考にすればわかると思います。
たしか、こんな感じからスタートしていたと思います。
struct SAVEDATA
{
BYTE data[ファイルサイズ];
};
2、まずは何も変更しない同じ状態のセーブデータを2つ作成してStirlingで差分を比較しました。
同じデータになると思うのですが、実は二か所違っている範囲のアドレスが出てきます。
そのアドレスに合わせてstruct.defの構造体を修正しました。
最初は何のデータかわからなかったのですが、後になって保存した時間とチェックサムだったことがわかりました。
※チェックサムを間違えているとPSPでは壊れたファイルとして扱われます。
※チェックサムが合っていてデータがおかしい場合は読み込めるのでPSPがフリーズします。
3、次に2と同様の手順ですが、何か1つの要素だけ変更してほぼ同じ内容のセーブデータを2つ作成していきました。
たとえば、機体を1つだけのセーブデータとその機体を2にコピーしたセーブデータを作ります。
Stirlingでその2つのファイルの差分を比較して、機体のデータが繰り返しになっているアドレスを見つけてstruct.defを修正します。
ここからは修正時の構造体の変数名は後でわかりやすい名前を付けるようにします。
他にも必要と思われる情報の機体名、チーム名等、かなり地味な作業を繰り返してデータのアドレスを確認していきます。
4、チェックサムについては調べるのは大変そうと思っていたのですが、
時間が増えたときにチェックサムも同じ分が増えていたので運良くおおよその検討がつきました。
Stirlingでステータスバーに選択範囲のByteの合計だったかな?を表示させて一致するものを探しました。
##プログラムの作成
1、struct.defファイルの構造体の内容をVC++の書式に書き換えて、ファイルをバイナリ形式で開いてデータをそのまま構造体に渡しています。
この時ファイルサイズやチェックサムでファイルが壊れてないか等の確認処理も一緒にしています。
2、データの編集はすでに構造体が定義されているのでプログラムで扱いやすい状態になっています。
内部処理は扱いやすい構造体を別に定義して、入力用の配列と出力用の配列2つを移動させて位置を入れ替えできるようにしています。
あとは使いやすいUIをどうするかを考えて実装していきました。
3、最後にチェックサムを計算してファイルに保存すれば完成です。
保存前に最大チーム数と機体数の確認もしています。
データを解析していない所や触らない部分は読み込んだファイルのデータを再利用しています。
初期バージョンでは初級演習場で固定でしたが、後のバージョンでは一番最後に読み込んだファイルの対戦環境のデータをそのまま保存時に使用するように変更しました。
##最後に
現在の環境ではわかりませんがプログラミングの勉強の題材としては良かったです。
ツールを作り始めるとゲームに帰ってこなくなることがあるので注意かもです。
最近はプログラム教育とか流行ってそうですし、Nintendo Switchと相性もいいと思いますので、カルネージハートの新作発売されないかなーと思ってます。
最後まで読んで頂きありがとうございました。