レポートのデータ構造(初代)

初代ポケモンのレポートは、SRAMに記録されます。初代ポケモンSRAMは32KiBであり、各8KiBのバンク4つ(バンク0~3)で構成されています。この記事では、各SRAMバンクごとのデータ構造を示します。

※開始アドレス・終了アドレスは、メモリ上のアドレスを示しています。
※未使用領域は、データクリア以外で読み書きすることはありません。

バンク0

表1 バンク0の構造
開始アドレス 終了アドレス サイズ(byte) 内容 備考
A000h A187h 392 グラフィックバッファ領域0 圧縮されているグラフィックデータの展開に使用される
(他のバッファ領域も同様)
A188h A30Fh 392 グラフィックバッファ領域1  
A310h A497h 392 グラフィックバッファ領域2  
A498h A597h 256 未使用  
A598h B857h 4800 殿堂入りデータ(50回分)  
B858h BFFFh 1960 未使用  

殿堂入りデータ

殿堂入りデータは1回あたり96バイトで、下位アドレス側から古い順に入っています。

表2 1回の殿堂入りデータの構造
オフセット サイズ(byte) 内容
0 16 1匹目の殿堂入りポケモン
16 16 2匹目の殿堂入りポケモン
32 16 3匹目の殿堂入りポケモン
48 16 4匹目の殿堂入りポケモン
64 16 5匹目の殿堂入りポケモン
80 16 6匹目の殿堂入りポケモン
表3 殿堂入りポケモンの構造
オフセット サイズ(byte) 内容
0 1 外見の内部番号
1 1 レベル
2 6 ニックネーム
8 8 00h (パディング)

1回の殿堂入りポケモンが5匹以下の場合は、その回の最後の殿堂入りポケモンの直後にFFhが入り、FFhより後ろの領域は全て00hとなります。例えば3匹で殿堂入りした場合、最初の3匹分は表3のデータが書き込まれます。4匹目は外見の内部番号にFFhが書き込まれ、残りの15バイト分の領域に00hが書き込まれます。5匹目と6匹目のデータは全て00hが書き込まれます。

バンク1

表4 バンク1の構造
開始アドレス 終了アドレス サイズ(byte) 内容 WRAM・HRAMの対応アドレス 備考
A000h A597h 1432 未使用    
A598h A59Dh 6 主人公の名前 D11Dh~D122h  
A59Eh ACD4h 1847 メインデータ D27Bh~D9B1h  
ACD5h AED4h 512 スプライトデータ C100h~C2FFh  
AED5h B02Ch 344 手持ちポケモンのデータ D123h~D27Ah  
B02Dh B592h 1382 現在選択中のボックスのデータ D9B2h~DF17h  
B593h B593h 1 ? FFD7h 詳細不明(タイル関連の値)
B594h B594h 1 チェックサム - A598h~B593hのチェックサム
B595h BFFFh 2667 未使用    

チェックサムは、次のようにして計算されます: 範囲内の値を1バイト単位で全て足し合わた値を256で割った余りを求める。その値をビット反転した値がチェックサムとなる。

レポートに書き込まれるWRAMのアドレスを昇順に並べると、次のようになります: C100h~C2FFh、D11Dh~DF17h
(すなわち、アドレスC000h~C0FFh、C300h~D11Ch、DF18h~DFFFhのデータはセーブされない)

バンク2・3

表5 バンク2・3の構造
開始アドレス 終了アドレス サイズ(byte) 内容 備考
A000h A565h 1382 ボックス1・5 バンク2はボックス1、バンク3はボックス5
A566h AACBh 1382 ボックス2・6 バンク2はボックス2、バンク3はボックス6
AACCh B031h 1382 ボックス3・7 バンク2はボックス3、バンク3はボックス7
B032h B597h 1382 ボックス4・8 バンク2はボックス4、バンク3はボックス8
B598h B598h 1 チェックサム A000h~B598hのチェックサム(このアドレス自身もチェックサムの計算対象になる)
ただし、このアドレスが読み込まれることはない
B599h BFFFh 2663 未使用  

