これまで、ありすは有用性のあるどうぐである
なかよしバッヂ・てへ・壁抜けアイテム(にゅうりょく等)といったどうぐを仕組み・解析付きで紹介してきました。
ですが、効果こそ分かっていても仕組みが分からずにいたあるどうぐがあるのです。
『はやぶさバッヂ』です。
こちらのどうぐについて、今回は解説していきたいと思います。
特殊すぎる挙動と書いたのには一言で説明するには筆舌に尽くしがたい効果が隠されているからなのです。
では、まずそもそもこのどうぐを使うとどうなるのでしょうか?
~フィールド編~
百聞は一見にしかず、です。早速下のスクリーンショットをご覧ください。
はい
なんとメニュー画面が開きましたね。
メニューを開いているのに二重でメニューが発動しています。ちなみにこのままBでキャンセルをするとすべてのウィンドウが閉じてフィールドに戻ります。
『グループを閉じる』かのような処理になっていますね。
ちなみにポケモンセンターの看板に向きながらはやぶさバッヂを使い、Aを押すと
説明が見れます。
と、いうことはメニューを開きながらもフィールドでのAボタンの処理は行われるということになりますね。
トレーナーにAを押すとバトルに入りますよ。
では、バトル中に使用するとどうなるのでしょうか?
~バトル編~
バトル中にも関わらず、メニューが開けてしまいました。なんてこと
このままメニューを閉じると・・・
こうなります
ここ、7ばんどうろの草むらなんですけど面影分かります?
このまま歩行することも可能ですが一度建物に入ったりしてマップを切り替えない限りずっとこのような画面になります。
さて、一見フィールドに戻ったかのように見えますがここでボールを使用すると
実はまだバトルの最中だったようです。
きっと野生ポケモンと連れ歩きしていたのでしょう。
一度こうやってボールで捕獲したあとも実はまだバトルの終了コマンドが実行されていません。
試しにマスターボールを投げると・・・
なぜかさきほどまで居なかったメタモンが捕まってしまいます。
いったいどこから出現してきたんですか・・・
ちなみにバトルの処理終了するコマンドが実行されていないため
フィールドに帰ってきてもじてんしゃに乗ることを許されません。
つりざお系統なども同じように怒られます。
さて、ポケモンセンターに入ることで画面を元に戻しました。
この状態で野生ポケモンとエンカウントしてみます。
ポッポが出てきました・・・が
色がおかしいですね
紫色に変色してしまっており、HPも突き抜けてしまっています。
新たなミュータントが爆誕してしまいました。
その正体は・・・?
ポッポだとおもった?ざんねん、メタモンでした!
と、ここまでがフィールドおよびバトルで使用した際の挙動になります。
トレーナー戦で使うと、トレーナーに勝った際の処理が行われ(おこづかいがもらえる+ジムリーダーならバッジとわざマシンがもらえる)その直後に再び同じトレーナーとエンカウントします。
バトル自体が終わっていないためこうなってしまうのでしょう。
さて
長らく、この挙動だけは知られており巷ではメタモン生成機などにされていますが
内部のメモリ的にはどのようにアセンブラされているのかがほとんど解明されていませんでした。
そこで、なぜこのような挙動が起こってしまうのかを解説していこうと思います
まずは順を追って見ていきましょう
・どうしてメニュー画面を開くの?
『はやぶさバッヂ』は実はメインメモリにアクセスしています。
『なかよしバッヂ』と名前や内部番号が似ているため察した方も多いでしょう。
メニューを開く処理も当然メインメモリでの処理になります。
具体的には2002hに飛びます。
(青Verでは05B6hに代わっているため効果が違います。)
そのため青Verではやぶさバッヂと同じ効果を得るには
ボックスの先頭に『てかガ』を預けて任意コード実行する必要があります。
・なぜバトルから離脱してしまうの?
はい、ここが本題となっております。
どうしてフィールドに戻ってしまうのか、なぜバトルが続行しているのか。
気になるのはそこでしょう。
実は『はやぶさバッヂ』を使用したからバトルから離脱した、というわけではないんです。
というのも、0xD0E1のbitに捕獲したポケモンの内部番号が入っているんです。
その数値は本来00で固定されており、ボールで捕獲した瞬間のみそのポケモンの内部番号が入るんです。
で、ずかん説明とニックネームの命名が終わると即座に00に戻ります。
なのですが
『はやぶさバッヂ』を使うと0xD0E1の数値を変えてしまう処理をしてしまいます。
すると、どうなるか?
ゲーム側はポケモンを捕まえていないにも関わらず、ポケモンを捕獲したものと勘違いしてアセンブラしてしまい、フィールドに戻る処理を行ってしまいます。
このため起こってしまったのが先ほどの現象なのですね。
ですが、フィールドに戻っても0xD0E1は00に戻らないままです、それはそうですね。キチンとした挙動をしなければ00に戻すプログラムが行われませんから。
そのためバトル中のままと思ってゲーム側は受け取るため、画面はフィールドなのに内部的にはバトルという、次元の境界線を超えてしまうのです。
では、先ほどの画像ではマダツボミを捕獲していましたがこの場合どう処理がされているでしょう?
捕獲に成功したため0xD0E1が00に戻るのでしょうか。
答えはNoです
はやぶさバッヂで改変された情報(=戦闘中なのにフィールドに戻っている)は、フィールド情報を1から書き換える『そらをとぶ』『テレポート』『あなをほる』によるワープでなければ元に戻りません。
厳密には戻しているというより書き換えたわけですけどね。
だから、ワープをせずに建物に入っただけの場合、情報がリセットされないため
再びボールを投げた場合画面が崩れてしまっているんですね。
その仕組みゆえに、0xD0E1の数値が00でない場合に『キズぐすり』等のどうぐを使った場合直後に戦闘が終了してしまいます。
さきほど『はやぶさバッヂ』に限ったことではない、と言ったのはこのためです。
・じゃあどうしてメタモンが出てくるの?
むらさきポッポに話を移しましょう。
見た目上はポッポですが、実は外見だけがポッポで、
中身はなんと先ほどまでエンカウントしていたマダツボミなんです。
最後に捕獲したポケモンの情報がリセットされない、というのはここに繋がります。
証拠にHPが突き抜けているのは、ポッポの最大HPよりもマダツボミの最大HPのほうが高いからです。
じゃあ捕獲したらマダツボミのままじゃないの?と思うことでしょう。
ポケモンというのはステータス情報が一致しないとさまざまなバグを起こします。
試しにセレクトバグなどでAを押されたポケモンを逆の手順で戻した場合に分かります。
が、見た目だけは元のポケモンになりますが
中身というのは手持ちのポケモンのX匹目のどこかステータスの努力値などをbit化した際に一致する内部番号のポケモンになるのです。
例:32番目セレクトバグを行った際、手持ち1匹目のポケモンとすばやさ努力値の下位bit数になります。このbitがもし0x49なら内部番号0x49のファイヤーに変換されます。
この話のどこが関係あるんですか?あるんです。
こうした異常なステータスのポケモンはなぜか全ての状態異常にかかっています。
どく・ねむりだけでなく、いかり・へんしんといったバトル中のみの状態異常にもかかっているのです。
そして、内部的にへんしん状態となっているポケモンは例外なくメタモンとして処理されるプログラムが入っています。
ためしにへんしんをオウムがえししたオニスズメを捕獲すると分かります。
だから、見かけと中身が一致しないポケモンはメタモンになるということでした。
ちなみにむらさき色なのはメタモンがむらさき色だからです。
仮に中身がピッピならピンク色になったりします。
さて、話をまとめましょう
『はやぶさバッヂ』の効果は
(1):2002hにアクセスし、メニュー画面を開く
※青Verだと05B6hにアクセスするので何も起きません。
(2):バトル中に(1)を行った場合、0xD0E1のbitを変動させる
(3):0xD0E1が00でない場合、バトル中にどうぐを使うとバトルを強制終了させる
(4):(3)によって終了した場合フィールドには戻るが内部メモリはバトル中のまま
(5):そらをとぶ等でワープした場合、0xD0E1は00に書き換えられる
まとめるとこうなりますね。
そして、この方法でポケモンを捕獲すると強制的にメタモンとなったポケモンが捕獲できます。
つまりひとことでいえば
フィールドとバトルの次元を超越させられるどうぐということです。
また、どの数値に影響しているか分からないのですがなぜか使用すると育てやさんに預けたポケモンに経験値が+1されます。
ですがスプレーの歩数は-1されていなかったので歩数は増えてないということです。
可能性があるとすれば0xD985の数値が変動しているのですが、まだ解析しきれていません・・・
ここは判明次第追記いたします。
今回はここまでです、ありがとうございました。
実はまだ解明しきれてないため、情報を知っている方や試してほしいことがあれば気軽にどうぞ。