こんにちは。matchanです。
ふと、昔やったゲームを思い出してまたプレイしてみたいなあと思うことがあります。
最近のやりたいゲームはポケモン初代。
子供のころ、クリスマスにゲームボーイカラーとピカチュウ版を買ってもらい、かなりやり込んだことを覚えています。
そんな初代ポケモンですが、忘れられないのが「セレクトバグ」と呼ばれる強力なバグの存在です。このバグによりアイテムを無限に増やしたり、ミュウを手に入れたりすることができていました。
簡単に再現可能なバグだったため、その影響はかなり大きかったです。
ちなみにピカチュウ版ではセレクトバグは修正されています。
このセレクトバグ、今思えば何が起こっていたのか。改めて調べてみました。
注意
※本記事でのバグ技はくれぐれも自己責任でお試しください。データに不具合等が発生しても責任は負いかねます。。。
おさらい:セレクトバグとは
まず「セレクトバグ」とはそもそもどんなバグなのか、をおさらいしてみます。
レベル100にするバグ技
このセレクトバグを使った「ポケモンをレベル100にするバグ技」をご紹介。このバグ技を使って説明していきます。手順は以下の通り。
- メニューから「どうぐ」を開き、上から7番目の道具でセレクトボタンを押す。
- Bボタンを2回押し、メニューを閉じる。
- 野生のポケモンと戦闘になる。
- 「たたかう」を選択し、任意の技でセレクトボタンを押す。
- 技が変化するが、構わず相手ポケモンを倒す。
- 戦闘終了後、レベルが100になる。
と、簡単な手順でレベル100になるのです。
ポイントになるのが上記手順1~2で、セレクトボタンを押した後に入れ替え操作を行わない(つまり、Bボタンを2回押す)ということ。
この操作によりあらゆるバグを引き起こすことが可能になることから「セレクトバグ」と呼ばれています。
セレクトバグで何が起こるのか
セレクトバグで何が起こるのか。一言で言うと「メモリの内容が不当に入れ替わってしまう」ということです。
データのメモリ管理
まず、初代ポケモンにおいてゲームデータがどのように管理されているか、簡単に紹介します。
全てのデータは、「メモリ」と呼ばれる部屋に格納されています。
メモリにはメモリ番地と呼ばれる部屋番号があり、「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バイト) |
メモリ番地や後に紹介する格納データは全て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を引いているのは基本的に番号管理は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』となり、対応する技「はたく」に変化するわけです。
まとめ:セレクトバグの正体は不正なメモリ上のデータの入れ替え
このように、セレクトバグの正体は
『セレクトボタンを押した後にキャンセル操作を行っても、内部データの入れ替え処理がキャンセルされず、本来入れ替えてはならないメモリ上のデータの入れ替え処理が発生してしまう』
ということになります。
他にも個体値や努力値のデータを不正に入れ替えることで個体値・努力値MAXのポケモンを作れたり、技データを不正に入れ替えることで好きな技を覚えさせたり・・・やりたい放題ですね。
以上、参考になれば幸いです。