嵯峨のはてなブログ

ニコニコのブロマガから移転してきました。

ポケットモンスター金銀のボックス増殖バグはサブフレームリセットではない。 #AGDQ2021

※この記事はあくまで個人的に適当に思っていることであるため曖昧な表現が含まれます。
各ゲームの仕様を完全に理解しているわけではありません。(どちらかというとエンジョイ勢)
意見や感想または訂正等があればコメントまたはTwitterでの連絡をお願いします。

・この記事を書いた経緯
私は以前からポケットモンスター 金・銀のボックスを利用したポケモン増殖バグや
その他いくつかのセーブデータ上書き系のバグは
サブフレームリセットではないと考えているのですが、
大百科の記事にはポケモンの増殖がサブフレームリセットであるかのような記述や、
先日行われたAGDQ2021という海外のイベントでのポケモンRTAの解説さんも
あれはサブフレームリセットでサブフレームリセットはタイミングさえわかれば簡単
という風に説明されていたので
私なりの考えで訂正したいと思い筆を取らせていただきました。
多くの人に理解していただきたいので多少蛇足的な説明も含まれます、ご了承ください。
ゲームボーイだからリセットじゃなくってパワーオフだ!とかそういう話ではないです。

・ところであなたは誰ですか?
私はサガフロンティアのTASとか作ってる人です。
いくつかサブフレームリセットの解説動画を投稿していたり、
人力でのサブフレームリセットにも成功しています。
ロマサガ2サブフレームリセットTAS・RTA
クロノトリガーサブフレームリセットRTAに貢献しています。
好きなゲームは旧スクウェアRPG系です。
Twitter@kyotosagauoa

・そもそもサブフレームリセットというものは何か?
サブフレームリセット」と「チェックサム」の大百科を見ていただければ
詳しい説明がなされていますが、この単語を初めて聞いた人向けに超簡単に説明すると
(本来成功させるためには色々制約があるのですが少し割愛して・・・)
セーブ中にデータを上書きして二つのセーブデータを合体させていいとこどりをする技です
大まかに例を挙げると…
・所持金0円  持ち物 モンスターボール 5個     → セーブ
・所持金500円 持ち物 なし (モンスターボール売却) → 上書きセーブ中にリセット
・所持金は500円で持ち物はモンスターボール5個のデータが出来上がります。
(後述するチェックサム調整を行わない場合おそらく単純にデータが消えるだけですので注意)
"サブフレームリセット"はこのようなセーブ中のリセット行為を指して使われています。
その結果セーブデータ上書き機能の中断によるセーブデータの改ざん(合体)が行われます。
※改ざん行為自体をサブフレームリセットと呼ぶわけではない

この説明とサブフレームリセットの動画を軽く見た程度の人の理解としては
なんでもできる万能の裏技のように聞こえるかもしれません。

しかし無から有を生み出すことはできないのでデータを消して
急にお金やステータスをMAXにしたり色違いボルケニオンをゲットしたりはできません。
利用法としてはモンスターボールの例のように存在する物を組み合わせて増やしたり消したりするか、ありえない状況を作り出してゲームに不具合を発生させEDを呼び出したりします。
(本来触れられないオブジェクトを触ったり、アイテム欄に同じ名前のアイテムを複製したり、マップ番号を改竄してデバッグルームやエンディングに飛んだりします。)
またチェックサムと呼ばれる不正なセーブデータの検出方法があり、通常の方法では
前のセーブデータと上書きのセーブデータが合体したデータを作らせない働きをしています。
(普通はセーブ中に電源を切るとデータが消えたりするゾ☆)

