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日閲覧。

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

赤緑版では、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日閲覧。