備忘録

【初代ポケモン】セレクトバグとはなんだったのか

2021-11-17

本サイトの記事内にアフェリエイト広告が含まれている場合があります。

【初代ポケモン】セレクトバグとはなんだったのか

matchan

しがない会社員。 自分への備忘録や記録、少しでもプラスになる情報を発信できたらと思います。

スポンサーリンク

こんにちは。matchanです。

ふと、昔やったゲームを思い出してまたプレイしてみたいなあと思うことがあります。

最近のやりたいゲームはポケモン初代。

子供のころ、クリスマスにゲームボーイカラーとピカチュウ版を買ってもらい、かなりやりこんだのを覚えています。

そんな初代ポケモンですが、忘れられないのが「セレクトバグ」と呼ばれる強力なバグの存在。このバグにより、アイテムを無限に増やしたりミュウを手に入れたりすることができていました。

簡単に再現可能なバグだったため、その影響はかなり大きかったです。

ちなみにピカチュウ版ではセレクトバグは修正されています。

このセレクトバグ、今思えば何が起こっていたのか。改めて調べてみました。

注意

※本記事でのバグ技はくれぐれも自己責任でお試しください。データに不具合等が発生しても責任は負いかねます。。

おさらい:セレクトバグとは

まず「セレクトバグ」とはそもそもどんなバグなのか、をおさらいしてみます。

レベル100にするバグ技

このセレクトバグを使った「ポケモンをレベル100にするバグ技」をご紹介。このバグ技を使って説明していきます。手順は以下の通り。

  • メニューから「どうぐ」を開き、上から7番目の道具でセレクトボタンを押す。
  • Bボタンを2回押し、メニューを閉じる。
  • 野生のポケモンと戦闘になる。
  • 「たたかう」を選択し、任意の技でセレクトボタンを押す。
  • 技が変化するが、構わず相手ポケモンを倒す。
  • 戦闘終了後、レベルが100になる。

と、簡単な手順でレベル100になるのです。

ポイントになるのが上記手順1~2で、セレクトボタンを押した後に入れ替え操作を行わない(つまり、Bボタンを2回押す)ということ。

この操作によりあらゆるバグを引き起こすことが可能になることから「セレクトバグ」と呼ばれています。

セレクトバグで何が起こるのか

セレクトバグで何が起こるのか。一言で言うと「メモリの内容が入れ替わる」です。

プログラミングに詳しい方はイメージしやすいと思いますが、詳しくない方に向けて出来るだけ分かりやすく説明していきます。

データのメモリ管理

まず、初代ポケモンにおいてゲームデータがどのように管理をされているか、簡単に紹介します。

全てのデータは、「メモリ」と呼ばれる名前の部屋(をイメージすると分かりやすいと思います)に格納されています。

最初に紹介し「レベル100にするバグ技」に関する部分を抜粋したのが以下。

メモリ番地内容
D130タイプ1
D131タイプ2
D132被捕獲度
D133技1
D134技2
D135技3
D136技4
D137ID(上位1バイト)
D138ID(下位1バイト)
D139経験値(上位1バイト)
D13A経験値(中位1バイト)
D13B経験値(下位1バイト)
D13CHP努力値(上位1バイト)
D13DHP努力値(下位1バイト)
D13Eこうげき努力値(上位1バイト)

メモリ番地は部屋番号のようなものです。例えば、D130番の部屋にはポケモンの1つ目のタイプを表すデータが格納されています。各部屋は、大きさが1バイトという単位でデータを格納しています。

メモリ番地や後に紹介する格納データは全て16進数で表現されています。

例えば『D130』は、10進数で表すと53,552に相当します。

IDや経験値など、1バイトで表しきれないデータは複数の部屋にわたって格納されます。

入れ替え操作をするとどうなるか

では、技や道具の入れ替え操作をするとどうなるかを見てみます。

例えば、1番目と4番目の技を入れ替えると、以下の流れでD133(技1)とD136(技4)のデータが入れ替わります。

  • 1番目の技でセレクトを押す→(押したときのカーソル位置-1)が記憶される→1番目の場合は0を記憶。
  • 4番目の技でセレクトを押す→(押したときのカーソル位置-1)が記憶される→4番目の場合は3を記憶。
  • 「D133(技1)+0」→D133(技1) と「D133(技1)+3」→D136(技4)のデータの入れ替え処理を行う。
メモリ番地内容
D133 (D133+0)技1
D134 (D133+1)技2
D135 (D133+2)技3
D136 (D133+3)技4

