壁抜けモード、不完全理論
なかよしバッヂ導入チャートでも途中で触れた壁抜けモードについての解説になります。
まぁこのどうぐを使えば壁抜けできるんだくらいの認識で構わないのですが。
どうしてこうなるの?
自由に壁抜けできない!
といった疑問を浮かべる人向けのページになります。
どうしてこうなるの?
ということから簡単に解説していきます。
なぜかを一言で済ませると、
「壁抜けモード」では
内部RAM:CFB2hの値が通常01hなのに
対してFFhになっています
なんて言っても分かるわけありませんよね。
とりあえず ふつうは01hなのにFFhになるということだけ置いてください。
まず、壁抜けモードに入れるどうぐの条件というものを教えます。
ぶっちゃけこのページにまとめてるので
赤い文字に注目してもらえれば分かる話ですが、
どうして分かったの?って話ですよね。
まずプログラムのサブルーチン30F2hでプログラム分岐が決まります。
これは内部コードの値から分岐先を決めていくパターンでキリがないので結果だけ述べると、
内部コードが80h以上の道具は
内部コードから80h引いた道具の処理を適用します
~~~~~~~~~~~~~~~~~~~~~~~~~
なぜ80h引くか?というと、プログラム実行中にコードが2倍され、7bit目が無視されるためです
具体的にはどうぐ内部番号の81~C3が該当します。
C4以降のわざマシンはわざマシン用の処理が行われるため問題ありません。
そのためどうぐ内部番号54~80こそが使用するとメインメモリに直接ジャンプされ、アクセスする効果を持つわけです。
なかよしバッヂもそのうちの1つというわけです。
また、使用するとフリーズする可能性があるのも逆に言えばこの45個だけなのです。
こう聞くとちょっと安心して変な名前のどうぐにもAを押す勇気出ませんか?
がんばれ♡がんばれ♡
~~~~~~~~~~~~~~~~~~~~~~~~~
というわけで脱線してしまいましたが、
なかよしバッヂ導入チャートでも利用した壁抜けモードに入れるどうぐである
にゅうりょく(どうぐ番号A8)は80h引くと、
ふしぎなアメ(どうぐ番号28)と同じ処理を適用します。
※同じ処理であって同じ効果ではありません。
ちなみに同じく壁抜けモードに入れる、
グリーン(どうぐ番号B5)はげんきのかけら(どうぐ番号35)
シゲル(どうぐ番号B6)はげんきのかたまり(どうぐ番号36)
空白(どうぐ番号BC)はおいしいみず(どうぐ番号3C)
が80h引いた処理となります。
※赤だと名称は異なりますが番号は一致してます。
ちなみに場所限定壁抜けと書いてあるどうぐは名前が20byte以上ある長い名称のため
どこでも利用できるわけではありません。どちらかというと闇ショップ化のトリガーのほうが適任かと思います。
というわけで条件を書くとこうなります。
名前が20byte未満
内部コードから80h引くと戦闘時以外でポケモンに使えるどうぐ
この2つを満たすと壁抜けモードに入れます
さて、壁抜けモードに入れるどうぐが判明したところで、
なぜCFB2hの値が戻らないのか?となりました(ありす個人が思っただけで普通の人がそう思うことはないです)
原因はプログラムの分岐までさかのぼりました。
CFB2hというのは画面に関するメモリでした。
ここでいう画面とはフィールド画面とバトルorポケモンでの画面のことです。
フィールドでは01h、バトルorポケモンではFFhに設定されています。
ここで話を、どうぐの処理まで戻しますね。
どうぐには特定の処理が分けられており、4種類に分類されます。
・通常処理ーどうぐの使用処理を行ったあとどうぐ欄に戻します。
スプレー類、コインケースなどが当てはまります。
・別枠処理ーどうぐの使用処理を行ったあとフィールドに戻ります。
あなぬけのヒモ、つりざおなどが当てはまります。
・ポケモン処理ーどうぐの使用処理を行ったあとCFB2の値を初期値に戻します。
進化系の石、わざマシン類、スピーダーなどが当てはまります。
・じてんしゃ処理ー『つかう すてる』をスキップし、サイクリングロードか否か判定、その後処理を行いフィールドに戻ります。
じてんしゃ、あ゙ネふ4ぬ゙へカぅダイ゙え゙┛8パィ゙ゴへィの2つが当てはまります。
では
壁抜けモードに入れるどうぐを使用した際どうなるでしょう?
処理をした後、どうぐ欄に戻りますね?
つまり通常処理を行うどうぐに分類・・・
って、ちょっとまてぃ!
80h引いた処理は、ポケモン処理のどうぐの効果処理じゃないですか。
それが壁抜けモードに入れるどうぐの条件ですからね。
つまり
壁抜けモードに入れるどうぐは
ポケモンに使うどうぐなのに通常のどうぐに「へんしん」していたのです
そのため、CFB2hの値がFFhから00hに戻す処理が行われず、
このようなことになってしまった、と推測されます。
え?肝心のどうして壁抜けができてしまうかが気になるって?
画面に関するメモリが正しくないせいで壁抜けできちゃうんですよきっと(ぇ
のひとことで終わらせたいのですけど、分かっている範囲のみで説明します。
壁抜けモードに入れるどうぐを使うと
CFB2hがFFhから更新されないというのはなんとなく理解できましたね?
FFhという状態は言ってしまえば主人公が表示されていない状態です。
バトル中やポケモン選択中は居ませんよね。
メニューを開いてる際は表示されているので歩行できない状態とは違います。
そのような状態にも関わらずフィールド画面に戻ってしまったのです。
主人公が透明になったのはそのためです。本来描写されませんから。
+して左上のポケモンアイコンが消えないのもそのためです。
画面の更新が行われていないのですから。
この状態で歩行するとどうなるか?
主人公の向きが更新される処理が行われないまま歩行します
そのため目の前が歩行可能かどうかの判定も無視されるということです。
しかし例外がありますので次のコーナーで説明をしますね。
さて、壁抜けの原理も分かったことで次の疑問にお答えしましょう。
自由に壁抜けできない!
もう上の行でほとんど答えを言ってしまった感がありますけど続けます。
さきほど述べたように目の前の当たり判定を無視しているというのは、
半分YESで半分NOです
というのも、なかよしバッヂを入手する手順で例にしますが
主人公の向きに注目してください。
右側を向いてますよね。
この方向なら目の前は普通に通れる場所です。
そのためここで壁抜けモードに入ると上下左右どこでも進めます。
ではこちらはどうでしょう。
主人公は下側を向いてますね、下側は通れない場所です。
つまり障害物判定が目の前にあるのでこの状態で壁抜けモードに入ると
上下左右どこにも行けないということになります。
そのため、進む際には使ったときの主人公の向きと進行方向の一歩先を意識しましょう。
ちなみに、NPC・ポケモンのシンボル・いあいぎりで切れる木・かいりきの岩
この4つは目の前にあっても壁抜けできます。
また、なみのり状態なら海が目の前にあっても壁抜けできます。
ちなみにこうなるとどこにも動けなくなります。
そらをとぶ・テレポート(洞窟の中ならあなぬけのヒモ)で脱出しましょう。
もし脱出できないなら詰みます。
以上が、壁抜けモードの解説でした。
それともうひとつ、任意コード実行による万能壁抜け状態について。
ニックネームから、ヅばへブゾ ブビワくゾ ズズワデの
この順番に並べて起動できる任意コードです。
壁抜けモードと異なり目の前に障害物があろうと海でも渡れるという状態になれます。
正直ほかの任意コード実行中(=ほかのボックス使用中)でなければずっとこの状態で居るべきといってもいいくらい便利なコードです。
原理としては、どうぐの32番目でセレクトバグを実行した直後に段差を降りることでこの状態に入れるというバグを基にしていますが
そのルートだとフラグが壊れちゃう副作用が危険で、レポートを書けるようなデータに出来ませんでした。
しかし裏を返せば、段差を降りることをトリガーに万能壁抜け状態になれるという部分だけをいいとこ取りしてしまえばいいわけですよね。
段差から降りている間はCD38が0x01から0x02になります(着地すると0x01に戻る)
この0x02から戻らないことにより常に段差を降りている間をキープすることで障害物か否かの当たり判定を無視しています。
この万能壁抜け状態の任意コード実行ができる、というのもあって個人的には壁抜けモード自体が使う機会も少ないと思っており記事にするべきか迷っていたのですが
・任意コード実行が発見される前まではメジャーなバグ技であること
・なかよしバッヂを速い段階で入手するには壁抜けモードが必須
という2点から、検証記事を作成することにしました。
今回は以上になります、お付き合い頂いてありがとうござました。
あ、そうそう
ありすの推しである、紫咲シオンちゃんのかわいいイラストを描いてくれました。
依頼を受けてくれた、チビクロちゃんにこの場を借りてお礼申し上げます
ありがとーっ!