チェックサムとはなにか
ゲームにおいてセーブデータが破損状態か否かを判定する数値で
おおよそはセーブデータの末尾に設定されている値です。
例えば1つのセーブデータにつき10個の値が保存されているとします、
値の例としては主人公の名前やアイテムの種類や数、マップ番号や座標、所持金などです。
セーブデータにはこれらが1~9個目に設定されていて
10個目には1~9の全ての値を足して合計した値が設定されます。
データの値とチェックサムの値にズレが生じた場合ゲームによっては
つづきデータを非表示にしたり、バックアップから上書きしてデータを復帰させたり、
不正だと判断してデータを消したりしてしまいます。
しかし、その1~9の値を誤魔化して総和を一致させれば不正なデータをそのままロードすることが可能になっています。

(実機でサブフレームリセットをおこなう解説動画です)

この映像はロマサガ2チェックサムを誤魔化した時のイメージ映像です。
下の1番目のキャラクターは2に相当する値を持っていますが
装備変更などをしてその値を1に減らし、上のデータに1番目のキャラだけ上書きセーブして
チェックサムの総和(6)を一致させています。(つまりセーブ途中のサブフレームリセット。)
これによりジェラールというキャラが消えたデータを正常にロードすることができます。
(レオン皇帝が2人になるので通称レオンレオンデータといわれている)
なかにはこのチェックサムという破損を検知する値が用意されていないゲームが存在します。
その場合は特に何もしなくても合体したデータをロードすることができてしまいます。

サブフレームとは
さて、少し本題(ボックス増殖≠サブフレームリセット)からズレてしまいました
話を戻して今回最もキーとなる単語です。
サブフレームリセットがセーブ中にリセットする行為だけであるのなら
ポケモン金銀のボックス増殖もその範疇かもしれませんが
肝心なのはサブフレームという単語です。下記はサブフレームリセットの大百科から引用

>フレーム単位よりも遥かに細かい、機械語に於ける1命令単位

>その1命令秒単位での任意のタイミングでリセットを行う事により、SRAMに保存している途中で、データ保存を止めてしまうことが可能となる。

1フレームが1/60秒であり、基本的にメッセージ1文字の描画にかかる時間です。
さらにロマサガ2の人力サブフレームリセットRTAについて取材された
電ファミニコゲーマーのもか氏の記事を引用させていただきます。引用元


つまりサブフレームリセットのサブフレームという単語は
超簡単に言えば1フレームよりも細かい単位の任意のタイミングということです。
今まで原理を簡単そうに説明してきましたが
サブフレームリセットはとてもタイミングがシビアで成功率が低いですよって事です。
一部の成功者は「ソシャゲでSSRを引くよりもお金がかからなくて楽!」とも語っています。
データを書き換えるのに1フレーム以上猶予があるリセットはフレームリセット
1秒以上の猶予があるリセットはセカンドリセットという表現になるのではないでしょうか。
サブフレームリセットと呼ぶのではなく、単純にセーブバグや上書きバグ、データバグ、
モカ引き抜き等と呼称すべきではないでしょうか。

サブフレームリセットの発祥
サブフレームリセットと言えば真っ先にTASを思い浮かべる人が多いと思います。
私の知る限りワードとしての初出は
クロノトリガーの2個目(Lsnes利用)のサブフレームリセット利用TAS(2012年)になります。
submitされたTASの説明文に「Uses sub-frame resets」と明記されています。
http://tasvideos.org/3606S.html

ちなみにこのTASと同じ猶予1byte(1機械語に於ける最小命令単位)という頭おかしいルートを
2020年の年末に実機でぶん回していてRTAinJapanが終わったあとに成功した頭おかしい
バンという人がいます。ヤバイ

(ニコニコに投稿されている動画よりこのほきゃほきゃしてる声入りの動画すこ)

もともとこのクロノトリガーのTAS(Lsnesというエミュレーター)が出るまでは
専用のデバッガを用いるか、すさまじい調整を行わない限り
サブフレームリセットはエミュレーターで実行することは理論上不可能でした。
データの最小単位として1フレームごとの記録しかできなかったので
フレームとフレームの境界の決まったタイミングでしかリセットができなかったのです。
(今も記録は1フレームごとだけどそのフレームの境界以外に入力やリセットを割り込ませることはできる・・・って感じだと私は勝手に解釈してる)
TaoTao先生のFF3でフレーム境界以外でのリセットによるSRAM書き換えの記事もよくわからなくても面白いので見てみると良いでしょう。
FF3はよりゲームを破壊してすぐさまエンディングを見るバグが存在するので無用ですが、
このサブフレームリセットが実機で成功するのかは気になるところ。
動画の方にはDQ3のACアダプタ抜き差しバグについてらしきコメントも見受けられますね。

