こんにちは。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 |
D137 | ID(上位1バイト) |
D138 | ID(下位1バイト) |
D139 | 経験値(上位1バイト) |
D13A | 経験値(中位1バイト) |
D13B | 経験値(下位1バイト) |
D13C | HP努力値(上位1バイト) |
D13D | HP努力値(下位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を記憶。 |
2 | Bボタンを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) | 技1 | 14 (しめつける) | 01(はたく) |
D139 (D133+6) | 経験値(上位1バイト) | 01 | 14 |
D13A (D133+7) | 経験値(中位1バイト) | 21 | 21 |
D13B (D133+8) | 経験値(下位1バイト) | 68 | 68 |
入れ替えの結果、経験値は16進数で「142168」。10進数で1,319,272になります。
レベル100に必要な経験値は多くて125万なので、変化した経験値がこの値を超えると一瞬でレベル100になります。
技1についても、入れ替え後は『01』となり、対応する技「はたく」に変化するわけです。
まとめ:セレクトバグの正体は不正なメモリ上のデータの入れ替え
このように、セレクトバグの正体は
『セレクトボタンを押した後にキャンセルしても、内部データの入れ替え処理がキャンセルされないことで、入れ替えてはならないメモリ上のデータの入れ替え処理が発生してしまう』
ということになります。
他にも個体値や努力値のデータを不正に入れ替えることで個体値・努力値MAXのポケモンを作れたり、技データを不正に入れ替えることで好きな技を覚えさせたり・・・やりたい放題ですね。