セレクトバグ

last up date : 2015/04/25(Sat)

■ セレクトバグとは?

第一世代では道具や技の一覧表示画面においてセレクトボタンを使って、それぞれの項目の並び順を入れ替えることができる。
また、手持ちのポケモンの並び順もセレクトボタンこそ使わないが、「ならびかえ」のコマンドによって並び替えができる。
この並び替えプログラムは、最初に選択した項目の並び順だけを一時的に記憶して(※ゲーム中では白のカーソルで表示される)
黒のカーソルで次に選択した項目の並び順とその項目に付随するメモリの入れ替えが行われるといった仕組みとなっている。

付随するメモリとは、道具なら道具の種類とその道具の個数の2byte、技なら技の種類とその技の現在(残り)PPの2byte、
手持ちであれば、ステータス画面の項目と個体値努力値などの隠しステータスを含む56byteのメモリがそれにあたる。
メモリ1byteは0x00〜0xFFまでの256通りのデータを保存できる。項目別の256のパターン表はこちらを参考にしてほしい。

本来であれば、道具は道具、技は技、手持ちなら手持ちのステータスに関するメモリしかデータ交換ができないのだが、
道具の並び替え先を選択中のみ、並び替え途中にBボタンを押しても並び替えの選択状態が解除されないようになっている
(※戦闘以外の道具選択のみ有効。カートリッジのシールに彫られている数字の隣にAと彫られていない赤・緑の初期出荷版のROMでは戦闘中でも有効らしい)
これがこのバグの原因であり、このまま戦闘に入ると画面に白カーソルが表示され、並び替えの選択状態のままになるのだ。

例えば、
    道具の1番目をセレクトボタンで選択すれば、「たたかう」なら1番目の技、「ポケモン」なら手持ちの1番目、
    道具の2番目をセレクトボタンで選択すれば、「たたかう」なら2番目の技、「ポケモン」なら手持ちの2番目、
    道具の3番目をセレクトボタンで選択すれば、「たたかう」なら3番目の技、「ポケモン」なら手持ちの3番目、
    道具の4番目をセレクトボタンで選択すれば、「たたかう」なら4番目の技、「ポケモン」なら手持ちの4番目、
    道具の5番目をセレクトボタンで選択すれば、「たたかう」なら5番目の技、「ポケモン」なら手持ちの5番目、
    道具の6番目をセレクトボタンで選択すれば、「たたかう」なら6番目の技、「ポケモン」なら手持ちの6番目、
    道具の7番目をセレクトボタンで選択すれば、「たたかう」なら7番目の技、「ポケモン」なら手持ちの7番目
…に白カーソルが残ったままになります。

このまま、もう一度、「たたかう」ならセレクトボタン、「ポケモン」ならAボタンでデータの並び替えができ、
これにより、本来ではあり得ない5番目以降の技、手持ちの7番目以降のポケモンとデータ交換が可能になるのだ
ちなみにこのバグを使用後もう一度同じ手順を踏めば、同じ場所のメモリを交換するため、多くの場合、元に戻る。

