ピロ彦の何か置き場

MOTHER 2 TAS の補足

※注意:TASの操作は大変危険なものですので決して真似しないでください。


今回のTASでは今までのTASで使われていた[snes9x-rr]ではなく、[Lsnes]という現時点で最も再現度が高く実機に近い挙動をするSFC用TASクライアントを使用しております。

TAS製作時における最も大きな違いは、サブフレームでの入力を可能にしていることです。

Lsnes以外では、1フレーム=1/60秒の精度での操作が記録され、リセットを受け付けるタイミングもフレームフレームの切れ目に限定されていまが、
Lsnesでは機械語1命令単位の任意のタイミングでのリセットが記録可能になっています。
もちろん、実際のSFCはいつでもリセットを受け付けているわけですから問題ありません。

セーブ中のリセット

セーブデータが上書きされてる途中でリセットすると、一体何が起こるでしょう?
多分、セーブデータが消えてしまうゲームが多いと思われます。
しかし、ほんのちょっと狂っただけですべてのデータが消えるわけではありません。
では、一体何故セーブデータが消えてしまうのかというと、プログラムが不正なデータを検知して消してしまう処理があるからです。
DQ3等は呪いのBGMが鳴っている間にデータを綺麗サッパリにしてるなんて話も聞きます。

セーブデータが消えにくいゲームでは不正なセーブデータを消す処理がそもそもないものもありますが、MOTHER2の場合は1つのセーブデータに対してもうひとつ同じミラーデータ存在し、片方のデータが壊れていたとしても復元処理が働きます。
このため、MOTHER2でセーブデータ消失メッセージを見たことがある人は少ないはず。
※追記:ただし、データ頭の[HAL Laboratory, Inc.]に欠損があった場合は消失メッセージ無しに一発で消えます。

チェックサム

エラーチェックの方法として、チェックサムを記録してデータ範囲との整合性を計算する手法があります。
DQ復活の呪文などで、最後の1文字がチェックサムになっていたりします。
チェックサムアルゴリズムには、データ範囲の単純な総和をとったものや、排他的論理和(XOR)をとるものなどあります。

ではMOTHER2がどういうチェックサムを使っているかというと……
その両方を使っててかなり不正しにくいシステムになってました_(:3 」∠)_

1つ目のチェックサムは、 0000020から00004FF の値を1バイトずつ加算したものの合計2バイトで、2つ目は2バイト(16bit)ずつの値をXORにかけたものです。
XOR(排他的論理和)とはビット演算の1つで、2進数での同じ位置のビット同士が1と1・0と0の場合は0を返し、1と0・0と1の場合は1を返します。
例:_ 11111111 00000000 (FF00)
XOR 10001000 10001000 (8888)
__= 01110111 10001000 (7788)

ゲームをはじめる

設定を選択・変更するだけでもセーブデータは更新されますが、実はゲームデータが存在してるかどうかを判別しているのは「PKキアイ」のKの字が存在してるか否かだけです。
チートで[7E9ADA=00]にした状態でセーブをすると、当該データが「ゲームをはじめる」状態になって、強くてニューゲームのようにデータがそのままスタートされます。
逆に、ゲームデータが無い状態で[7E9ADA=4B]などにして、文字表示速度などを変更してキャンセルすると、いろんな値が0のままゲームを再開できるようになります。

では、チートをせずにTASの操作だけでそれを実現するにはどうしたらいいでしょうか。

チェックサムを突破するために

なにはともあれ、セーブデータをどうにかするにはチェックサムをごまかさないと始まりません。
設定画面で変更される値は、表示速度[01~03]サウンド[01~02]ウィンドウタイプ[01~05]と、「ゲームをはじめる」を選択してからの経過フレーム数(2バイト)だけです。
ある程度自由にできるのが経過フレーム数だけなので、ひたすら待つ羽目になりました。

一方で、PKキアイその他のデータはネスがベッドから降りた瞬間に初めてセーブされます。
MOTHER2で名前に使用できる文字の中で値が小さいのは 0x20="空白"、0x25="-"、0x26="~"、0x30="0"、0x31="1"...となっていて、0x20未満は命令文字となってます。
計算の結果、「PK-」という必殺技名をつけるのが最適であると判断しました。
空白文字を入れたほうが速そうに見えますが、残念ながら計算が合いませんでした。
数値に対応した文字の読み方に関してはMOTHER2 TBL」でググれば出てきます。

この時、セーブデータは上からではなく下の方から更新されていきます。
「PK-」のKがセーブデータに書き込まれ、Pが書き込まれる前にリセットします。
すると、電源入れた直後の最初にエラーチェックが行われ、当然不正なデータなのでセーブデータの消去後ミラーデータからの復元処理が行われます。

消去処理されてる途中で更に「K-」だけ残るようにリセットをすると、
チェックサム[7000 254B]と一致するデータになります。
0x4B00 XOR 0x0025 = 0x4B25
0x25 + 0x4B = 0x0070
チェックサムが一致したので復元処理はされなくなります。

ゼロの領域

あらゆる値が0のデータとは一体どういうものなのでしょうか?
レベルもHPも0なだけではなく、なんとPT人数0人な上に座標[0,0]から再開されます。

このデータは再開した直後に生存人数0人と判定されゲームオーバーになりますが、1フレームだけチェックまたはメニューを開くことが出来ます。Aボタンを押しっぱなしでもOKです

座標[0,0]はグミ族の村の左上隅位置し、テントバグネス家崖上のようにテキストバグを引き起こすことが可能な場所です。
ここでうまくテキストバグを引き起こすと、「ム     」「うロえロ   」などの文字列が表示されますが、文字表示ウェイトになっているために一瞬で通り過ぎます。
また、ウィンドウタイプなので、ウィンドウのカラーパレットがバグってます。

ここで、1PYS↓←02PBY↑XLR03を同時に押すことで、08 56 79 C8 00 という命令が実行され、テキストポインタC87956へジャンプする処理がなされます。
0とか3とかいうボタンってなんじゃい?と思うかもしれませんが、SFCのコントローラの識別信号として実際に受付けているもので、スーパースコープか何かを挿すと色々と押しっぱなし判定になります。
これはSnes9x等では入力信号として認識されませんが、Lsnesではちゃんと処理されます。
そんな入力ずるくない?と思われるかもしれませんが、過去にはスーパーマリオワールドGlitched TAS で普通に使われていたので問題無いと判断しました。

また、この入力のお陰でデバッグメニューを経由せずに TO BE CONTINUED.. にたどり着くことが出来たので、むしろ前回より正当なクリアといえるでしょう。

みんなは真似すんじゃないぞ!ちゃんとプレイしろよ!!