この記事では、第二世代(金銀クリスタル)で相手が技を選ぶ・交代する・道具を使用する仕組みについて説明しています。
続きを読む徘徊バグ(金銀)
はじめに
金銀には、特定の手順を踏むとHPが異常な野生ポケモンが現れ、そのポケモンを倒すか捕まえると徘徊中のスイクンが消えるバグがあります[1][2]。このバグはクリスタルで修正されました。
この記事では、このバグを発生させる手順・バグの詳細・バグの回避方法について説明しています。
バグ発生手順
このバグを発生させる一例の手順を示します[1][2][3]。
準備
手順
- 徘徊ポケモン(種類は問わない)がいるマップに行く。
- Aを先頭にする。
- スプレーを使用する。
- スプレーが切れるまで草むらを歩き回る。
- スプレーが切れてからも草むらを歩き回り、野生ポケモンとエンカウントする。
- そのポケモンを倒すか捕まえるとスイクンが消える。
補足
手順5は徘徊ポケモンがいないマップで行っても構わない。
スイクンとエンカウント済みのデータでこの手順を行った場合、手順5でエンカウントするポケモンの現在HPはスイクンのものとなる。この場合、HPバーが最初から少なかったりはみ出していたりする。
スイクンが消えなかった・手順6で野生ポケモンから逃げた・全滅させられた*1・野生ポケモンが逃げた場合は手順1からやり直す。
詳細
このバグが発生する原因は、スプレーで徘徊ポケモンとの戦闘をスキップすると、次にエンカウントするポケモンが徘徊ポケモンとの戦闘として扱われるためです。そのポケモンを倒すか捕まえると、徘徊ポケモンを倒すか捕まえたことになるため、徘徊ポケモンをマップ上から消す処理が行われます。このとき消えるポケモンは必ずスイクンになります。
以下に詳細を示します。
※詳細の情報源: [4]
前提知識
説明に必要な情報をここで示します。
- 戦闘タイプ(アドレス: D10Bh)
- 戦闘場面によって異なる値をとります。通常の戦闘では00h、徘徊ポケモンとの戦闘では05hになります。
- 徘徊ポケモンの情報(アドレス: DC90h~DCA4h)
- WRAM上に各徘徊ポケモンの情報を格納している領域があります。格納されている情報は、ポケモンの種類・レベル・生息地(2バイト)・現在HP・個体値(2バイト)です。徘徊ポケモンを解放した時点ではポケモンの種類・レベル・生息地のみ設定され、現在HPは0・個体値はオール0となります。
- この情報は3匹分あり、以下これらを「徘徊情報n (nは1~3)」と書くことにします。通常、徘徊情報1はライコウ、徘徊情報2はエンテイ、徘徊情報3はスイクンのものとなっています。
スプレーで徘徊ポケモンとの戦闘をスキップしたときに発生する現象
通常、徘徊ポケモンとエンカウントした場合は戦闘タイプが05hになって戦闘が始まり、戦闘終了後は戦闘タイプが00hに戻ります。
Aを先頭にしてスプレーを使用している最中に徘徊ポケモンと出会った場合、スプレーの効果により戦闘はスキップされますが、戦闘タイプは05hのままとなります。なお、クリスタルではこの場合に戦闘タイプが00hとなるように修正されました。
戦闘タイプが徘徊ポケモン(05h)の状態でエンカウントしたときの処理
戦闘タイプが05hの状態でエンカウントしたとき、個体値と現在HPは徘徊ポケモンの情報に格納されている値を使用します。ただし、徘徊ポケモンの情報の現在HPが0の場合は初遭遇とみなし、ランダムに生成された個体値とHPが使用され、その値を徘徊ポケモンの情報に書き込みます。
読み書きする徘徊ポケモンの情報は、エンカウントしたポケモンの種類によって以下のように決められます。
- 徘徊情報1と等しい: 徘徊情報1を読み書きする
- 徘徊情報1と等しくなく、徘徊情報2と等しい: 徘徊情報2を読み書きする
- 徘徊情報1・徘徊情報2のどちらとも等しくない: 徘徊情報3を読み書きする
徘徊バグ発生中にエンカウントしたポケモンはライコウでもエンテイでもないため、徘徊情報3が読み書きされます。徘徊情報3はスイクンのため、徘徊バグ発生中にエンカウントした野生ポケモンの個体値とHPはスイクンのものになります。このため、スイクンの現在HPがエンカウントした野生ポケモンと等しい場合を除いて、野生ポケモンのHPが最初から減った状態やHPバーを突き抜けるほど多いHPの状態で出現します。
ただし、徘徊バグを起こす前に一度もスイクンとエンカウントしていなかった場合、スイクンの個体値・HPは徘徊バグ発生中にエンカウントした野生ポケモンの個体値・HPになります。この場合、エンカウントしたポケモンを見て徘徊バグが発生しているかどうかの判断はできません。
戦闘タイプが徘徊ポケモン(05h)の状態で相手を倒すか捕まえたときに行われる処理
戦闘タイプが05hの状態で相手のポケモンを倒すか捕まえたとき、対応する徘徊ポケモンの情報を更新し、そのポケモンをマップ上から消す処理が行われます*2。更新される徘徊ポケモンの情報は、戦った相手のポケモンの種類によって以下のように決められます。
- 徘徊情報1と等しい: 徘徊情報1を更新する
- 徘徊情報1と等しくなく、徘徊情報2と等しい: 徘徊情報2を更新する
- 徘徊情報1・徘徊情報2のどちらとも等しくない: 徘徊情報3を更新する
徘徊バグ発生中に戦ったポケモンはライコウでもエンテイでもないため、徘徊情報3が更新されます。徘徊情報3はスイクンのため、徘徊バグが発生した場合はスイクンが消えます。
回避方法
以下の行動をすることによって、徘徊バグを回避することができます*3。
- スプレーの効果が切れたあと、草むらの最初の戦闘で逃げる(逃げられる・全滅させられるでも可)
※徘徊バグを起こす前に一度もスイクンとエンカウントしていなかった場合、スイクンの個体値・HPはこの戦闘でエンカウントしたポケモンのものになる - スプレーの効果が切れたあと、草むらのエンカウントの前に釣りか頭突きによる戦闘を行う
前者の方法は徘徊ポケモンをマップ上から消す条件を満たしていないため、後者の方法は戦闘タイプが05hではなくなるため*4、徘徊バグは発生しません。
参考文献
[1] ファイヤー使い友の会、X(旧Twitter)、https://x.com/146Moltres/status/1780088898938699864、2024年7月9日閲覧。
[2] nakayoshibaddi、金銀の小ネタ集(11/7更新) - nakayoshibaddi’s blog、https://nakayoshibaddi.hatenadiary.jp/entry/2017/10/07/003104、2024年7月9日閲覧。
[3] nakayoshibaddi、【ポケモン金銀VC】スイクンの消滅に気をつけろ! - YouTube、https://www.youtube.com/watch?v=nqGrJ3W8M30、2024年7月9日閲覧。
[4] 【GB/VC】ポケットモンスター 金銀クリスタル Part5 [無断転載禁止]©2ch.net - 5ちゃんねる掲示板、https://medaka.5ch.net/test/read.cgi/poke/1506418886 ※レス番570・777・794・894・933・950、2024年7月27日閲覧。
更新履歴
- 2026年1月4日
- 手順6で全滅させられた場合の挙動を追記
- 2024年8月9日
- 公開
日本語版金銀の初期版と後期版について
あまり知られていないと思われますが、日本語版の金銀はそれぞれに初期版と後期版が存在します*1。
見分け方
カートリッジのラベルの右下には「22」や「00A」といった刻印が刻まれています。この刻印が数字のみであれば初期版、数字+英字であれば後期版となります。
初期版と後期版の違い
私が把握している限りでは、以下の2点のみです。なお、この変更による影響は次のセクションを参照してください。
処理の変更
23:501Cからはじまるサブルーチン*2において、アドレスC5BCh*3の値をインクリメントする処理があります*4。後期版ではインクリメント後の値が00hになった場合、もう1回インクリメントして01hにする処理が加わっています。この影響により、バンク23hの内容はこのサブルーチン以降5バイトずれます。
残骸の削除(銀のみ)
銀の初期版には各バンクの末尾に何らかの残骸が残っていますが、後期版ではすべて00hで削除されています。なお、金は初期版・後期版ともに残骸は存在しません。
処理の変更による影響
処理の変更そのものによる影響
スロットでソフトロックが発生する(初期版のみ)
pokegoldのコードを斜め読みした感じだと
— junin (@junin_x10) 2024年5月24日
・ゴローニャ演出が発生したらゴローニャ落下数に関係なく+1
・ラッキー演出が発生したら+1
・ラッキー演出中のタマゴばくだん1回につき+1
・1回のスロット中に+256になったらソフトロック?
※いろいろ把握できてないので推測です
※全く検証してません
ゴローニャ 203
— junin (@junin_x10) 2024年5月24日
ラッキー 6
タマゴ 46(1, 5, 13, 11, 5, 11)
計 255
推定初期版の金、スロット演出のカウント+256でソフトロック発生
6回目のラッキーが11個タマゴばくだんを投げて固まる(おそらくアニメ再生完了を待ち続けている)
ソフトリセットは可能だった
文献: 上から順に[1][2]
タイトル画面の演出
それで、今銀版でタイトル画面で放置していたら、初期版ではルギアからでている●が、wSpriteAnimCountが00hになるタイミングで途切れることがわかりました(後期版だと途切れない)。
— まへっち@ポケモン (@mahetti_poke) 2024年5月24日
金版でも同じかもしれませんが、こちらはもともと途切れる場面があるので判断が難しそうです。
文献: [3]
アドレスがずれたことによる影響
ポケモンのアニメーションを使った任意コード実行(初期版のみ)
通常プレイに関しては分かりませんが、ポケモンのアニメーションを使った任意コード実行が初期版のみ可能みたいな話があるようですhttps://t.co/EwOo878jKf
— flag3 (@flag3833753) 2024年5月21日
文献: [4]
参考文献
[1] junin、X(旧Twitter)、https://x.com/junin_x10/status/1794032636970819781、2024年6月7日閲覧。
[2] junin、X(旧Twitter)、https://x.com/junin_x10/status/1794133605779910760、2024年6月7日閲覧。
[3] まへっち、X(旧Twitter)、https://x.com/mahetti_poke/status/1793981059690082601、2024年6月7日閲覧。
[4] flag3・TimoVM、X(旧Twitter)、https://x.com/flag3833753/status/1792912703570272683、2024年6月7日閲覧。
更新履歴
- 2024年9月5日
- 「初期版と後期版の違い」に「残骸の削除(銀のみ)」を追加
- 2024年6月7日
- 処理の変更による影響を追加(アドレスのずれによるものを含む)
- 2024年5月22日
- 不明な点が処理の変更そのものであることを明記
- 2024年5月21日
- 公開
相手のAI(初代)
この記事では、初代(赤緑青ピカチュウ)で相手が技を選ぶ・交代する・道具を使用する仕組みについて説明しています。
技選択について
相手が技を選ぶタイミングは、プレイヤーが技を選んだ・ポケモンを交代した・道具を使用した・逃げるに失敗したあとです*1。はかいこうせん後の反動のようにメニューが出ない状態では、ターンはじめのタイミングで技選択が行われます。技選択の方法は以下のとおりです。
- 以下の状況のとき(=技が選べない状況のとき)は何もしない。
- 覚えている技が1つだけかつかなしばり状態のときは、わるあがきをする。
- 野生・たんパンこぞう・スキンヘッズ以外との戦闘の場合、AIによるフィルタリング(後述)で優先度が最も低い技のみ(複数ある場合はそれらすべて)を残し、それ以外の技は空欄扱いとする。
- (フィルタリング後の)技リストからランダムに技を1つ選ぶ。選ばれる確率は1番目が63/256、2番目が64/256、3番目が63/256、4番目が66/256。ただし、かなしばりされている技または空欄が選ばれた場合は選びなおす。
AIによるフィルタリング
野生・たんパンこぞう・スキンヘッズ以外との戦闘の場合、覚えている技すべてからランダムに技を選ぶのではなく、フィルタリングで残された技の中からランダムで選びます。残される技は、技ごとに設定された優先度が最も低い技です。優先度の決定方法は以下のとおりです。
- 優先度の初期値を10とする。
- 以下の補正0~3を順番に適用する。各補正は覚えている技すべてに対して1回だけ適用する。ただし、トレーナーの種類によっては適用されない補正がある(表1を参照)。
- 補正後の優先度がその技の最終的な優先度となる。
補正0 かなしばり補正
かなしばり状態の技は優先度が80になります。
補正1 状態異常補正
プレイヤーのポケモンが何らかの状態異常にかかっているとき、威力0かつねむり・どく・まひのいずれかの状態異常にする技*2の優先度を+5します。以下の技が対象です(五十音順、以降の技一覧も同様)。
- あくまのキッス
- うたう
- キノコのほうし
- さいみんじゅつ
- しびれごな
- でんじは
- どくガス
- どくどく
- どくのこな
- ねむりごな
- へびにらみ
補正2 変化技+α補正
相手がポケモンを初手出しまたは死に出ししてから2ターン目(および256n+2ターン目、nは正の整数)のとき、変化技とその他一部の技*3の優先度を-1します。ただし、交代や道具を使ったターンは数えません。以下の技が対象です。
- いとをはく
- いやなおと
- えんまく
- かくばる
- かげぶんしん
- かたくなる
- からにこもる
- くろいきり
- こうそくいどう
- じこさいせい
- しっぽをふる
- すなかけ
- スピードスター
- スプーンまげ
- せいちょう
- タマゴうみ
- ちいさくなる
- つるぎのまい
- テクスチャー
- とける
- ドわすれ
- なきごえ
- にらみつける
- ネコにこばん
- ねむる
- バリアー
- ひかりのかべ
- フラッシュ
- へんしん
- まるくなる
- ヨガのポーズ
- リフレクター
補正3 タイプ相性補正
以下の補正を行います。
- プレイヤーのポケモンの弱点をつけるタイプの技の優先度を-1する
- いまひとつまたは無効となるタイプの技は、「特定の技(自身を含む)または威力1以上の別タイプの技」を覚えている場合に限り優先度を+1する
タイプ相性の判定は表2に基づきます。プレイヤーのポケモンが複合タイプで表2にあてはまるものが2つある場合は、No.の若いほうで判定されます。
上記の「特定の技」および「威力1以上の技」は以下のとおりです。
| トレーナーの種類 | 補正0・1 | 補正2 | 補正3 |
|---|---|---|---|
| たんパンこぞう | |||
| むしとりのしょうねん | ○ | ||
| ミニスカート | ○ | ||
| ふなのり | ○ | ○ | |
| ボーイスカウト | ○ | ||
| ガールスカウト | ○ | ||
| かいじゅうマニア | ○ | ○ | ○ |
| りかけいのおとこ | ○ | ○ | |
| やまおとこ | ○ | ||
| ぼうそうぞく | ○ | ||
| かじばどろぼう | ○ | ○ | |
| でんきやのオヤジ | ○ | ||
| ジプシージャグラー(D5h、未使用) | ○ | ○ | |
| つりびと | ○ | ○ | |
| かいパンやろう | ○ | ○ | |
| スキンヘッズ | |||
| ギャンブラー | ○ | ||
| おとなのおねえさん | ○ | ○ | |
| サイキッカー | ○ | ○ | |
| でんきグループ | ○ | ○(赤緑青のみ) | |
| ジプシージャグラー(DDh) | ○ | ||
| もうじゅうつかい | ○ | ||
| とりつかい | ○ | ||
| からておう | ○ | ||
| ライバル1(ハナダシティまで) | ○ | ||
| オーキドせんせい(未使用) | ○ | ○ | |
| シルフのチーフ(未使用) | ○ | ○ | |
| はぐれけんきゅういん | ○ | ○ | |
| サカキ | ○ | ○ | |
| ロケットだんいん | ○ | ||
| エリートトレーナー(♂) | ○ | ○ | |
| エリートトレーナー(♀) | ○ | ○ | |
| シバ | ○ | ||
| タケシ | ○ | ||
| カスミ | ○ | ○ | |
| マチス | ○ | ○(赤緑青のみ) | |
| エリカ | ○ | ○ | |
| キョウ | ○ | ○ | |
| カツラ | ○ | ○(赤緑青のみ) | |
| ナツメ | ○ | ○(赤緑青のみ) | |
| ジェントルマン | ○ | ○ | |
| ライバル2 (サントアンヌ号~22ばんどうろ2回目まで) |
○ | ○ | |
| ライバル3(チャンピオン) | ○ | ○ | |
| カンナ | ○ | ○ | ○ |
| きとうし | ○ | ||
| キクコ | ○ | ||
| ワタル | ○ | ○ |
| No. | 攻撃側のタイプ | 防御側のタイプ | 相性 |
|---|---|---|---|
| 1 | みず | ほのお | ばつぐん |
| 2 | ほのお | くさ | ばつぐん |
| 3 | ほのお | こおり | ばつぐん |
| 4 | くさ | みず | ばつぐん |
| 5 | でんき | みず | ばつぐん |
| 6 | みず | いわ | ばつぐん |
| 7 | じめん | ひこう | 無効 |
| 8 | みず | みず | いまひとつ |
| 9 | ほのお | ほのお | いまひとつ |
| 10 | でんき | でんき | いまひとつ |
| 11 | こおり | こおり | いまひとつ |
| 12 | くさ | くさ | いまひとつ |
| 13 | エスパー | エスパー | いまひとつ |
| 14 | ほのお | みず | いまひとつ |
| 15 | くさ | ほのお | いまひとつ |
| 16 | みず | くさ | いまひとつ |
| 17 | でんき | くさ | いまひとつ |
| 18 | ノーマル | いわ | いまひとつ |
| 19 | ノーマル | ゴースト | 無効 |
| 20 | ゴースト | ゴースト | ばつぐん |
| 21 | ほのお | むし | ばつぐん |
| 22 | ほのお | いわ | いまひとつ |
| 23 | みず | じめん | ばつぐん |
| 24 | でんき | じめん | 無効 |
| 25 | でんき | ひこう | ばつぐん |
| 26 | くさ | じめん | ばつぐん |
| 27 | くさ | むし | いまひとつ |
| 28 | くさ | どく | いまひとつ |
| 29 | くさ | いわ | ばつぐん |
| 30 | くさ | ひこう | いまひとつ |
| 31 | こおり | みず | いまひとつ |
| 32 | こおり | くさ | ばつぐん |
| 33 | こおり | じめん | ばつぐん |
| 34 | こおり | ひこう | ばつぐん |
| 35 | かくとう | ノーマル | ばつぐん |
| 36 | かくとう | どく | いまひとつ |
| 37 | かくとう | ひこう | いまひとつ |
| 38 | かくとう | エスパー | いまひとつ |
| 39 | かくとう | むし | いまひとつ |
| 40 | かくとう | いわ | ばつぐん |
| 41 | かくとう | こおり | ばつぐん |
| 42 | かくとう | ゴースト | 無効 |
| 43 | どく | くさ | ばつぐん |
| 44 | どく | どく | いまひとつ |
| 45 | どく | じめん | いまひとつ |
| 46 | どく | むし | ばつぐん |
| 47 | どく | いわ | いまひとつ |
| 48 | どく | ゴースト | いまひとつ |
| 49 | じめん | ほのお | ばつぐん |
| 50 | じめん | でんき | ばつぐん |
| 51 | じめん | くさ | いまひとつ |
| 52 | じめん | むし | いまひとつ |
| 53 | じめん | いわ | ばつぐん |
| 54 | じめん | どく | ばつぐん |
| 55 | ひこう | でんき | いまひとつ |
| 56 | ひこう | かくとう | ばつぐん |
| 57 | ひこう | むし | ばつぐん |
| 58 | ひこう | くさ | ばつぐん |
| 59 | ひこう | いわ | いまひとつ |
| 60 | エスパー | かくとう | ばつぐん |
| 61 | エスパー | どく | ばつぐん |
| 62 | むし | ほのお | いまひとつ |
| 63 | むし | くさ | ばつぐん |
| 64 | むし | かくとう | いまひとつ |
| 65 | むし | ひこう | いまひとつ |
| 66 | むし | エスパー | ばつぐん |
| 67 | むし | ゴースト | いまひとつ |
| 68 | むし | どく | ばつぐん |
| 69 | いわ | ほのお | ばつぐん |
| 70 | いわ | かくとう | いまひとつ |
| 71 | いわ | じめん | いまひとつ |
| 72 | いわ | ひこう | ばつぐん |
| 73 | いわ | むし | ばつぐん |
| 74 | いわ | こおり | ばつぐん |
| 75 | ゴースト | ノーマル | 無効 |
| 76 | ゴースト | エスパー | 無効 |
| 77 | ほのお | ドラゴン | いまひとつ |
| 78 | みず | ドラゴン | いまひとつ |
| 79 | でんき | ドラゴン | いまひとつ |
| 80 | くさ | ドラゴン | いまひとつ |
| 81 | こおり | ドラゴン | ばつぐん |
| 82 | ドラゴン | ドラゴン | ばつぐん |
交代・道具の使用について
以下に示す一部のトレーナーは、技を使うかわりにポケモンを交代したり道具を使用したりします。これらの行動は、相手が技を使う行動に替わって行われます*5。ただし、ピカチュウ版で相手が以下の状態のときは、交代や道具の使用は行いません。
※ジプシージャグラー以外のトレーナーの種類のあとにある数字は、ポケモン1匹につき使用する道具の上限回数です。使用回数は相手がポケモンを交代するとリセットされます。
※各行動の後の分数は、条件を満たしたときに(条件が書いていない場合は常に)それらの行動を行う確率です。確率が書いていない行動は、条件を満たしていれば常に行われます。
※「最大HPの1/n」は小数点以下切り捨てです。例えば最大HPが99のとき、最大HPの1/5は19となり、最大HPの1/5未満は18以下の値となります。
※交代先のポケモンは手持ちの他のポケモンのうち最も前に配置されているポケモンとなります[1]。
- ジプシージャグラー(D5h・DDhともに)
- 交代(64/256)
- からておう(2)
- プラスパワー(32/256)
- サカキ(1)
- エフェクトガード(64/256)
- エリートトレーナー(♂) (2)
- プラスパワー(64/256)
- エリートトレーナー(♀) (1)
- 現在HPが最大HPの1/10未満のとき、すごいキズぐすり
- 現在HPが最大HPの1/10以上1/5未満のとき、交代 ※ただし、すごいキズぐすりを使ったあとは、そのポケモンに対して交代は行わない
- これら2つの行動は、条件を満たしたときに64/256の確率で行われるはずだったが、バグにより常に行われる
- シバ(2)
- ディフェンダー(64/256)
- タケシ(5)
- 何らかの状態異常になっているとき、なんでもなおし ※状態異常ともうどくを治す。まひ・やけどによるステータス低下は治らない。
- カスミ(1)
- ディフェンダー(64/256)
- マチス(1)
- スピーダー(64/256)
- エリカ(1)
- 現在HPが最大HPの1/10未満のとき、いいキズぐすり(128/256)
- キョウ(2)
- プラスパワー(赤緑青は64/256、ピカチュウ版は32/256)
- カツラ(2)
- 赤緑青: いいキズぐすり(64/256) ※HPが満タンのときにも使用することがあり、この場合でも使用回数にカウントされる
- ピカチュウ版: 現在HPが最大HPの1/10未満のとき、いいキズぐすり(64/256)
- ナツメ(1)
- ライバル2(1)
- 現在HPが最大HPの1/5未満のとき、キズぐすり(32/256)
- ライバル3(1)
- 現在HPが最大HPの1/5未満のとき、かいふくのくすり(32/256) ※状態異常の回復はタケシと同じ仕様
- カンナ(2)
- 現在HPが最大HPの1/5未満のとき、いいキズぐすり(128/256)
- キクコ(2)
- ワタル(1)
- 現在HPが最大HPの1/5未満のとき、すごいキズぐすり(128/256)
参考文献
[1] かみど、初代ポケモン 豆知識集 第11回 - ニコニコ動画、https://www.nicovideo.jp/watch/sm20945406 (3:25~)、2023年12月29日閲覧。
ZZAZZ glitch
はじめに
初代ポケモンで20番目セレクトバグ[1][2]やfifth法[3]を利用してバグトレーナーと戦うと、手持ちポケモンの情報が破壊されることがあります[4]。これはZZAZZ glitch[5]と呼ばれているバグによるもので、トレーナーに勝ったときにもらえる賞金の計算処理に起因します。以下、このバグについて解説します。
トレーナーからもらえる賞金
※これ以降に出てくるROMアドレスは、緑後期版のものです。他のバージョンでは異なる場合があります。
トレーナーに勝ったときにもらえる賞金は、アドレスD057h~D058hにBCD・ビッグエンディアンで書き込まれます*1。このアドレスは、0E:6074からの処理によって書き込まれます。以下にその処理内容を示します。
- 前処理によって、アドレスD025h~D026hに賞金の倍率(BCD・ビッグエンディアン)、アドレスD0EChに手持ち最後のポケモンのレベルが入っている。
- アドレスD056h~D058hを00hで初期化する。
- deレジスタ = D058hとする。
- アドレスD0EChに入っている値の回数分、以下の処理を繰り返し行う。ただしD0EChの値が00hの場合、以下の処理は256回繰り返す。
従って、賞金は「倍率*手持ち最後のレベル」となります(ただし、レベル0は256扱いとする)。ただし、後述の仕様により賞金が9999円を超える場合は、9999円となります。
BCDの足し算を行うサブルーチンの仕様
このルーチンは、メモリ上のBCDで表されている値同士の足し算を行います。パラメーターとしてdeレジスタに被加算BCDが格納されているアドレス、hlレジスタに加算BCDが格納されているアドレス、cレジスタにそれぞれのBCDのバイト数を指定します。従って、このルーチンは(de) = (de) + (hl)という計算を行います。
計算後に上限を超えた場合は、上限値に補正します。例えば、2バイトのBCDに対して計算を行って9999hを超えた場合は、9999hに補正します(以下、この補正を上限補正という。)。
バグ解説
ZZAZZ glitchは、BCDの足し算を行うサブルーチンによって上限補正が行われると引き起こされます。
賞金を求める処理の手順4-3は上限に到達することを想定していないため、上限補正が発生するとこの処理により賞金を書き込むアドレスが3バイト上位アドレス側にズレます。このズレは上限補正が発生するたびに起こります。
従って、このバグが発生すると、アドレスD059h~D355hまでの3の倍数以外のアドレスが99hで書き換えられます。ただし、書き換えられるアドレスの範囲は戦うトレーナーの種類や手持ちによって変化します。特に、バグトレーナーは賞金の倍率が通常のトレーナーよりも高いため、上限補正が起こりやすくなります。
書き換えられる範囲が十分に広い場合は、主人公の名前・手持ちポケモンの情報・手持ち道具などが書き換えられます。これらの情報に対して99hが何に対応しているかについては、表1を参照してください。
| 種類 | 99hに対応するもの |
|---|---|
| 文字 | カタカナの「ハ」 |
| ポケモン(内部番号) | フシギダネ |
| わざ | だいばくはつ |
| PP | ポイントアップ2回使用・残りPP25 |
| 状態異常 | ねむり残り1ターン・どく・やけど・(bit7)*2 |
| 道具 | 使うとオーキドの言葉が表示されるバグ道具 緑後期以外は名前が長い |
参考文献
[1] yue@・ゴーマもどき、オーキド"せんせい"とは何ぞやと | ネオ・グリーン、http://g-modoki.s59.xrea.com/x/Pokemon/okido/000.html、2023年9月12日閲覧。
[2] 20番目バグ - pokemonbug @ ウィキ - atwiki(アットウィキ)、https://w.atwiki.jp/pokemonbug/pages/16.html、2023年9月12日閲覧。
[3] fifth法 - pokemonbug @ ウィキ - atwiki(アットウィキ)、https://w.atwiki.jp/pokemonbug/pages/10.html、2023年9月12日閲覧。
[4] yue@・ゴーマもどき、不可思議現象、20番目の怪 | ネオ・グリーン、http://g-modoki.s59.xrea.com/x/Pokemon/okido/100.html、2023年9月12日閲覧。
[5] ZZAZZ glitch - Glitch City Wiki、https://glitchcity.wiki/wiki/ZZAZZ_glitch、、2023年9月12日閲覧。
毒サファリ+いあいぎりによるPC道具欄拡張の仕組みについて
はじめに
ピカチュウバージョンの任意コード実行環境・バイナリエディタを構築する方法の1つに、毒サファリによる壁抜けといあいぎりを使用する方法があります[1][2]。この方法の途中に、バグ世界に侵入していあいぎりを使い、PC道具欄を拡張する手順があります。以下にその手順を示します。
準備
- PCに道具を50種類 (満タンまで) あずける.
(2~6は省略)
手順
(1~5と8は省略)
[2]
この記事では、PCの道具欄拡張の仕組みと、それを行うために必要となる歩数の算出について説明します。
PCの道具欄拡張の仕組み
「はじめに」で示した手順は、Cut abuseと呼ばれる、特定のバグマップで細い木*1や草を切ることによってRAMの値を操作するバグを利用しています[3]。
このバグの説明の前に、ブロックについて説明します。
- ブロック
-
初代ポケモンでは、マップはブロックで構成されています。1ブロックは2x2マスの4マスで構成され、各ブロックには1バイトのIDが割り当てられています。各IDに対応するブロックについては、以下を参照してください*2。
File:TileBlockDex.png - Glitch City Wiki
バグマップについて
メモリ上には、マップデータが格納されている領域があります。この領域は通常プレイで見える分だけ確保されており、通常プレイにおいてはこの領域のみが参照されます。しかし、壁抜け状態などでマップの範囲外へアクセスした場合、領域外のアドレスを参照します。領域外のアドレスは他の用途に使用されているため、マップとしてみた場合はでたらめな値が入っています。
バグマップの正体は、この領域外のアドレスを無理やりマップとして表示したものです。
いあいぎりを使ったときの挙動について
フィールド上でいあいぎりを使って細い木や草を切ったとき、メモリ上の対応するアドレスの値が書き換わります。ブロックには細い木や草が存在するものがあり、いあいぎりを使うと細い木や草がないブロックに書き換わります。具体的にどのように変化するかについては、表1を参照してください。
| いあいぎり使用前のブロックID | いあいぎり使用後のブロックID | 切るものとブロック内の位置 |
|---|---|---|
| 0Bh(11) | 0Ah(10) | 草むら(全体) |
| 32h(50) | 6Dh(109) | 細い木(右上) |
| 33h(51) | 6Ch(108) | 細い木(右下) |
| 34h(52) | 6Fh(111) | 細い木(左上) |
| 35h(53) | 4Ch(76) | 細い木(右上) |
| 60h(96) | 6Eh(110) | 細い木(左下) |
通常のマップでは、マップデータが格納されている領域を書き換えるので特に問題はありませんが、バグマップでこれを行うと、マップデータではない領域を書き換えることになります。
「はじめに」で歩いていった場所は、PCに預けている道具の個数(アドレスD4B9h)に対応しています。PCに道具を50個預けることで、このアドレスに対応するブロックに木が含まれるようになり、この木を切ることで値が50から109に書き換わり、PCに預けている道具の個数が109個になります。
歩数の算出
20ばんすいどうのバグマップで、目的のアドレスに対応するブロックにたどり着くための歩数を求める方法について説明します。
まず、当該ブロックがある座標を求めます。求め方は以下のとおりです。なお、以下の手順で求まる座標はブロックの左上の座標となるので、ブロックの左上以外の座標に行きたい場合は適宜求めた座標を調整してください。
アドレスAの座標(y, x)を求めるためには、次の手順を実行する。
- AからC793hを引く(これをBとする)
- Bを38hで割り、端数を切り捨てる(これをCとする)
- Cに38hを掛ける(これをDとする)
- BからDを引く(これをEとする)
- 目的地の座標は(C * 2, E * 2)で求められる
[3]を翻訳、ただし手順1のアドレスは日本語版向けに修正した
もしくは、以下のスプレッドシートから対応する座標を求めます。
20ばんすいどうの座標に対応するアドレス表 - Google スプレッドシート
次にセキチクのポケモンセンター入り口から、求めた座標へ行くための歩数を求めます。上記で求めた座標(y, x)を、以下の文に代入します。
- 下に8歩、左に99 - x + 10歩、上に220 - y歩
※y >= 222の場合は、「上」を「下」に読み替える
必要に応じて以下の調整をします。これは、細い木や草を切るためには、その1歩手前に立つ必要があるためです。
- y = 220の場合は、左に歩く歩数を1減らす
- y ≠ 220の場合は、上(下)に歩く歩数を1減らす
歩数を求めたら、セキチクシティのポケモンセンターの入口から求めたとおりに歩きます。
例: PCの道具欄を拡張するためのアクセス方法
まずは座標を求めます。
- [3]の方法を用いて求める場合
- D4B9h - C793h = D26h (B)
- D26h / 38h = 3Ch (C)
- 3Ch * 38h = D20h (D)
- D26h - D20h = 6h (E)
- 目的地の座標は(3Ch * 2, 6h * 2)、すなわち(120, 12)
- 細い木はブロックの右上にあるのでx座標に1を足して、求める座標は(120, 13)となる
- スプレッドシートを用いて求める場合
- スプレッドシートを開き、アドレス「D4B9」を検索する
- D4B9が書かれているセルはI63なので、これに対応する座標は(120~121、12~13)となる
- 細い木はブロックの右上にあるので、求める座標は(120, 13)となる
座標を求めたので、次は歩数を求めます。
下に8歩、左に99 - 13 + 10 = 96歩、上に220 - 120 = 100歩
調整を行ったあとの歩数は下に8歩、左に96歩、上に99歩
歩数を求める式について
上記の歩数の式を導出する過程について説明します。
20ばんすいどうのバグマップは、本来の19ばんすいどうと20ばんすいどうが繋がっている範囲より上から進入することで到達できます。
セキチクシティのポケモンセンター入口から下に8歩歩くと、19ばんすいどうの(y = 0, x = 9)に到達し、そこから左に10歩歩くと20ばんすいどうの(y = 220, x = 99)に到達します(図1参照)。ここから目的の座標(y, x)には左に99 - x歩、上に220 - y歩歩くと到達できます。目的の座標に存在する細い木や草を切るためにはその1歩手前に主人公が立つ必要があるので、その分の調整をします。これらを合わせると、前述の歩数の式が導出されます。
ところで、19ばんすいどうから左に歩いて20ばんすいどうへ到達したとき、y座標が220と不自然に大きくなることを疑問に思うかもしれません。これは本来繋がっている場所よりも上から侵入した結果、y座標がオーバーフローするためです(図1参照)。
19ばんすいどうから20ばんすいどうへの道は、下のほう(y = 36~53)でつながっています。19ばんすいどうのy = 0~35から20ばんすいどうへアクセスした場合は、20ばんすいどうのy座標がオーバーフローして20ばんすいどうのy = 220~255に到達します。