世界で初めに作られたサブフレームリセットTASは
inich氏のクロノトリガーの1個目のTAS(2009年)になります。
この時代は入力やラグを利用してフレーム間のリセットタイミングを調整して
うまい具合にセーブデータを都合よく書き換えていたようです。
(ピロ彦先生曰くディレイスクロールのディレイ量調整みたいなもの、らしいです。)
また、クロノトリガーチェックサムが不一致で消えたデータでもロードできる裏技が存在しておりNO DATAと表示されたセーブデータを無理やり読み込んでいたりします。
詳しく知りたい方はTASVideosのページを見てみましょう。
http://tasvideos.org/2240S.html

実機上全てのリセットはサブフレームリセットと言える
一方で私たちが生きているこの現実には1フレームずつ結果が処理されるという事象はなく
リセットがフレームとフレームの境界でしか受け付けないという現象もないのです。
ゲーム機のリセットボタンを普通に押したときや電源を切った時は
エミュレーターではないので(セーブやデータ改竄の有無は関係なく)
それもサブフレームリセットとも言えるのです。
サブフレームリセット(Delayed Reset)ができるエミュレーターLsnesは、より現実の挙動に近づくために作られたということになります。
実機もチェックサムを計算して調整し、リセットを実行して狙って(試行回数を重ねて)いればセーブデータの改ざんに成功することができます。
バーチャルコンソール(エミュ扱い)などではロマサガ2クロノトリガーのサブフレームリセットは成功しないことが確認されています。フレーム境界でしかリセットができないからです。

一時期ニコ生の某RTA大会でサブフレームリセットの禁止というルールが制定されようとしていたのですが、「それはセーブ中じゃなくてもリセットできなくなるけど大丈夫?」と有識者から指摘が入った模様です。
ルールに明記するときは素直に「セーブ中のリセットによるデータ上書き行為の中断によるセーブデータの改ざん行為の禁止」とかにしときましょう。
セーブ中のリセット禁止だと、どこまでがセーブ中として定義するかという新しい問題が出てきてセーブしている雰囲気を演出するお祈りの曲が流れる時間をリセットでカットするテクニックが使えなくなったりしますからね。

とはいってもわざわざ普通のリセットをサブフレームリセットとは言わないでしょう。
セーブしようと思ってたのにセーブポイントの前で猫にサブフレームリセットされたぁ~」と表現したりするでしょうか
ポケモン金銀等で言ってることはこれに近いです。

ポケモン金銀の場合
ご存じかとは思いますが、まずはポケモン金銀のボックス増殖の説明をおこないます。
ポケモンを2体以上連れた状態でポケモンを1体以上預けて、ボックスのナンバーを変更する。
上書きセーブされるので「でんげんをきらないでください」が表示された瞬間電源を切る。
これで手持ちとボックスの中に同じポケモンが存在(同じデータのポケモンを2匹に増殖)することができます。

基本的にはパソコンの前でセーブしてからこの裏技をおこなうので見落としがちなのですが、
この裏技セーブではボックスの中のポケモンだけが先にセーブされていて、
しばらくしてからキャラクターの位置やイベント進行度、持ち物などがセーブされます。
詳しい仕様はポケモンWikiに書いてありました。
https://bulbapedia.bulbagarden.net/wiki/Cloning_glitches#Generations_I_and_II