外部リンク

Save data structure (Generation I) - Bulbapedia, the community-driven Pokémon encyclopedia *1

*1:リンク先の解説は英語版を対象としており、日本語版とは構造が違う点に注意

通信なし進化(赤緑青)

以下の方法により、通信交換で進化するポケモンをレベルアップで進化させることができます。

セレクトバグを用いる方法

※この方法は、2020年11月13日のツイートを加筆・修正して記事化したものです。

用意するもの

  • いらないポケモン2匹
    • ニックネームの3文字目が「わ」であるポケモン (以下P1とする)
    • ポイントアップ0回使用・残りPPが50の技を含めて技を2つ以上覚えているポケモン (以下P2とする)
      • 残りPP50の技は一番下に置いておく。
  • 道具13種類以上
  • タマムシシティかヤマブキジムに1度でも入っておく (13番目セレクトバグを行うため)
    • 必須ではないが準備が面倒になるため入っておくことを推奨

手順

  1. P1を手持ち6番目に、P2を手持ち1番目に置く。
  2. P1に対して13番目セレクトバグを行い、そのまま逃げる。
  3. 手持ち道具の一番下でセレクトBB。
  4. 野生のポケモンとエンカウントする。
  5. たたかうを選び、残りPP50の技でセレクト、そのまま逃げる。
  6. P1に対して再度13番目セレクトバグを行い、そのまま逃げる。
  7. これ以降電源を切るかリセットするまで、通信交換で進化するポケモンがレベルアップ(戦闘・ふしぎなアメどちらでも可)で進化するようになる。

備考

  • 通信なし進化ができる状態では、通常のレベルアップ進化・石進化はできない。石進化の場合、ポケモン一覧では「つかえる」と表示されるが、使っても「つかっても こうかが ないよ」と表示される。
  • 通信交換で進化するポケモンがレベルアップで進化するとき、Bボタンによる進化キャンセルは可能。
  • 手順3で手持ち道具欄を一番下までスクロールさせているときにスクロールが止まった場合は、Bボタンを一度押す。このとき手持ち道具欄が閉じられた場合は、一番下までスクロールできているので、再度手持ち道具欄を開いてセレクトBBをすればいい。
  • 手順5~7の間にトレーナーに見つかると、ドッペルゲンガーが勝負を仕掛けてきてフリーズすることがある[1][2]。
  • 手順5を行ったときに入れ替わる技は、手持ち6番目のバグっているポケモンの1番目の技(D343h)。
  • 進化させたあとにマップのグラフィックがバグった場合は、メニューから主人公の情報を見ると治る。

名前の長いバグわざを利用する方法 (Super Glitchを利用するもの)

※この方法は、juninさんによるものです。

文献: 上から順に[3][4]

備考

この方法で通信なし進化をしてからレポートを書くときは、レポートを書く前に必ずポケモンセンターの受付に話しかけ、「あずける/やめる」の選択肢を表示させること(回復する必要はない)。これを行わなかった場合、レポートを書く際にバグ選択肢が表示されてフリーズすることがある。

解説

文献: [5]

具体的には、アドレスD0F0hの値が32hのとき、通信なし進化ができるようになります[6]。セレクトバグを用いた方法は、戦闘中の自分のポケモンの221番目の残りPPがアドレスD0F0hに対応していることを利用しています。名前の長いバグわざを用いた方法は、技名バッファとなるアドレスD0BEhから数えて51文字目がアドレスD0F0hに対応していることを利用しています。

参考文献

[1] ROTF、D0F0の挙動 | ROTFの覚え書き、https://rollingonthefloor.blog.fc2.com/blog-entry-174.html、2022年7月13日閲覧。

[2] ROTF、『名前の長いバグわざ』について | ROTFの覚え書き、https://blog-imgs-111-origin.fc2.com/r/o/l/rollingonthefloor/20190516082325823.html、2022年7月13日閲覧。

