ロケットゲームコーナーの隠しコインのバグ

ロケットゲームコーナーには、見えないコインがいくつか落ちています。これらの隠しコインのうち、いくつかはバグによって異常な挙動を示します。

40枚落ちているはずのコイン(赤緑青ピカチュウ)

(x = 11, y = 7、スイッチがあるポスターから右に2マス・下に3マスのところ)に落ちているコインは、データ上40枚落ちていることになっています。ところが、隠しコインを拾ったときのコイン取得処理にバグがあり、実際には20枚しか手に入れることができません。

隠しコインを拾ったときの処理で、以下のように落ちている枚数に応じてコインを増やす処理があります。

  1. 落ちているコインの枚数を調べる
  2. 落ちているコインが10枚なら、6へ進む
  3. 落ちているコインが20枚なら、7へ進む
  4. 落ちているコインが40枚なら、7へ進む
  5. 落ちているコインが上記以外の枚数なら、9へ進む
  6. 手持ちのコインを10枚増やす
  7. 手持ちのコインを20枚増やす
  8. 手持ちのコインを40枚増やす
  9. 手持ちのコインを100枚増やす

4の処理は本来「落ちているコインが40枚なら、8へ進む」ですが、誤って20枚のときと同じ7へ進むようになっています。

拾えないコイン(赤緑青ピカチュウ)

(x = 12, y = 15、右から3列目・一番下のスロット台)にはコイン10枚が落ちています。ここはスロットと同じ場所であり、このマスを調べるとスロットで遊ぼうとするため、このコインを拾うことはできません。これは、調べているマスに隠しオブジェクトが存在するかどうかをチェックする処理と、隠しオブジェクトのリストでの定義順によるものです。

隠しオブジェクトが存在するマップでAボタンを押したとき、マップごとに定義されている隠しオブジェクトのリストを先頭から順に調べます。調べているマスと同じ場所に存在する隠しオブジェクトを見つけたとき、リストの探索を終了し、見つけた隠しオブジェクトに対応した処理を行います。

ロケットゲームコーナーの隠しオブジェクトは、36台のスロットと12個の隠しコインがこの順で定義されています。そのため、スロットと隠しコインが同じ場所に存在するマスではスロットの処理が行われ、隠しコインの処理は行われません。したがって、冒頭の場所にある隠しコインを拾うことはできません。

片方ずつしか取れないコイン(赤緑)

赤緑版には、片方の隠しコインを取得すると、もう片方の隠しコインが取れなくなるというバグがあります[1]。これは、隠しコインを調べたときに誤った場所のフラグを参照することがあるためです。詳細を以下で述べます。

まず、フラグとリストの定義をします。

隠しコイン取得フラグ
各隠しコインごとにbit単位で与えられる。1なら取得済み、0なら未取得。
リストC
隠しコインのあるマップと座標を定義しているリストで、フラグ立て・フラグ参照に使用される。リストCの各エントリはマップ番号(すべて87h)・y座標・x座標(各1バイト)の順で構成される。最後のエントリの直後には、終端を表すFFhの1バイトがある。各エントリの座標を以下の表に示す。
リストCのエントリごとの座標
No. 座標 落ちているコインの枚数(参考)
0 x = 0, y = 8 10枚
1 x = 1, y = 16 10枚
2 x = 3, y = 11 20枚
3 x = 3, y = 14 10枚
4 x = 4, y = 12 10枚
5 x = 9, y = 12 20枚
6 x = 9, y = 15 10枚
7 x = 16, y = 14 10枚
8 x = 10, y = 16 10枚
9 x = 11, y = 7 20枚*1
10 x = 15, y = 8 100枚
11 x = 12, y = 15 10枚*2

隠しコインが置いてあるマスを調べたとき、以下の処理が行われます。

  1. コインケースを持っているかどうかを調べる。持っていない場合は以降の処理を行わない。
  2. 調べている隠しコインが、リストCの何番目にあるかを探し、その位置を返す(この値をaとする)。なお、リストCの先頭は0番目とする。
  3. a番目の隠しコイン取得フラグを参照し、調べている隠しコインが取得済みかどうかを調べる。取得済みの場合は何もせず、未取得の場合はa番目の隠しコイン取得フラグを立ててコインを入手する。

