太鼓さん次郎のセーブデータを解析したかった

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で。

できた。

できた。

スクリーンショット1 スクリーンショット1 スクリーンショット1

えぐられる。

続けて読む…

お菓子作り(Blender)

2017/06/04

Blenderで20世紀F○X風のOPを作る

2017/04/03

SICPの備忘録

2023/07/29

Blenderでフォトリアリスティック電球

2018/10/07

TypeScriptの型で全加算器から浮動小数点数,そして√2

2021/06/07

Blenderで能力者になる

2017/01/14

書いた人

sititou70のアイコン画像
sititou70

都内の社会人エンジニア3年生。Web技術、3DCG、映像制作が好き。