[3] junin、Twitterhttps://twitter.com/junin_x10/status/1327899855671312385、2022年7月12日閲覧。

[4] junin、Twitterhttps://twitter.com/junin_x10/status/1329007295527677952、2022年7月12日閲覧。

[5] junin、Twitterhttps://twitter.com/junin_x10/status/1327637221273264128、2022年7月12日閲覧。

[6] 【GB/VC】ポケモン 赤緑青ピカチュウ 36【初代】 [無断転載禁止]©2ch.net | 5ちゃんねる、https://tamae.5ch.net/test/read.cgi/poke/1485481078/626、2022年7月18日閲覧*1

付録

ポイントアップ0回使用・残りPP50の技を用意する方法

この技を用意する方法はいくつかありますが、最大PPが50~63の安全なバグ技を用意するのが楽だと思います。以下にその方法を示します。

用意するもの
  • 道具9種類以上
  • 以下の条件を満たすいらないポケモン(以下Aとする)
    • 経験値を256で割ったあまりが207(赤緑)・212(青)である
    • こうげきの実数値を256で割ったあまりが63以下
手順
  1. Aを手持ち1番目に置く。
  2. 道具の9番目でセレクトBB。
  3. 野生のポケモンとエンカウントし、たたかう→いらない技でセレクト、セレクト後はそのまま逃げる。
  4. Aがわざマシン07(赤緑)・わざマシン12(青)を覚えており、その技の最大PPが53(赤緑)・50(青)であることを確認する。
  5. Aをポケモンセンターで回復させる。
  6. (赤緑のみ)戦闘でわざマシン07を3回だけ使う。

更新履歴

2022/07/22 公開

2022/07/28 名前の長いバグ技を利用した方法に備考(注意事項)を追記

2022/08/02

  • セレクトバグを用いる方法に、元ツイートへのリンクを追加
  • セレクトバグを用いる方法に、道具を13種類以上用意することを追記
  • 付録としてポイントアップ0回使用・残りPP50の技を用意する方法を追記

*1:通信なし進化の流れは611~632あたり

13番目セレクトバグでハマる原因と回避条件

ピカチュウバージョン以外の初代ポケモンには、13番目セレクトバグというどうぐ欄のやめるよりも下にスクロールすることができる裏技があります[1]。この裏技は、ある程度ストーリーを進めていないと、バグらせるポケモンを選んだときにハマりが起こります。これは入れ替えて出てくる手持ち13番目のポケモンのHPが、HPバーの長さ計算でハマる条件を満たしているためです。

※この記事を読む前に、HPバーについて(初代)の記事を見ることをおすすめします。

手持ち13番目のポケモン

そもそも手持ち13番目のポケモンとは、一体何でしょうか。初代ポケモンでは手持ちポケモンは6匹までであり、メモリ上でも6匹分だけの領域が確保されています。6匹目のデータより後ろには、手持ちポケモンとは別のデータが入っています。

13番目セレクトバグをした場合、バグらせるポケモンと手持ち13番目のポケモンのデータを入れ替える処理が行われます。前述の通り手持ち7番目以降のポケモンのデータは存在しませんが、ポケモンのデータを入れ替える処理ではそれを気にせず手持ち13番目のポケモンに相当する領域のデータと入れ替えが行われます。

メモリ上、手持ちポケモンのデータは以下のように配置されています[2][3]。

手持ちポケモンの数
D123h
手持ちポケモンの外見
D124h~D129h、1匹あたり1バイト
終端(手持ちポケモンを6匹持っているときに使用される)
D12Ah
手持ちポケモンのデータ
D12Bh~D232h、1匹あたり44バイト
手持ちポケモンの親名
D233h~D256h、1匹あたり6バイト
手持ちポケモンのニックネーム
D257h~D27Ah、1匹あたり6バイト