2の処理にはバグがあり、正しくないaの値が返ってくることがあります。以下に、上記2の処理の内容を示します。

※以下の「○○ += n」は、「○○にnを加算する」という意味である。また、以下の処理が終了したときのaの値が、上記2の処理におけるaの値となる。

  1. a = 00h、hl = 「リストCの先頭アドレス」とする。
  2. アドレスhlの値を調べ、hl += 1とする。その値がFFhならa = FFhとして終了する。その値と現在のマップ番号が異なっている場合、hl += 2、a += 1として2に戻る。
  3. アドレスhlの値を調べ、hl += 1とする。その値と調べているマスのy座標が異なっている場合、hl += 1、a += 1として2に戻る。
  4. アドレスhlの値を調べ、hl += 1とする。その値と調べているマスのx座標が異なっている場合、2に戻る。
  5. リストCのa番目のエントリは調べている隠しコインに対応しているエントリなので、終了する。

バグがあるのは4の部分で、2に戻る前に「a += 1」の処理が抜けています。このバグが発生するのはリストCの5・7・8・10・11番目に対応する隠しコインを調べたときで、実際に参照されるフラグ(=aの値)はそれぞれ4・6・7・9・10番目となります。したがって、4と5、6と7、9と10の隠しコインはそれぞれ片方しか取ることができません。

参考文献

[1] おとしもの(隠しアイテム) - ポケモン 赤 緑 青 ピカチュウ 攻略 wiki

http://pokemon1gb2rgbp.wiki.fc2.com/wiki/%E3%81%8A%E3%81%A8%E3%81%97%E3%82%82%E3%81%AE%28%E9%9A%A0%E3%81%97%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%29、2022年5月16日閲覧。

*1:上記の通り、データ上は40枚

*2:上記の通り、取得不可

54個目の隠しアイテムを手に入れる

赤緑版では、正規マップに落ちている隠しアイテムがコインを除いて53個あります[1]*1。これに加えて、バグマップに落ちている隠しアイテムが1個あります。

方法(ピーピーマックスを持っていない場合)

条件

  • タマムシシティかヤマブキジムに1度でも入ったことがある
  • 手持ち道具13~19種類 ※以下で用意する道具を含めて13~19種類にする

用意するもの

  • ニックネームの3文字目の文字コードが(手持ち道具の所持数+128)であるポケモン ※これをPとする
    • 具体的な文字は表1を参照
  • ボール系道具111個 ※14番目セレクトバグなどで用意する*2
  • あなぬけのヒモ1個

ボール系道具とあなぬけのヒモは、手持ち道具の3番目以降に置いておく。また、Pは手持ち2番目~6番目に置いておく。

表1 手持ち道具の所持数ごとの、Pの3文字目に入れる文字
手持ち道具の所持数 3文字目に入れる文字
13
14
15
16
17
18
19

手順

  1. ななしのどうくつ 1階のふしぎなアメが落ちている岩のところに行く。
  2. 道具の13番目でセレクトBB。
  3. 戦闘に入り、ポケモンを選ぶ。
  4. PでAを押す。Pがバグるのでそのまま逃げる。
  5. ボール系道具111個と手持ち道具30番目を入れ替える。
  6. ふしぎなアメが落ちている岩を調べる。ふしぎなアメのかわりにピーピーマックスを手に入れる。
  7. あなぬけのヒモで脱出する。
  8. 手順2~4をもう一度行い、手持ち道具欄を元に戻す。

備考

  • ななしのどうくつ 1階のふしぎなアメを入手済みの場合でもピーピーマックスは手に入れられる。
  • 所持金、主人公のIDなどの値によっては成功しない場合がある。
  • 13番目セレクトバグでバグらせるポケモンのニックネームに指定があるのは、ピーピーマックスを手持ち道具欄の末尾に入れるため。
  • 手順5~7の間は画面の色がおかしくなる。また、この間に戦闘に入った場合、戦闘終了後にフリーズする。
  • 手持ち道具の中に入り込んだバグ道具(00h)は、14番目セレクトバグや手持ち道具31番目と入れ替えるなどで処分する。
  • Pはバグっているので、逃がすことを推奨する。
  • この隠しアイテムはフラグを共有している隠しアイテムではないため、入手は1度きり。