またチェックサムもボックスの中は含まれていないようなので
ボックスの中がどう書き換わろうが不正なデータとして処理されることはないようです。
(0x2D0Dがチェックサムでそれ以前の合計値を集計している、2つめのチェックサムは1つめのバックアップ用でどちらか片方のチェックサムが一致していない場合はチェックサムが一致しているデータをロードできるようだ)
https://bulbapedia.bulbagarden.net/wiki/Save_data_structure_in_Generation_II#File_structure
気をつけるのは手持ちのポケモンやプレイ時間が書き換わる前にリセットをする必要があるということぐらいでしょうか。

(余談ですがボックス増殖を応用して複数の御三家やイーブイを入手できます。
初めに御三家をもらう前にレポートをしてからポケモンを1体もらい、
ボックス増殖リセットをすることでもう一度ウツギ博士から御三家をもらうことができる。
そのあとボックスの中に預けておいた御三家を引き出すことができます。)

電源を切るタイミングですがネット上で調べてみると割とバラバラだったりします。
例えば
「でんげんをき」でリセット、
「でんげんをきらないでください」でリセット、
「でんげんをきらないでください」と出て少し経ってから電源を切る
など結構いろんなタイミングで成功するようです。
つまり成功する猶予が1f以上あり(下手すると数秒?)その上失敗が少ないということです。
フレーム境界外の狙った数値が上書きされてからリセットする必要もないので
単にボックス増殖バグという名称が良いのではないでしょうか。
また互換機のリセットや3DSVC(実質エミュ)のポケモン金銀でも問題なく成功するようです。
フレームの境界でも問題なく増殖できるという事はサブフレーム技ではないということです。

・アニメティカ
アニメティカ利用RTAも性質上セーブデータの上書きやその中断であるので
よくサブフレームリセットと誤解されるが、何度か説明している通り
セーブデータの改ざん行為自体をサブフレームリセットと呼ぶわけではありません。
猶予が1フレーム未満のものについてはサブフレームと定義できます。
アニメティカ利用RTAのメモカ引き抜きは猶予が最短でも2フレーム*と言われており
サブフレームリセットと比較すると大幅な猶予時間があります。
詳しくはPing値氏のDQ7アニメティカ利用RTAのチャートを参照してください。
アニメティカ利用RTA発案者のとどトドさん

アニメティカを利用したメモカ抜き差しによるセーブデータの改ざんはサブフレームリセットではないと考えているようです。

(*最短1フレームだそうです)

同様の理由でテイルズオブデスティニーメモリーカード引き抜きバグもよく話題に出ますが
私はプレイ経験とバグ自体を試した事がないので何とも言えませんが
おそらくこれも猶予は1f以上あると思われます。
このゲームは上記で説明したチェックサムがなく合体データのロードをすることができます。
(ただしタイミングによってロードできない時もあるらしい?)
他にPSでチェックサムがないゲームとしては
チョコボの不思議なダンジョンが存在しており、そちらで私が試した動画があります。

何度か試しましたがだいたい数十フレームは結果が同じになります。
(引き抜くのが遅いと完全にセーブされてしまう。)
少なくとも猶予1フレームというレベルではなかったです。

・FC版ドラゴンクエスト3の電源ON/OFFバグ
メモリがグチャグチャになるだけだからサブフレームリセットではない
電源を切るタイミングはおそらく1フレーム以上猶予があるが
その後の処理は・・・
詳しくはピロ彦先生のはてなブログへどうぞ

なぜ"電源ON/OFFバグ"は発生するのか? ~ファミコンドラゴンクエスト3

pirohiko.hatenablog.com

・結論
セーブデータ改竄に猶予が1フレーム以上あるセーブデータ上書き系のバグは
サブフレームリセットではない。
サブフレームリセットはタイミングもわからないけどできるまでやれば成功するから簡単だ。君もぜひサブフレームリセットに挑戦しよう。



挑戦者が減るのが嫌であんまり難しい難しいって言いたくないし本当に思ったよりできますよ!

2021/01/16 追記
この記事に対する反応で面白いものがあったのでいくつか紹介させていただきます