手持ち7番目以降のポケモンの外見・データ・親名・ニックネームの領域は、それぞれ手持ち6番目のポケモンの領域以降に続いているものとみなします。したがって、手持ち13番目のポケモンに相当するメモリ上の領域は、以下のようになります。

外見
D130h (手持ち1番目のタイプ1)
データ
D33Bh~D366h (現在いるマップの出口情報の一部、後述)
親名
D27Bh~D280h (捕まえたフラグ (図鑑No. 1~48))
ニックネーム
D29Fh~D2A4h (見つけたフラグ (図鑑No. 137~152)、手持ち道具所持数、手持ち道具1番目の種類・個数、手持ち道具2番目の種類)

冒頭で書いた通り、ハマりの原因は手持ち13番目のポケモンのHPにあります。手持ち13番目のポケモンの現在HPのアドレスはD33Ch~D33Dh、最大HPのアドレスはD35Dh~D35Ehです。このアドレスは、出口情報の一部分です。出口情報については次で説明します。

出口情報

出口情報とは、現在いるマップに存在する扉・階段・ワープパネルなどの出口について、出口ごとに座標と移動先を定めているものです*1。1つの出口情報は、出口のY座標・X座標・移動先出口番号・移動先マップ番号の4バイトで構成され、アドレスD32Eh以降に配置されます[4]。これとは別に、アドレスD32Dhに現在いるマップの出口の数が格納されます[4]。

出口情報とアドレスの対応を表1に示します。

表1 出口番号ごとの出口情報とアドレスの対応[4]
出口番号 Y座標 X座標 移動先出口番号 移動先マップ番号
0 D32Eh D32Fh D330h D331h
1 D332h D333h D334h D335h
2 D336h D337h D338h D339h
3 D33Ah D33Bh D33Ch D33Dh
中略
11 D35Ah D35Bh D35Ch D35Dh
12 D35Eh D35Fh D360h D361h
中略
31 D3AAh D3ABh D3ACh D3ADh

例えばマサラタウンにいる場合、アドレスD32Dhの値は03hとなり、D32Eh以降に配置される出口情報は表2のようになります。

表2 マサラタウンにいるときの出口情報
出口番号 Y座標 X座標 移動先出口番号 移動先マップ番号
0 05h 05h 00h 25h (主人公の家 1階)
1 05h 0Dh 00h 27h (ライバルの家)
2 0Bh 0Ch 01h 28h (オーキド研究所)

出口情報は、最初から始めたときは全領域が00hになっており、マップを切り替えたときか戦闘を終わらせたときに、現在いるマップに対応した情報に更新されます。このとき更新される出口情報は、出口番号0番から(現在いるマップの出口の数 - 1)番までで、(現在いるマップの出口の数)番目以降の情報はそのまま残ります*2。また、出口情報はレポートに記録されるので、リセットして続きから始めても初期化されることはありません。

手持ち13番目のポケモンのHPと出口情報の関係

手持ち13番目のポケモンのデータは、3番出口のX座標から14番出口のY座標に対応します。このうち、現在HPのアドレスは3番出口の移動先出口番号・移動先マップ番号、最大HPのアドレスは11番出口の移動先マップ番号・12番出口のY座標に対応します。これらのアドレスの値が変わる条件を述べます。

手持ち13番目のポケモンの現在HPが変わる条件

手持ち13番目のポケモンの現在HPは、ゲームを始めた時点では0です。現在HPは、出口が4箇所以上あるマップに入ったときに変わります。現在HPが始めて変わるタイミングは、最初にトキワシティ(5箇所)に入ったときです*3。一度トキワシティに入った後は、手持ち13番目のポケモンの現在HPが0になることはありません*4

手持ち13番目のポケモンの最大HPが変わる条件

手持ち13番目のポケモンの最大HPは、ゲームを始めた時点では0です。最大HPは、出口が12箇所以上あるマップに入ったときに変わります。出口が12箇所以上あるマップは、以下のとおりです(緑後期で確認)。

  • ヤマブキジム (32箇所)
  • タマムシシティ (13箇所)
  • サントアンヌ号 2階客室 (12箇所)