方法(ピーピーマックスを持っている場合)

ピーピーマックスを持っていない場合の方法と比べて、異なる点は以下のとおりです。これ以外はピーピーマックスを持っていない場合の方法と同じです。

条件

  • 手持ち道具13~19種類→手持ち道具13種類以上

用意するもの

  • Pのニックネーム3文字目は、カタカナの濁音以外であれば何でもよい
  • あなぬけのヒモ1個→P以外でテレポートを覚えているポケモン、またはあなぬけのヒモ2個以上

手順

手順7の脱出は、テレポートでの脱出も可

解説

バグマップ6Fhの(x = 14, y = 11)には、隠しアイテムとしてピーピーマックスが置いてあります[2]。このアイテムを取得しようとしてバグマップ6Fhに入ろうとしてもフリーズする[3]ので、別の方法でこのマップに入らないで取得する必要があります。

隠しアイテムを取得するとき、調べるマスの現在地のマップ番号と座標を参照し、それが隠しアイテムの設置場所と一致している場合に取得できます。現在地のマップ番号は、手持ち道具30番目の個数に対応しているため、あらかじめ個数を調整した道具と入れ替えることで現在地のマップ番号を書き換えています。座標は、ななしのどうくつ 1階のふしぎなアメが落ちている岩と同じです。

手持ち道具30番目の個数書き換えによるワープ

手持ち道具30番目の個数を戦闘中に変えるとワープが起こり、非戦闘中に変えてもワープは起こらないというバグ技があります[4]。非戦闘中に書き換えるとフリーズする[4]とされていますが、これは読み込むバンクが異なるマップ番号で書き換えた場合に発生します。ななしのどうくつ 1階とバグマップ6Fhの読み込むバンクは同一であるため、非戦闘中に手持ち道具30番目の個数書き換えを行ってもフリーズしません。

初代ポケモンのマップデータは、いくつかのバンクに分かれてROMに格納されています。マップごとにどのバンクから読み込むかが指定されており、異なるバンクから読み込むマップ番号で書き換えをた場合は、書き換えた瞬間に読み込むバンクが切り替わります。

しかし、書き換えて切り替わるのはバンクのみで、マップ中にいる限り常に実行されるルーチン[5](以下、このルーチンを「マップスクリプト」という。)のアドレスは変更されません。バンクが異なればルーチンの配置も異なるため、マップスクリプトでないものを無理やりマップスクリプトとして実行することになります。このときに未定義命令を読み込むとフリーズします。

同じバンクから読み込むマップ番号で書き換えた場合はバンクの切り替えが発生しないため、マップスクリプトによってフリーズすることはありません。ただし、書き換え後に戦闘した場合はマップデータの再読み込みが行われるため、バグマップの番号に書き換えていた場合はマップの再読み込みによってフリーズします。

参考文献

[1] ガナヒビ、ポケモンの隠しアイテムを全部ゲットしてみた(※バグ要素あり) - YouTubehttps://www.youtube.com/watch?v=lgVuKokKo7I、2022年4月12日閲覧。

[2] Glitch Pokémon League maps 0x6D-0x70, 0x72-0x75 (Red/Blue) - Glitch City Wikihttps://glitchcity.wiki/Glitch_Pok%C3%A9mon_League_maps_0x6D-0x70,_0x72-0x75_(Red/Blue)、2022年4月8日閲覧。

[3] アルク、つれづれなマップ図鑑 | つれづれな日、http://arukuukura.xxxxxxxx.jp/mapdex.html、2023年2月23日閲覧。

[4] ワープ - pokemonbug @ ウィキ - atwiki(アットウィキ)、https://w.atwiki.jp/pokemonbug/pages/12.html、2023年2月23日閲覧。

[5] れんだ、Twitterhttps://twitter.com/waki_renda/status/1276527139257368577、2023年2月23日閲覧。

更新履歴

2022年4月15日 公開

2023年2月25日

  • バグらせるポケモンのニックネームに入れる文字を表で具体的に示す
  • ピーピーマックスを持っている場合の取得方法を追加
  • 解説を強化

*1:このうち1つはマップ外に落ちているので、正規プレイで取得できるのは最大52個

*2:14番目セレクトバグでボールを127個持った状態にして、16個捨てると用意できる。