参考文献
[1] オーキドせんせい研究者、【初代ポケモン】ピカチュウ版任意コード実行チャート解説【完全版 バグ技 毒サファリ+いあいぎり】 | YouTube、https://www.youtube.com/watch?v=6-_mu95YK9M、2023年5月4日閲覧。
[2] flag3、バイナリエディタ導入 毒サファリ・いあいぎりルート ピカチュウ版 | flag3833753、https://flag3833753.hatenablog.com/entry/2023/02/09/200159、2023年5月4日閲覧。
[3] Glitch City RAM manipulation (Cut abuse) - Glitch City Wiki、https://glitchcity.wiki/Glitch_City_RAM_manipulation_(Cut_abuse)、2023年5月4日閲覧。
ピカチュウ版で、冒険の途中から任意コード実行環境を構築する(ミラー領域を使用しない方法)
※2023年2月9日に、flag3さんが通信交換無しでバイナリエディタを導入する方法を公開しました。今から任意コード実行環境を構築する場合は、1台で済むリンク先の方法がよいと思われます。
バイナリエディタ導入 毒サファリ・いあいぎりルート ピカチュウ版 - flag3833753
はじめに
ピカチュウ版で、冒険の途中から任意コード実行環境を構築する
上記の記事では、わざマシン05の不正な追加効果を利用して任意コード実行環境を構築する方法を説明しています。この方法はWRAMのミラー領域を使用しているため、ミラー領域が機能していない環境では、この手順を行うことはできないという問題があります。この記事では、ミラー領域を使用しないで任意コード実行環境を構築する方法を説明します。
構築手順
条件
- ななしのどうくつに行けること
- 赤緑青と通信交換できること
- 使っていないボックスが1つ以上あること
赤緑青で用意するもの
- 以下の条件を満たすポケモン(A)
※技やステータスの調整は、セレクトバグ・任意コード実行・バイナリエディタなどで行う。
ピカチュウ版で用意するもの
手順
- 通信交換で(A)をピカチュウ版に送る。
※送ったあとに(A)をポケモンボックスや育てやに預けてはいけない。引き出すときにステータスの再計算が行われ、調整したステータスが消えてしまう。 - 道具をすべてパソコンに預ける。
※預けていない道具は手順終了時点で消えるので注意。 - ポケモンボックスのニックネームを以下のようにする。
- v1.0用 ※[1]のニックネームをこの手順用に修正したもの
01:ョョョョョ 02:がめぜルべ 03:づョづぶづ 04:ぶづよマづ 05:にマづぜべ 06:ョオづにカ 07:づよナづぼ 08:づにレづざ 09:よバづにヨ 10:づよそづぼ 11:づにッづの
- v1.1~v1.3用 ※[2]のニックネームをこの手順用に修正したもの
01:ョョョョョ 02:べがめぜュ 03:づぶづぶづ 04:ぶづよマづ 05:にせづにさ 06:づよさづそ 07:にョづよバ 08:づよノづづ 09:にねづよー 10:づの
- v1.0用 ※[1]のニックネームをこの手順用に修正したもの
- 手持ちポケモンを以下の順に並べる。
- ななしのどうくつに行き、レベル60か65のメタモンとエンカウントする。
※条件を満たすメタモンの、フロアごとの出現率は以下のとおり[1]。
- 1階: 1%
- 2階: 10%
- 地下1階: 15%
- (A)に交代する。交代後はメタモンが(A)に変身する。
- (D)に交代する。
- メタモンが使用するわざマシン42が命中し一撃で倒されなかった場合、手持ちの道具が以下のように変化する(v1.0の場合は手持ち1・2匹目の親名も変化する)。命中しなかった場合は、補助技を使ってターンを稼ぐ。
任意コード実行方法
上記の手順で任意コード実行環境を構築したあとの任意コード実行方法については、前回の記事を参照してください。
解説
この構築手順は、バグ技「わざマシン42」の不正な追加効果を利用してポケモンボックスのニックネームに書いたプログラムを実行し、任意コード実行環境を構築しています。
ピカチュウ版におけるわざマシン42の技データを表1に示します(v1.0~v1.3共通)。
| アニメーション | 78h (じばくと同じ) |
|---|---|
| 追加効果 | 71h (不正値) |
| 威力 | 102 |
| タイプ | C6h (特殊技、タイプ名参照先はFE13h) |
| 命中率 | 118/256 (約46.1%) |
| PP | 43 |
わざマシン42のタイプ名は不正であり、不用意にメモリを書き換える可能性があります。そのため、構築手順ではタイプ名を表示させないようにしています。
ピカチュウ版で追加効果71hが発生した場合は、アドレスCD1Fhにジャンプします(v1.0~v1.3共通)。ここから、アドレスCD27h~CD29hに書いたジャンプ命令でボックス1番目のニックネーム1文字目のアドレスDE64hにジャンプし、ボックスのニックネームに書いた任意コード実行環境を構築するプログラムを実行しています。
アドレスCD1Fh~アドレスCD29hが何に使用されているかを表2に示します。
| アドレス(16進数) | 内容 |
|---|---|
| CD1F | 自分のポケモンの回避率補正(1~13、初期値7) |
| CD20 | 未使用(一度でも戦闘すると7になる) |
| CD21 | 未使用(一度でも戦闘すると7になる) |
| CD22 | 未使用(常に0) |
| CD23 | 相手のポケモンのレベル |
| CD24 | 相手のポケモンの最大HP上桁 |
| CD25 | 相手のポケモンの最大HP下桁 |
| CD26 | 相手のポケモンの補正前のこうげき実数値上桁 |
| CD27 | 相手のポケモンの補正前のこうげき実数値下桁 |
| CD28 | 相手のポケモンの補正前のぼうぎょ実数値上桁 |
| CD29 | 相手のポケモンの補正前のぼうぎょ実数値下桁 |
表2に示したアドレスのうち、相手のポケモンが変身した場合は、アドレスCD26h~CD29hの値がこちらのポケモンの値となります。
メタモンとエンカウントする場所とレベルについて
ピカチュウ版では、メタモンはななしのどうくつ以外に、ポケモンやしきの地下1階にも出現します。構築手順でエンカウントする場所やレベルを指定している理由は、メタモンの個体によってはアドレスCD27h~CD29hに書いたジャンプ命令が実行できなかったり、ジャンプする前にスタックポインタやメモリを書き換えたりするためです。
それぞれの場所で出現するメタモンのレベルは、表3のとおりです。
| 場所 | レベル |
|---|---|
| ポケモンやしき 地下1階 | 12・18・24 |
| ななしのどうくつ 1階 | 55・60 |
| ななしのどうくつ 2階 | 60 |
| ななしのどうくつ 地下1階 | 60・65 |
アドレスCD27h~CD29hに書いたジャンプ命令を実行するためには、アドレスCD1Fh~CD26hの間で停止しない・メモリを書き換えない・スタックポインタを書き換えない・ジャンプしない必要があります。このうちアドレスCD1Fh~CD22h・CD24h・CD26hに書かれた命令はこの条件を満たしているので、残りのCD23h・CD25h、すなわちメタモンのレベルと最大HPが問題となります。
表4はピカチュウ版での野生のメタモンのレベルごとの最大HPの値を示したものです。表4の太字で示しているレベルと最大HPは、それらの値を命令として解釈したときに条件を満たさない命令となります。出現する個体によらず安全に実行できるのはレベル60と65のときで、これらのレベルが出現するのはななしのどうくつのみとなります。
| レベル | 最大HPの取りうる値 |
|---|---|
| 12 | 33~37 (34) |
| 18 | 45~50 (48、49、50) |
| 24 | 57~64 (59) |
| 55 | 117~118・120~129・131~134 (117~118) |
| 60 | 127~128・130~134・136~140・142~145 |
| 65 |
137~138・140~143・145~147・149~151・153~156 |
参考文献
[1] ゲームの匠、メタモン|ポケモン赤緑青ピカチュウ攻略|ゲームの匠、https://pokemon.g-takumi.com/pokemon/132/、2023年1月29日閲覧。
[2] 昔のポケモンの裏技を語る【アネ゛デパミ゛】 14 [無断転載禁止]©2ch.net、https://medaka.5ch.net/test/read.cgi/poke/1477904768/87、2023年1月11日閲覧。
[3] 昔のポケモンの裏技を語る【アネ゛デパミ゛】 13、https://tamae.5ch.net/test/read.cgi/poke/1389422437/630、2023年1月11日閲覧。
更新履歴
- 2023年2月3日
- 公開
- 2023年2月9日
- 冒頭に通信交換無しでバイナリエディタを導入するflag3さんの記事へのリンクを追加