太鼓さん次郎のセーブデータを解析したかった
2016/12/31解析した**'かった'**
重要
背景
時は2016年12月30日。6時間に及ぶ大掃除を終え、疲労困憊の午後7時である。
事のあらまし
太鼓さん次郎のセーブデータ解析したい。
しよう。
はなまる幼稚園でも作業BGMにしながら。
どうせ1時間もあれば終わるだろう。
それらしい値がとれたぞ。
ハイスコア2億点ってなんだ。
原因がどうにもわからない。
つらい
原因がどうにもわからない。
つらい
原因がどうにもわからない。
次郎のバグだろう。どう見ても。
次郎ってC++だっけ。C#?
とりあえず適当にCで再現コード書いてみる。
本当に再現した。
おもむろにteratailに登録する。
すったもんだありまして
原因が次郎のバグだとわかり、
大晦日になりました。
早くリリースして寝たい。
早くリリースして寝たい。
もう太鼓さん次郎のセーブデータ解析 したくない 。
TJAランダムセレクターv4.1.0をリリースしました。
はなまる幼稚園4話を見終わりました。
はなまる幼稚園4話?
勘違いするなよ、2週目 だ。
連続再生、12話の次は1話に戻るものとする。
はなまる幼稚園換算で16話、約6.4時間もの時間、ぶっ続けで開発していたことになる。深夜である。
何故解析するのか
TJAランダムセレクターという物がある。 他の人は知らないが、私は結構お世話になるソフトウェアである。 ハイスコアが分からないと、ちょっと気持ち悪い。 例えばフルコンを逃しても、前にフルコンしてたかどうかわからない。 落ち込めば良いのかどうかわからない。
結果
セーブデータはいくつかのフレームで構成されている。難易度毎に1フレームが割り当てられる。 フレームは難易度の簡単な順に記録されている。 フレームの内部構造は次の通り。
オフセット(byte) | 値の意味 | 型 |
---|---|---|
0 | コース | 16bitInt(Little-Endian) |
2 | スコア | 32bitInt(Little-Endian) |
6 | 良の数 | 16bitInt(Little-Endian) |
8 | 可の数 | 16bitInt(Little-Endian) |
10 | 不可の数 | 16bitInt(Little-Endian) |
12 | 連打数 | 16bitInt(Little-Endian) |
14 | クリアマーカー(冠) | 16bitInt(Little-Endian) |
各値の詳細は以下の通り
コース
値 | 意味 |
---|---|
0 | かんたん(Easy) |
1 | ふつう(Normal) |
2 | むずかしい(Hard) |
3 | おに(Oni) |
4 | Edit |
クリアマーカー(冠)
値 | 意味 |
---|---|
0 | 新?(原則ありえない) |
1 | 無し(ノルマ又はハード落ち) |
2 | 銀(ノルマクリア) |
3 | 赤(ハードクリア) |
4 | 金(フルコンボ) |
ここまでは
1時間もかからなかった。
次郎のバグ
バイナリモードでなく、テキストモードでセーブデータを書き込んでしまっている。
言われてみれば確かにそうなのだが、 全く気が付かなかった。
これに関してはterateilの皆さんが解決してくれたので、ここでは詳しく言及しない。
続きはWebで。
できた。
できた。
えぐられる。