誤作動するダウジングマシン

ダウジングマシンは、画面内にアイテムが埋まっているかどうかを調べ、埋まっているアイテムがあればそれに反応して知らせてくれるアイテムです。

しかし、赤緑版では埋まっているアイテムが画面内にあるにも関わらずマシンが反応しなかったり、埋まっているアイテムが画面内にないにも関わらずマシンが反応したりすることがあります[1]。

ダウジングマシンを使ったときの処理

※以降に出てくる「隠しアイテム取得フラグ」「リストH」「リストI」については、フラグを共有している隠しアイテムを参照してください。

まず、ダウジングマシンを使ったときの処理を説明します。
ダウジングマシンを使ったときの処理は、以下のようになっています。

  1. リストIの各エントリのうち、主人公がいるマップと同一であるものを対象とする。対象となるエントリに対して以下の処理を行う。
    1. エントリに対応する隠しアイテム取得フラグを参照し、取得状況を調べる。
    2. 主人公の座標とエントリの座標から、隠しアイテムが画面内に存在するかどうかを調べる。
    3. 未取得かつ画面内に存在する隠しアイテムが1つ以上存在する場合は「近くに埋まっている」、そうでない場合は「近くに埋まっていない」とする。
  2. 「近くに埋まっている」「近くに埋まっていない」それぞれの場合について、対応したメッセージを表示する。

ダウジングマシンが誤作動を引き起こすケース

冒頭で書いたように、特定の場面ではダウジングマシンが誤作動することがあります。

リストIの座標が間違って設定されている・リストIにエントリが存在しないもの

該当アイテム

ダウジングマシンは、実際にアイテムが埋まっているリストHの座標ではなく、リストIの座標に対して反応します。5つの隠しアイテムに対応するリストIのエントリは、実際に埋まっている座標と異なる座標が設定されており、1つの隠しアイテムはリストIに対応するエントリが存在しません。このため、本来埋まっている場所ではマシンが反応することはありません。
また、座標の設定ミスにより本来立つはずのフラグが立つことはないため、リストIの座標に対しては常にマシンが反応します。

アイテムが埋まっている座標によるもの

該当アイテム

  • サントアンヌ号 地下1階客室のすごいキズぐすり (x = 0, y = 6)
  • モノマネむすめの家 2階のきんのたま (x = 0, y = 6) ※これは実際に埋まっている位置であり、マシンが反応する位置は(x = 0, y = 1)

これは、ダウジングマシンを使ったときの処理bにおいて、x座標かy座標のどちらかが0の位置に埋まっている隠しアイテムに対しては、誤って常に画面外にあると判定してしまうためです。

参考文献

[1] しづき、ダウジングマシンの誤作動 | 伝説のスターブロブ2、https://hakuda2.web.fc2.com/wario/poke1/k26.html、2022年3月30日閲覧。

フラグを共有している隠しアイテム

赤緑版では、6つの隠しアイテムのどれかを取ると他のものが取れなくなり、グレンタウンで化石を渡そうとするたびに再び取れるという現象が起こります[1]。
ここでは、この現象の仕組みについて説明します。

隠しアイテムを調べたときの処理

まず、隠しアイテムに関するフラグと2つのリストを定義します。

隠しアイテム取得フラグ
各隠しアイテムごとにbit単位で与えられる。1なら取得済み、0なら未取得。先頭アドレスはD66Fh。
リストH
隠しアイテムを含む隠しオブジェクトを定義しているリスト。マップごとに用意される。実際に置かれている隠しアイテムの座標は、このリストに基づく。
リストI
隠しアイテムのあるマップと座標を定義しているリストで、フラグ立て・フラグ参照に使用される。リストIの各エントリはマップ番号と座標で構成される。最後のエントリの直後には、終端を表すFFhの1バイトがある。

隠しアイテムが置いてあるマスを調べたとき、以下の処理が行われます。

  1. 調べている隠しアイテムが、リストIの何番目にあるかを探し、その位置を返す(この値をaとする)。なお、リストIの先頭は0番目とする。
  2. a番目の隠しアイテム取得フラグを参照し、調べている隠しアイテムが取得済みかどうかを調べる。
  3. 未取得だった場合、隠しアイテム入手のメッセージを表示し、a番目の隠しアイテム取得フラグを立ててアイテムを入手する。取得済みの場合は何もしない。