このバグを利用することで、ポケモンのステータスやイベントフラグなどのメモリを改竄することができるのである。
ここまでできちゃうと改造ツールとやってることが変わんね〜(^^;

なお、赤緑青発売から2年後に発売されたピカチュウバージョンではこのバグは修正されました。

■ 技のメモリを入れ替える

ポケモンのステータスの改竄は「たたかう」ですべて可能になります。
ただし、注意点として書き換えたあとの技のメモリが166(0xA6)〜195(0xC3)の場合は、
技データが存在しないため、戦闘画面やステータス画面でその技を見るとフリーズします。
また、手持ちの1番目のHPの下桁が166(0xA6)〜195(0xC3)でもフリーズするようです。

いじり易いメモリは、左側が手持ち1の経験値下桁、右側が技の現在PP+ポイントアップ使用回数×64あたりでしょうか。
経験値下桁の調整には育て屋さんとPIKAさんのツールが便利です。
No.技セレクト技PPセレクト
1(手持ち1番目)技1(手持ち1番目)技1の現在PP+「ポイントアップ」使用回数×64
2(手持ち1番目)技2(手持ち1番目)技2の現在PP+「ポイントアップ」使用回数×64
3(手持ち1番目)技3(手持ち1番目)技3の現在PP+「ポイントアップ」使用回数×64
4(手持ち1番目)技4(手持ち1番目)技4の現在PP+「ポイントアップ」使用回数×64
▼ 通常では存在しない5番目以降の技の代わりとなるデータ ▼
5(手持ち1番目)親のID上桁(手持ち1番目)レベル
6(手持ち1番目)親のID下桁(手持ち1番目)最大HP上桁
7(手持ち1番目)経験値上桁(手持ち1番目)最大HP下桁
8(手持ち1番目)経験値中桁(手持ち1番目)こうげき実数値上桁
9(手持ち1番目)経験値下桁(手持ち1番目)こうげき実数値下桁
10(手持ち1番目)HP努力値上桁(手持ち1番目)ぼうぎょ実数値上桁
11(手持ち1番目)HP努力値下桁(手持ち1番目)ぼうぎょ実数値下桁
12(手持ち1番目)こうげき努力値上桁(手持ち1番目)すばやさ実数値上桁
13(手持ち1番目)こうげき努力値下桁(手持ち1番目)すばやさ実数値下桁
14(手持ち1番目)ぼうぎょ努力値上桁(手持ち1番目)とくしゅ実数値上桁
15(手持ち1番目)ぼうぎょ努力値下桁(手持ち1番目)とくしゅ実数値下桁
16(手持ち1番目)すばやさ努力値上桁(手持ち2番目)中身の種族
17(手持ち1番目)すばやさ努力値下桁(手持ち2番目)現在HP上桁
18(手持ち1番目)とくしゅ努力値上桁(手持ち2番目)現在HP下桁
19(手持ち1番目)とくしゅ努力値下桁(手持ち2番目)引き取りレベル
20(手持ち1番目)こうげきぼうぎょ個体値(手持ち2番目)状態異常
▼ 主人公のパソコンから選択可能 ▼
21(手持ち1番目)すばやさとくしゅ個体値(手持ち2番目)タイプ1
22(手持ち1番目)技1の現在PP+「ポイントアップ」使用回数×64(手持ち2番目)タイプ2
23(手持ち1番目)技2の現在PP+「ポイントアップ」使用回数×64(手持ち2番目)捕獲度(持ち物)
24(手持ち1番目)技3の現在PP+「ポイントアップ」使用回数×64(手持ち2番目)技1
25(手持ち1番目)技4の現在PP+「ポイントアップ」使用回数×64(手持ち2番目)技2
26(手持ち1番目)レベル(手持ち2番目)技3
27(手持ち1番目)最大HP上桁(手持ち2番目)技4
28(手持ち1番目)最大HP下桁(手持ち2番目)親のID上桁
29(手持ち1番目)こうげき実数値上桁(手持ち2番目)親のID下桁
30(手持ち1番目)こうげき実数値下桁(手持ち2番目)経験値上桁
31(手持ち1番目)ぼうぎょ実数値上桁(手持ち2番目)経験値中桁
32(手持ち1番目)ぼうぎょ実数値下桁(手持ち2番目)経験値下桁
33(手持ち1番目)すばやさ実数値上桁(手持ち2番目)HP努力値上桁
34(手持ち1番目)すばやさ実数値下桁(手持ち2番目)HP努力値下桁
35(手持ち1番目)とくしゅ実数値上桁(手持ち2番目)こうげき努力値上桁
36(手持ち1番目)とくしゅ実数値下桁(手持ち2番目)こうげき努力値下桁
37(手持ち2番目)中身の種族(手持ち2番目)ぼうぎょ努力値上桁
38(手持ち2番目)現在HP上桁(手持ち2番目)ぼうぎょ努力値下桁
39(手持ち2番目)現在HP下桁(手持ち2番目)すばやさ努力値上桁
40(手持ち2番目)引き取りレベル(手持ち2番目)すばやさ努力値下桁
41(手持ち2番目)状態異常(手持ち2番目)とくしゅ努力値上桁
42(手持ち2番目)タイプ1(手持ち2番目)とくしゅ努力値下桁
43(手持ち2番目)タイプ2(手持ち2番目)こうげきぼうぎょ個体値
44(手持ち2番目)捕獲度(持ち物)(手持ち2番目)すばやさとくしゅ個体値
45(手持ち2番目)技1(手持ち2番目)技1の現在PP+「ポイントアップ」使用回数×64
46(手持ち2番目)技2(手持ち2番目)技2の現在PP+「ポイントアップ」使用回数×64
47(手持ち2番目)技3(手持ち2番目)技3の現在PP+「ポイントアップ」使用回数×64
48(手持ち2番目)技4(手持ち2番目)技4の現在PP+「ポイントアップ」使用回数×64
49(手持ち2番目)親のID上桁(手持ち2番目)レベル
50(手持ち2番目)親のID下桁(手持ち2番目)最大HP上桁

注意事項:戦闘中のメモリ変更技と戦闘後のメモリ変更技が異なる理由

    この技メモリの入れ替えを行うとき、戦闘中にセレクトで変更した技と戦闘後の技とはしばしば異なることがあります。
    これは現在進行形でバトルの場に出ているポケモンの情報とその手持ちのポケモンの情報が別々に存在するためです
    このような仕様であるおかげで「へんしん」や「ものまね」で情報が変更されても戦闘後に元の姿や技に戻るわけです。

    このとき、技と以下のメモリが入れ替わった結果、技名のない166〜195(0xA6〜0xC3)になるとフリーズします
No.技セレクト技PPセレクト
1(場のポケモンの)技1(場のポケモンの)技1の現在PP+「ポイントアップ」使用回数×64
2(場のポケモンの)技2(場のポケモンの)技2の現在PP+「ポイントアップ」使用回数×64
3(場のポケモンの)技3(場のポケモンの)技3の現在PP+「ポイントアップ」使用回数×64
4(場のポケモンの)技4(場のポケモンの)技4の現在PP+「ポイントアップ」使用回数×64
▼ 通常では存在しない5番目以降の技の代わりとなるデータ ▼
5(場のポケモンの)こうげきぼうぎょ個体値(D018)
6(場のポケモンの)すばやさとくしゅ個体値(D019)
7(場のポケモンの)レベル(D01A)
8(場のポケモンの)最大HPの上桁(D01B)
9(場のポケモンの)最大HPの下桁(D01C)
10(場のポケモンの)こうげき実数値上桁(D01D)
11(場のポケモンの)こうげき実数値下桁(D01E)
12(場のポケモンの)ぼうぎょ実数値上桁(D01F)
13(場のポケモンの)ぼうぎょ実数値下桁(D020)
14(場のポケモンの)すばやさ実数値上桁(D021)
15(場のポケモンの)すばやさ実数値下桁(D022)
16(場のポケモンの)とくしゅ実数値上桁(D023)
17(場のポケモンの)とくしゅ実数値下桁(D024)
18(場のポケモンの)技1の現在PP+「ポイントアップ」使用回数×64(D025)
19(場のポケモンの)技2の現在PP+「ポイントアップ」使用回数×64(D026)
20(場のポケモンの)技3の現在PP+「ポイントアップ」使用回数×64(D027)
▼ 主人公のパソコンから選択可能 ▼
21(場のポケモンの)技4の現在PP+「ポイントアップ」使用回数×64(D028)
22(D018)(D029)
23(D019)(D02A)
24(D01A)(D02B)
25(D01B)(D02C)
26(D01C)(D02D)
27(D01D)(D02E)
28(D01E)(D02F)
29(D01F)(D030)
30(D020)(D031)
31(D021)(D032)
32(D022)(D033)
33(D023)(D034)
34(D024)(D035)
35(D025)(D036)
36(D026)(D037)戦闘の種類(通常対戦・サファリ・ボールおじさん)
37(D027)(D038)
38(D028)(D039)ジムリーダー戦闘曲を流すか?
39(D029)(D03A)
40(D02A)(D03B)急所(01)・一撃必殺(02)メッセージ
41(D02B)(D03C)命中判定
42(D02C)(D03D)
43(D02D)(D03E)試合のルール(いれかえ or かちぬき)
44(D02E)(D03F)
45(D02F)(D040)自分の状態変化1
46(D030)(D041)自分の状態変化2
47(D031)(D042)自分の状態変化3
48(D032)(D043)相手のステータスの2倍
49(D030)(D044)相手のステータスの1/2倍
50(D031)(D045)相手の状態変化1

■ 手持ちのメモリを入れ替える

戦闘中の「ポケモン」やNPCとのポケモン交換、育て屋、姓名判断師の手持ち選択直後に並び替え状態になる。
技の種類とPPの2byteのデータしか並び替えない上記とは異なり、56byteもの膨大なデータの交換が行われる。
しかし、56種類のデータがどのように変化するかを把握できたところで、それほど実用性はなかったりする(^^;

そこでセレクトバグは2回同じ手順を踏めば、バグを起こす前の元のデータがそのまま帰ってくるのを利用し、
セレクトバグを戻す前に変化したニックネームを改名したり、変換された道具の順番を並び替えすることによって、
部分的にデータを書き換え、それ以外のデータについては元通りにすることでお目当のトレーナーデータが改竄できる。

姓名判断師で変えられるニックネームを利用したメモリ変換がお手軽なので、それに対応するメモリ表を以下に作成した。
No.NN1文字目NN2文字目NN3文字目NN4文字目NN5文字目NN(終)
▲ この上が手持ち6番目の「とくしゅ」実数値下桁 ▲
-5親名1文字目親名2文字目親名3文字目親名4文字目親名5文字目親名6文字目(終)
-4親名1文字目親名2文字目親名3文字目親名4文字目親名5文字目親名6文字目(終)
-3親名1文字目親名2文字目親名3文字目親名4文字目親名5文字目親名6文字目(終)
-2親名1文字目親名2文字目親名3文字目親名4文字目親名5文字目親名6文字目(終)
-1親名1文字目親名2文字目親名3文字目親名4文字目親名5文字目親名6文字目(終)
0親名1文字目親名2文字目親名3文字目親名4文字目親名5文字目親名6文字目(終)
No.NN1文字目NN2文字目NN3文字目NN4文字目NN5文字目NN(終)
1NN1文字目NN2文字目NN3文字目NN4文字目NN5文字目NN6文字目(終)
2NN1文字目NN2文字目NN3文字目NN4文字目NN5文字目NN6文字目(終)
3NN1文字目NN2文字目NN3文字目NN4文字目NN5文字目NN6文字目(終)
4NN1文字目NN2文字目NN3文字目NN4文字目NN5文字目NN6文字目(終)
5NN1文字目NN2文字目NN3文字目NN4文字目NN5文字目NN6文字目(終)
6NN1文字目NN2文字目NN3文字目NN4文字目NN5文字目NN6文字目(終)
▼ 通常では存在しない7番目の手持ちのニックネームの代わりとなるデータ ▼
7 捕まえた数
(No.001〜No.008)
捕まえた数
(No.009〜No.016)
捕まえた数
(No.017〜No.024)
捕まえた数
(No.025〜No.032)
捕まえた数
(No.033〜No.040)
捕まえた数
(No.041〜No.048)
8 捕まえた数
(No.049〜No.056)
捕まえた数
(No.057〜No.064)
捕まえた数
(No.065〜No.072)
捕まえた数
(No.073〜No.080)
捕まえた数
(No.081〜No.088)
捕まえた数
(No.089〜No.096)
9 捕まえた数
(No.097〜No.104)
捕まえた数
(No.105〜No.112)
捕まえた数
(No.113〜No.120)
捕まえた数
(No.121〜No.128)
捕まえた数
(No.129〜No.136)
捕まえた数
(No.137〜No.144)
10 捕まえた数
(No.145〜No.152)
見つけた数
(No.001〜No.008)
見つけた数
(No.009〜No.016)
見つけた数
(No.017〜No.024)
見つけた数
(No.025〜No.032)
見つけた数
(No.033〜No.040)
11 見つけた数
(No.041〜No.048)
見つけた数
(No.049〜No.056)
見つけた数
(No.057〜No.064)
見つけた数
(No.065〜No.072)
見つけた数
(No.073〜No.080)
見つけた数
(No.081〜No.088)
12 見つけた数
(No.089〜No.096)
見つけた数
(No.097〜No.104)
見つけた数
(No.105〜No.112)
見つけた数
(No.113〜No.120)
見つけた数
(No.121〜No.128)
見つけた数
(No.129〜No.136)
13 見つけた数
(No.137〜No.144)
見つけた数
(No.145〜No.152)
道具の総数 道具1の種類道具1の個数道具2の種類
14道具2の個数道具3の種類道具3の個数道具4の種類道具4の個数道具5の種類
15道具5の個数道具6の種類道具6の個数道具7の種類道具7の個数道具8の種類
16道具8の個数道具9の種類道具9の個数道具10の種類道具10の個数道具11の種類
17道具11の個数道具12の種類道具12の個数道具13の種類道具13の個数道具14の種類
18道具14の個数道具15の種類道具15の個数道具16の種類道具16の個数道具17の種類
19道具17の個数道具18の種類道具18の個数道具19の種類道具19の個数道具20の種類
20道具20の個数やめる所持金上桁所持金中桁所持金下桁ライバル1文字目
21ライバル2文字目ライバル3文字目ライバル4文字目ライバル5文字目ライバル6文字目(終)せってい
22バッジ所持データ不明データ不明主人公のID上桁主人公のID下桁もともとのBGM
23BGMカラーパターンデータ不明マップタイルNo上桁マップタイルNo下桁マップ内でのX座標
24マップ内でのY座標2×2タイルのX座標2×2タイルのY座標 以下469byteデータ不明

■ おまけ:入れ替え先のメモリが存在しない手持ちの情報の場合はどうなるのか?

手持ちのポケモンが1匹だけのときに、セレクトで入れ替えるメモリが手持ちの2〜5番目の情報となる場合はどうなるのか。
ポケモンを手持ちから預けると付随するステータスは詰めた分だけシフトし、やめるより下は最後に読まれたメモリが残る。
これと育て屋さんの仕様を組み合わせることで手持ちの先頭から6匹を預けることでポケモンのコピーも可能になります。
  1. 手持ちの6番目にコピーしたいポケモンFをセットする。
  2. 1番目 2番目 3番目 4番目 5番目 6番目 7番目
    ポケモンA
    (Aステータス)
    ポケモンB
    (Bステータス)
    ポケモンC
    (Cステータス)
    ポケモンD
    (Dステータス)
    ポケモンE
    (Eステータス)
    ポケモンF
    (Fステータス)
    やめる
  3. 手持ちの1〜5番目を順々に「マサキのパソコン」に預けて6番目の情報を残す。
  4. 1番目 2番目 3番目 4番目 5番目 6番目 7番目
    ポケモンF
    (Fステータス)
    やめる
    (Fステータス)
    -
    (Fステータス)
    -
    (Fステータス)
    -
    (Fステータス)
    -
    (Fステータス)
    -
  5. 「マサキのパソコン」からデータを書き換えるポケモンG、Hを2匹引き出す。
  6. 1番目 2番目 3番目 4番目 5番目 6番目 7番目
    ポケモンF
    (Fステータス)
    ポケモンG
    Gステータス
    ポケモンH
    (Hステータス)
    ポケモンI
    (Iステータス)
    やめる
    Fステータス
    -
    (Fステータス)
    -
  7. 道具の5番目をセレクトして育て屋さんのポケモン選択で2番目と入れ替えると2番目の外見が消える。
  8. 1番目 2番目 3番目 4番目 5番目 6番目 7番目
    ポケモンF
    (Fステータス)
    -
    Fステータス
    ポケモンH
    (Hステータス)
    ポケモンI
    (Iステータス)
    やめる
    Gステータス

    (Fステータス)
    -
  9. 外見透明な2番目を育て屋さんに預ける。このとき、育て屋さんは外見以外のデータFだけ格納する。
  10. 1番目 2番目 3番目 4番目 5番目 6番目 7番目
    ポケモンF
    (Fステータス)
    ポケモンH
    (Hステータス)
    ポケモンI
    (Iステータス)
    やめる
    (Gステータス)
    -
    (Fステータス)
    -
    (Fステータス)
    -
  11. 育て屋さんから引き取るとき、内部データFを元に外見Fを生成する。
  12. 1番目 2番目 3番目 4番目 5番目 6番目 7番目
    ポケモンF
    (Fステータス)
    ポケモンH
    (Hステータス)
    ポケモンI
    (Iステータス)
    ポケモンF
    (Fステータス)
    やめる
    (Fステータス)
    -
    (Fステータス)
    -
  13. この状態で手順3〜6を繰り返すことで連続で、G、H、Iの3匹をFのポケモンにすることができる。