それぞれのマップに入った後の最大HPは、以下のようになります(緑後期で確認)。

ヤマブキジム
45585 (B211h)
タマムシシティ
35611 (8B1Bh)
サントアンヌ号 2階客室
上記2マップに入っていない場合: 24576 (6000h)
ヤマブキジム→客室の順で入った場合: 24593 (6011h)
タマムシシティ→客室の順で入った場合: 24603 (601Bh)

13番目セレクトバグでハマりを回避する条件

結論から先にいうと、13番目セレクトバグでハマりが起こらなくなる条件は、「タマムシシティかヤマブキジムに1度でも入る」です。以下で詳細を述べます。

ゲームを始めてからトキワシティに入るまでの間は、手持ち13番目のポケモンの最大HP・現在HPはともに0であるため、この時点では13番目セレクトバグを行ってもハマることはありません。しかし、この時点で道具を13種類以上持つことは不可能であるため、そもそも13番目セレクトバグはできません。

トキワシティに入ってから出口が12箇所以上あるマップに入るまでの間は、手持ち13番目のポケモンの最大HPは0・現在HPは0でない値となり、HPバーの長さ計算でハマる条件を満たしているためハマりが起こります。出口が12箇所以上あるマップのうちサントアンヌ号 2階客室だけ入った場合、最大HPは24576となります。これは1024の倍数であるため、同様にハマりが起こります。

タマムシシティかヤマブキジムに1度でも入った場合、最大HPは45585・35611・24593・24603のいずれかとなります。これらは1024で割ったあまりが4以上であるため、HPバーの長さ計算でハマる条件を満たさずハマりは起こりません。

別の回避方法として、バグらせるポケモンを外見がアネ゛デパミ゛ポケモンより下に置いて13番目セレクトバグを行うという方法があります[5]。この場合はカギカッコ内の条件を満たす必要はありません。

参考文献

[1] ありす*、13番目セレクトバグ---鞄は13で出来ている。アンリミテッドアイテムワークス--- - Wonderland Seeker、https://alice-wreath.hatenablog.com/entry/2019/11/14/114946、2022年6月14日閲覧。

[2] ゴールド、レポートデータ | POKeMON Bug HiSTORiA、http://pokemon.s20.xrea.com/bug/1st/memory.html、2022年6月16日閲覧。

[3] れんだ、D120からDFFFまでを表したCの構造体 | 8D A7 87 93 19 07 50、https://www.msmrrenda.net/~renda/select/memory_struct.h、2022年6月16日閲覧。

[4] 2P、利用者:2P/第一世代のワープバグ - ポケモンWiki

https://wiki.ポケモン.com/wiki/%E5%88%A9%E7%94%A8%E8%80%85:%EF%BC%92%EF%BC%B0/%E7%AC%AC%E4%B8%80%E4%B8%96%E4%BB%A3%E3%81%AE%E3%83%AF%E3%83%BC%E3%83%97%E3%83%90%E3%82%B0、2022年6月20日閲覧。

[5] れんだ、シュレディンガーのゼロ除算 - タマムシ未到着で道具欄拡張 | 8D A7 87 93 19 07 50、http://www.msmrrenda.net/~renda/select/07_schroedinger.html、2022年6月22日閲覧。

*1:ただし、ふたごじまなどに存在する落とし穴やポケモン屋敷に存在する上から飛び降りるマスは含みません。

*2:出口が1つもないマップに移動したときは、出口の数だけ更新されます。

*3:マサラタウンマサラタウンの建物(4マップ)は出口が3箇所以下、1番道路は出口なし

*4:マサラタウンの0番出口につながるのは主人公の家 1階のみだが、移動先出口番号はFFhとなっている。

HPバーについて(初代)