1の処理は、調べている隠しアイテムがあるマップ番号・X座標・Y座標と完全一致するエントリの位置を返します。
そのようなエントリが存在しない場合、1の処理は何番目かという情報のかわりに終端のFFhを返します。

例: トキワシティ(01h)のキズぐすり(x = 14, y = 4)の場合

  1. マップ01h・座標(x = 14, y = 4)はリストIの34番目にあるので、a = 34となります。
  2. 34番目の隠しアイテム取得フラグ(D673hのbit2)を参照し、取得済みかどうかを調べます。
  3. 未取得だった場合は隠しアイテム入手のメッセージを表示し、34番目のフラグを立ててキズぐすりを入手します。

6つの隠しアイテムについて

リストHに含まれるほとんどの隠しアイテムは、マップ・X座標・Y座標が完全一致するエントリがリストIに存在しているため、隠しアイテムを調べたときの処理は正常に行われます。しかし、例の6つの隠しアイテムは、リストHとリストIとの間で座標が一致していないか、あるいはリストIにエントリが存在していません。
そのため、これら6つの隠しアイテムを調べたときは255番目のフラグ(D68Ehのbit7)を参照し、隠しアイテムを手に入れた際は255番目のフラグが立ちます。 6つの隠しアイテムは参照するフラグが同一であるため、どれか1つを取得すると他の隠しアイテムは取得できなくなります。

リストH・リストIにおける6つの隠しアイテムの座標[2][3]
マップ アイテム リストHでの座標(実際に隠されている場所) リストIでの座標
ロケット団アジト 地下3階 きんのたま x = 27, y = 17 x = 22, y = 23
13ばんどうろ リゾチウム x = 16, y = 13 x = 48, y = 8
ポケモンやしき 地下1階 ふしぎなアメ x = 1, y = 9 存在しない
モノマネむすめの家 2階 きんのたま x = 0, y = 6 x = 0, y = 1
ななしのどうくつ 1階 ふしぎなアメ x = 14, y = 11 x = 15, y = 11
ななしのどうくつ 地下1階 ハイパーボール x = 27, y = 3 x = 29, y = 22

例: 13ばんどうろ(18h)のリゾチウム(x = 16, y = 13)を取得してからロケット団アジト地下3階(C9h)のきんのたま(x = 27, y = 17)を取得しようとする場合
※これ以外の4つのアイテムは入手していないものとする

  1. マップ18h・座標(16, 13)はリストIに存在しないため、a = 255となります。
  2. 255番目の隠しアイテム取得フラグ(D68Ehのbit7)を参照し、取得済みかどうかを調べます。
  3. 隠しアイテム入手のメッセージを表示し、255番目のフラグを立ててアイテムを入手します。

↑ここまでリゾチウムが置いてあるマスを調べたときの処理/↓ここからきんのたまが置いてあるマスを調べたときの処理

  1. マップC9h・座標(27, 17)はリストIに存在しないため、a = 255となります。
  2. 255番目の隠しアイテム取得フラグ(D68Ehのbit7)を参照し、取得済みかどうかを調べます。
  3. 3の処理により255番目のフラグが立っており取得済みとみなされるため、きんのたまを入手することはできません。

化石を渡そうとすると再び取れる理由

255番目のフラグがあるアドレスは隠しアイテム取得フラグの領域外であり、ポケモンけんきゅうじょのエラーイ博士に渡そうとしている化石のアイテム番号が格納されます。
化石のアイテム番号は3つともbit7が0であるため、化石を渡そうとするたびに255番目のフラグが降ろされ、6つの隠しアイテムを再度入手することができます。

参考文献

[1] しづき、何度でも取れるアイテム | 伝説のスターブロブ2、https://hakuda2.web.fc2.com/wario/poke2/r38.html、2022年3月18日閲覧。

[2] Broken hidden items glitch - Glitch City Wikihttps://glitchcity.wiki/Broken_hidden_items_glitch、2022年3月18日閲覧。

[3] Broken hidden items - Bulbapedia, the community-driven Pokémon encyclopedia、https://bulbapedia.bulbagarden.net/wiki/Broken_hidden_items、2022年3月18日閲覧。