MOTHER 2 TAS の補足
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

MOTHER 2 TAS の補足

2013-10-11 17:29
  • 52

※注意: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.. にたどり着くことが出来たので、むしろ前回より正当なクリアといえるでしょう。

みんなは真似すんじゃないぞ!ちゃんとプレイしろよ!!
広告
他42件のコメントを表示
×
全く分からん
71ヶ月前
×
とりあえず「エミュレーターの精度が上がったことで再現できるようになった」ということは理解した
71ヶ月前
×
書いてあることは一応理解しました。
ほんと、「どうやってそこにたどり着いたのか」という経緯を知りたくなりました。
70ヶ月前
×
>>47
MOTHER2でセーブ中リセット技使えるかなー?
仮に成功したらどうなるかなー?
X座標とY座標の上書き中にリセットしたら部屋から抜け出せるかなー?
チェックサム調べるかー
とりあえずどこかの値と 00 00 の部分を入れ替えたら正常に読み込まれるなー
偶数バイトと奇数バイトを入れ替えるとチェックサム通らないなー
どうやらXOR型と加算型の併用らしい。
とりあえず0で埋め尽くしてみるとやっぱり通らない。
セーブデータに保存されるメモリ領域を見て、どこかがセーブデータ存在符号になってるか推測する。
ワオ!のタイミングでPKキアイのPKの部分が書き込まれるので怪しいと思い、そこだけ追加してみると成功。
すべてが0のデータだと色々と面白いなぁ~
すぐ全滅するけどポタン連打してたらウィンドウ開けたわ。
0,0地点だとテキスト暴走余裕でした。
あとはチェックサムをチート無しに通過できる条件を探す・・・・・・
探す・・・・・・
探す・・・・・・・・・・・・・・・・
探す・・・・・・・・・・・・・・・・・・・・・・・・・

┌┴┐┌┴┐┌┴┐ -┼-  ̄Tフ ̄Tフ __ / /
  _ノ   _ノ   _ノ ヽ/|    ノ    ノ       。。

       /\___/ヽ
    /ノヽ       ヽ、
    / ⌒''ヽ,,,)ii(,,,r'''''' :::ヘ
    | ン(○),ン 
70ヶ月前
×
>>48
お、お疲れ様……
62ヶ月前
×
いまいちどうでもいいけどCONTHINUEDになってるよ
51ヶ月前
×
>>50
二年間誰も指摘してくれないなんて!!:(;゙゚'ω゚'):
51ヶ月前
×
過去動画で4分クリアはフェイクといってたのに4分クリアしてみせる変態
48ヶ月前
×
チートを使って出されたフェイクタイムを本当にTASで達成する功労者
46ヶ月前
×
これの手法が今や大流行ですね。
17ヶ月前
コメントを書く
コメントをするには、
ログインして下さい。