道具の入れ替えも同様です。セレクトを押したときのカーソル位置-1を記憶して、(道具1番目のメモリ番地+記憶したカーソル位置-1)のメモリ番地にある道具データを入れ替えるわけです。

入れ替えをキャンセルするとどうなるか

それでは本題。1回目のセレクトボタンを押した後に入れ替えせずメニューに戻るとどうなるか。

本来、入れ替えの内部処理を取り消さないといけないのですが・・・実はなんと、取り消されていないままになっているんです。これがセレクトバグを引き起こす原因。

これを踏まえて、レベル100のバグ技をしたときの内部処理を見てみます。

 操作内部処理
1メニューから「どうぐ」を開き、上から7番目の道具でセレクトボタンを押す。(押したときのカーソル位置-1)が記憶される→7番目の場合は6を記憶。
2Bボタンを2回押し、メニューを閉じる。※本来ここで取り消されるべき・・・
3野生のポケモンと戦闘になる。
4「たたかう」を選択し、任意の技でセレクトボタンを押す。
※ここでは1番目の技を入れ替えるとする
(押したときのカーソル位置-1)が記憶される→1番目の場合は0を記憶。

「D133(技1)+6」→D139(経験値上位1バイト) と「D133(技1)+0」→D133(技1)のデータの入れ替え処理を行う。
5技が変化するが、構わず相手ポケモンを倒す。D133(技1)のデータが入れ替わったため、技が(一時的に)変化する。
※ポケモンセンターに預けると技がさらに変化する。
6戦闘終了後、レベルが100になる。D139(経験値上位1バイト)のデータが入れ替わったため、経験値が変化する。
メモリ番地内容
D133 (D133+0)技1
D134 (D133+1)技2
D135 (D133+2)技3
D136 (D133+3)技4
D137 (D133+4)ID(上位1バイト)
D138 (D133+5)ID(下位1バイト)
D139 (D133+6)経験値(上位1バイト)
D13A (D133+7)経験値(中位1バイト)
D13B (D133+8)経験値(下位1バイト)

入れ替えた直後は、パラメータ表示が一部おかしくなっているので、ポケモンセンターで回復させると表示が直ります。

入れ替えた技も、ポケモンセンターで回復させるとさらに変化します。

任意の技でセレクトボタンを押したときにデータの入れ替え処理が行われます。その結果・・・なんと技のメモリ番地を超えたD139(経験値上位1バイト)のデータが入れ替わります

具体的な値を使って確認していきましょう。

バグ技実行後
(ポケモンセンター回復済み)

上の画像のイワークを見ると、経験値が74,088→100万、1番目の技が「しめつける」→「はたく」に変化しています。これは何が起こっているのでしょうか。

メモリ番地に格納されるデータは、ポケモンだろうが技だろうが経験値だろうが、基をただせば全て数値です。

ポケモンや技には、「ピカチュウ」は〇〇番・「はかいこうせん」は××番・「キズぐすり」は△△番というように、その種類に対応する数値データが割り当てられています。

例えば、経験値74,088を16進数で表すと「12168」になります。これは1バイトに収まりきらないため、メモリに格納する際には1バイトずつ分割されます。経験値の上位1バイトは『01』、中位1バイトは『21』、下位1バイトは『68』です。

しめつけるの数値データはこちらを参考にすると『14』となっています。

これらの値を入れ替えると、以下のようになります。

メモリ番地内容入れ替え前入れ替え後
D133 (D133+0)技114 (しめつける)01(はたく)
D139 (D133+6)経験値(上位1バイト)0114
D13A (D133+7)経験値(中位1バイト)2121
D13B (D133+8)経験値(下位1バイト)6868

入れ替えの結果、経験値は16進数で「142168」。10進数で1,319,272になります。

レベル100に必要な経験値は多くて125万なので、変化した経験値がこの値を超えると一瞬でレベル100になります。

技1についても、入れ替え後は『01』となり、対応する技「はたく」に変化するわけです。

まとめ:セレクトバグの正体は不正なメモリ上のデータの入れ替え

このように、セレクトバグの正体は

セレクトボタンを押した後にキャンセル操作を行っても、内部データの入れ替え処理がキャンセルされず、本来入れ替えてはならないメモリ上のデータの入れ替え処理が発生してしまう

ということになります。

他にも個体値や努力値のデータを不正に入れ替えることで個体値・努力値MAXのポケモンを作れたり、技データを不正に入れ替えることで好きな技を覚えさせたり・・・やりたい放題ですね。

以上、参考になれば幸いです。

スポンサーリンク

-備忘録
-,