この記事では、初代ポケモンにおけるHPバーの長さ・色・ピンチ音について説明します。

HPバーの長さ

現在HPが 0 の場合は HPバーの長さ = 0 で、以下の計算は行わない。現在HPが 1 以上の場合、HPバーの長さ = (X / Y) を 256 で割った余り。ただし、 計算結果が 0 となった場合は 1 とする。なお、小数点以下は出るたびに切り捨てる(これ以降も同様)。

X と Y の値は以下の通り。

最大HPが 256 未満のとき:

  • X = 現在HP * 48
  • Y = 最大HP

最大HPが 256 以上のとき:

  • X = 現在HP * 48、その後下位 2 バイトを 4 で割る
  • Y = (最大HP / 4) を 256 で割った余り

最大HPが 256 以上のときの X の値について、例を示します。

現在HPが 200 のとき
現在HP * 48 の値は 9600 (2580h)、下位 2 バイトを 4 で割った値は 2400 (960h)

現在HPが 1400 のとき
現在HP * 48 の値は 67200 (10680h)、下位 2 バイトを 4 で割った値は 65952 (101A0h)

ハマりが起こるケース

Y が 0 となった場合、ゼロ除算によるハマりが起こります。ハマりが起こる条件(すなわち、Y が 0 となる条件)は、現在HPが 1 以上で、最大HPが以下のどちらかの条件を満たすときです。

  • 最大HPが 0
  • 最大HPが 1024 以上かつ 1024 で割った余りが 0 ~ 3

HPバーの長さが不正になるケース

以下のいずれかの条件を満たす場合、HPバーの長さは最大HPに対する現在HPの割合ではなくなります。

  • X / Y の値が 256 以上
  • 最大HPが 256 以上かつ現在HPが 1366 以上
  • 最大HP が 1028 以上

なお、ステータス計算においてHPを含む各ステータスは 999 が上限となります。そのため、現在HP・最大HPが 1000 以上となるのは、セレクトバグなどで HP の値を直接書き換えるか、そのような値を持ったポケモン(に相当するデータ)と入れ替える場合に限られます。

HPバーの色

スーパーゲームボーイでプレイしている場合、HPバーの長さによって色が変わります。

  • 9 以下: 赤
  • 10 以上 26 以下: 黄
  • 27 以上: 緑

ピンチ音

プレイしているハードウェアによらず、戦闘中自分のポケモンのHPバーの長さが 9 以下のときにピンチ音が鳴ります。スーパーゲームボーイでプレイしている場合、HPバーの色が赤のときにピンチ音が鳴るとも言えます。

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

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

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とする
    • 例: 道具を14種類持っている場合、3文字目を「ソ」(=文字コード142)にする
  • ボール系道具111個 ※14番目セレクトバグなどで用意する
  • あなぬけのヒモ1個

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

用意しないもの

  • ピーピーマックス ※持っている場合はパソコンに預けておく

手順

  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度きり。

解説

バグマップ6Fhの(x = 14, y = 11)には、隠しアイテムとしてピーピーマックスが置いてあります[2]。この裏技は、主人公が現在いるマップを6Fhに書き換えることによって、この隠しアイテムを入手しています。

参考文献

[1] ガナヒビ、ポケモンの隠しアイテムを全部ゲットしてみた(※バグ要素あり) - YouTube

https://www.youtube.com/watch?v=lgVuKokKo7I、2022年4月12日閲覧。

[2] 

Glitch Pokémon League maps 0x6D-0x70, 0x72-0x75 (Red/Blue) - Glitch City Wiki

https://glitchcity.wiki/Glitch_Pok%C3%A9mon_League_maps_0x6D-0x70,_0x72-0x75_(Red/Blue)、2022年4月8日閲覧。

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

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

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

しかし、赤緑版では埋まっているアイテムが画面内にあるにも関わらずマシンが反応しなかったり、埋まっているアイテムが画面内にないにも関わらずマシンが反応したりすることがあります[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日閲覧。