こんにちは。matchanです。
ふと、昔やったゲームを思い出してまたプレイしてみたいなあと思うことがあります。
最近のやりたいゲームはポケモン初代。
子供のころ、クリスマスにゲームボーイカラーとピカチュウ版を買ってもらい、かなりやり込んだことを覚えています。
そんな初代ポケモンですが、忘れられないのが「セレクトバグ」と呼ばれる強力なバグの存在です。このバグによりアイテムを無限に増やしたり、ミュウを手に入れたりすることができていました。
アイテムの無限増殖や、ミュウを手に入れる裏技など…いわゆる「なんでもアリ」な世界。
簡単に再現可能なバグだったため、その影響はかなり大きかったです。
今回はそんなセレクトバグについて、当時を懐かしみながら「なぜ起きたのか」「どんな仕組みだったのか」を改めて紐解いていきます。
セレクトバグとは? 簡単におさらい
セレクトバグとは、初代ポケモン(赤・緑・青)に存在した「入れ替え操作のキャンセル処理ミス」を突いたバグ技です。技や道具を入れ替えるときに使用するセレクトボタンが原因で、本来触れてはいけないゲーム内部のメモリが書き換えられてしまうというもの。
ちなみにピカチュウ版ではセレクトバグは修正されています。
このバグを利用すると、以下のようなことが可能になります。
- ポケモンを一瞬でレベル100にする
- アイテムの無限増殖
- 通常出現しないポケモン(ミュウなど)を入手する
- ポケモンのステータスを好きに書き換える
- 好きな技を覚えさせる など
ゲーム内部のメモリ?何それ?と思われている方もいるかと思いますので、実際のバグ技を例にセレクトバグについて紐解いていきましょう。
レベル100にするバグ技
このセレクトバグを使った「ポケモンをレベル100にするバグ技」をご紹介。手順は以下の通り。
- メニューから「どうぐ」を開き、上から7番目の道具でセレクトボタンを押す。
- Bボタンを2回押し、メニューを閉じる。
- 野生のポケモンと戦闘になる。
- 「たたかう」を選択し、任意の技でセレクトボタンを押す。
- 技が変化するが、構わず相手ポケモンを倒す。
- 戦闘終了後、レベルが100になる。
と、簡単な手順でレベル100になるのです。
ポイントになるのが上記手順1~2で、セレクトボタンを押した後に入れ替え操作を行わない(つまり、Bボタンを2回押す)ということ。この操作によりあらゆるバグを引き起こすことが可能になることから「セレクトバグ」と呼ばれています。
仕組みを解説:なぜレベルが上がるのか?
セレクトバグで何が起こるのか。一言で言うと内部メモリの構造を利用した「番地のズレによるデータ入れ替え」にあります。
1つずつ見ていきます。
データのメモリ管理
まず、初代ポケモンにおいてゲームデータがどのように管理されているか、簡単に紹介します。
ポケモンの技や経験値など・・・全てのデータは、「メモリ」と呼ばれる部屋に格納されています。
メモリにはメモリ番地と呼ばれる部屋番号があり、「D130番」には『タイプ1』のデータが、「D133番」には『技1』のデータが格納されています。各部屋は、大きさが1バイトという単位でデータを格納しています。
最初に紹介した「レベル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バイト) |
IDや経験値など、1バイトで表しきれないデータは複数の部屋にわたって格納されます。
メモリ番地や後に紹介する格納データは全て16進数で表現されています。
例えば『D130』は、10進数で表すと53,552に相当します。
入れ替え操作をするとどうなるか
では技や道具の入れ替え操作をすると、どのようなことが起こるか見ていきます。
例えば、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を引いているのは基本的に番号管理は0から始まるためです。普通、ものを数えるときは「1、2、3・・・」と数えますが、プログラムは「0、1、2・・・」と0から数えます。
道具の入れ替えも同様の仕組みです。セレクトを押したときのカーソル位置を記憶し、それらが格納されているデータを入れ替えています。
入れ替えをキャンセルするとどうなるか
それでは本題。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』となり、対応する技「はたく」に変化するわけです。
セレクトバグを使った裏技は他にも
セレクトバグを使うと簡単にゲームバランスが崩壊できてしまいます。セレクトバグを使った他の裏技は例えば以下の通り。これ以外にもたくさんあります。
応用例 | 内容 |
---|---|
アイテム無限増殖 | アイテム欄の並び替えで255個に増えるバグ技 |
任意ポケモン出現 | ポケモンや技の並びを操作してミュウなどの出現を引き起こす |
好きな技を覚えさせる | 技データを別のデータと入れ替えることで、本来覚えられない技を覚えさせる |
このように、メモリの構造を理解していれば、自分好みにデータを変えてしまうことも可能でした。
スポンサーリンク
まとめ:セレクトバグの正体は不正なメモリ上のデータの入れ替え
このように、セレクトバグの正体は
『セレクトボタンを押した後にキャンセル操作を行っても、内部データの入れ替え処理がキャンセルされず、本来入れ替えてはならないメモリ上のデータの入れ替え処理が発生してしまう』
ということになります。
他にも個体値や努力値のデータを不正に入れ替えることで個体値・努力値MAXのポケモンを作れたり、技データを不正に入れ替えることで好きな技を覚えさせたり・・・やりたい放題ですね。
以上、参考になれば幸いです。