2026年8月1日土曜日

初代ポケモン「けつばん」の正体とは?バグが発生する仕組みをプログラムから解説

1996年2月27日、ゲームボーイ用ソフト『ポケットモンスター 赤・緑』が発売されました。通信ケーブルを使ってポケモンを交換するという新しい遊びは、子どもたちの間に大きな熱狂を生み出します。

その一方で、当時のプレイヤーたちの間では、通常の冒険では出会えない奇妙な存在が噂になりました。それが、英語では「Missing No.」、日本では「けつばん」と呼ばれていた謎のポケモンです。

崩れたドット絵、不自然な鳴き声、突然の暗転やフリーズ。まるでゲームの中に潜む怪物のように語られましたが、その正体は魔法でも呪いでもありません。

けつばんは、プログラムが想定されていないデータを読み込み、与えられた命令をそのまま実行した結果として現れるバグです。ここからは、初代ポケモンの内部番号やメモリの仕組みをもとに、その発生メカニズムを見ていきましょう。

「けつばん」の正体は未使用の内部番号

けつばんの正体を理解するには、ゲームがポケモンをどのように識別しているのかを知る必要があります。

プレイヤーから見れば、フシギダネは図鑑番号1番、ヒトカゲは4番です。しかし、ゲーム内部では図鑑番号とは別に、データを管理するための「内部番号」が使われています。

1バイトで表現できる256パターン

初代ポケモンでは、ポケモンを識別するために「1バイト」と呼ばれる単位が利用されています。1バイトは8ビットで構成され、0から255までの256パターンを表現できます。

  • 図鑑番号:プレイヤーが図鑑で確認する1から151までの番号
  • 内部番号:プログラムがポケモンのデータを管理するための番号
  • 未使用領域:内部番号の中で正式なポケモンが割り当てられていない領域

内部番号のすべてに正式なポケモンが登録されているわけではありません。原文で示されている38か所の未使用領域には、開発途中で使われなくなったデータ枠などが残されていました。

こうした空白の枠をゲームがポケモンとして読み込んだとき、便宜上表示されるのが「けつばん」です。名前のとおり、正式なデータが存在しない「欠番」を参照している状態だと考えられます。

開発途中の試行錯誤が残った領域

初代ポケモンの開発では、限られた容量の中で数多くの調整が行われました。構想されていたポケモンが削除されたり、内部番号の割り当てが変更されたりした結果、一部の番号だけが空いた状態で残ったとされています。

例えば、原文では仮名「コカーナ」として設計されていた内部番号38h、10進数では56番の領域が挙げられています。

開発終盤には、森本茂樹氏が約300バイトの空き領域を利用してミュウを追加したというエピソードも知られています。一方で、それ以外の使われなかった内部番号は、空の引き出しのような状態でプログラム内に残されました。

なぜ「けつばん」が出現するのか

未使用の内部番号が残っているだけでは、通常のプレイ中にけつばんが現れることはありません。出現には、ゲームが本来読み込むはずのないデータへアクセスする特殊な状態が必要です。

原文では、メタモンの技の入れ替えなどを利用し、1番目の技が空白となる状態を作る方法が説明されています。この空白データを読み込もうとすることで、プログラムの処理が想定された範囲から外れていきます。

内部番号00という空白データ

技の内部番号00は、技としての正常な情報を持たない空白のデータです。PPやタイプなどの値も0となっているため、本来は技として選択されることを想定していません。

ところが、特殊な操作によって空白の技にカーソルが合うと、ゲームはそこに技の情報があるものとして処理を始めます。

文字列の終わりを見失う

ゲーム内の文章や名前には、どこまでが文字列なのかを示す終端コードが必要です。原文では、この役割を持つコードとして「0x50」が挙げられています。

正常なデータであれば、プログラムは0x50を見つけた時点で読み込みを終了します。しかし、空白の技を読み込んだ状態では、想定された20バイト以内に終端コードが見つかりません。

するとプログラムは、文字列の終わりが分からないまま、隣接するメモリ領域のデータまで読み進めてしまいます。

画面のドットデータまでコピーされる

読み込みが止まらなくなると、技とは関係のない画面上のドットデータまで、文字列の一部として扱われる可能性があります。

さらにコピー処理が続き、相手ポケモンの内部番号を保存している領域まで到達すると、画面データに含まれていた数値によって内部番号が書き換えられます。

そこで偶然「38h」という値が書き込まれれば、ゲームは内部番号38hのポケモンを表示しようとします。しかし、その番号には正式なポケモンのデータが存在しません。結果として、けつばんが画面上に現れます。

画面の見た目が出現ポケモンを変える理由

このバグの興味深い点は、画面に表示されているグラフィックが結果に影響することです。

原文では、グラフィックを反転させた状態で同じ操作を行うと、出現するポケモンがピカチュウに変わる例が紹介されています。

ピカチュウの内部番号は54hです。画面を反転させることでドットデータの数値が変化し、その値が相手ポケモンの内部番号を保存する領域へ書き込まれた結果、54hがポケモンの番号として読み取られたと説明できます。

つまり、画面上では単なる模様に見えるデータが、バグによってポケモンを指定する数値として扱われたのです。データの役割が崩れ、見た目を構成する情報がゲームの処理そのものへ影響を与えています。

けつばんで画面崩れやフリーズが起こる仕組み

けつばんには、正式なポケモンのように整えられた名前、能力、鳴き声、グラフィックなどのデータがありません。

そのため、ゲームがけつばんを表示しようとすると、ポケモンとは関係のない領域を画像や音声のデータとして読み込んでしまうことがあります。これが、ドット絵の崩れや不自然な鳴き声、暗転、フリーズにつながります。

異常なサイズのグラフィックデータ

特に問題になりやすいのが、戦闘画面で使用される後ろ姿のデータです。

正式な画像データが存在しないため、ゲームは別の領域にある数値を画像サイズや画像情報として解釈することがあります。その数値が異常に大きい場合、本来の範囲を超えてデータを読み込み、隣接するメモリ領域へ影響を与えます。

ここでいうメモリの「破壊」とは、ゲームボーイ本体が物理的に壊れるという意味ではなく、ゲーム内で使用されているデータ領域が上書きされ、正常な処理を続けられなくなる状態を指します。

存在しない画像を参照した場合

けつばんの中には、化石など別のグラフィックが表示されるものもあります。一方で、表示に必要な前姿のデータが正しく参照できない種類も存在します。

プログラムが存在しない画像データを読み込もうとすると、処理を続けるための正常な参照先を見つけられません。その結果、ゲームが停止したり、画面が崩れたりすることがあります。

アイテムが128個増えるバグの原因

けつばんは、画面表示だけでなく、手持ちアイテムの個数にも影響を与えることで知られています。

原文では、けつばんと遭遇した際に行われる図鑑データの更新処理と、手持ちどうぐ6番目の個数データが関係していると説明されています。

1バイトに複数の情報を詰め込む仕組み

初代ポケモンでは、限られたメモリを有効活用するため、1バイトの各ビットを使って複数の情報を管理しています。

1バイトは8ビットで構成されているため、1匹につき1ビットを割り当てれば、1バイトで8匹分の発見状況を記録できます。対象のビットが0なら未発見、1なら発見済みという仕組みです。

図鑑データとアイテム個数の干渉

けつばんと遭遇すると、ゲームは図鑑番号000に相当する未使用領域を発見済みにしようとします。その際、図鑑管理用として扱われた7ビット目が1に変更されます。

ところが、そのメモリ領域が手持ちどうぐ6番目の個数データと重なっているため、アイテムの個数にも同じ変更が反映されます。

7ビット目が立つと数値に128が加わるため、6番目に置かれていたアイテムの個数が大きく増加します。これが、けつばんによるアイテム増殖バグの仕組みです。

「けつばん」から学べるプログラムの教訓

けつばんを単なるゲームの不具合として片付けることもできます。しかし、その仕組みを詳しく見ると、限られた容量の中でゲームを完成させようとした開発者たちの工夫や、当時のプログラム設計が見えてきます。

限られたメモリを活用する工夫

図鑑の発見状況を1匹ずつ1バイトで保存するのではなく、1バイトに8匹分の情報を詰め込む方法は、容量を節約するための代表的な工夫です。

現在よりも厳しい容量制限の中でゲームを動かすには、ビット単位で情報を管理し、わずかな空き領域も活用する必要がありました。

未使用データは開発過程の記録になる

内部番号の空白や並び方を調べることで、開発途中にどのようなデータが存在していたのかを推測できる場合があります。

未使用領域は不要なデータである一方、ゲームが完成するまでに行われた変更や試行錯誤の痕跡でもあります。けつばんは、そうした開発過程が思いがけない形で画面上に現れた存在ともいえるでしょう。

想定外の入力がシステムを崩す

今回のバグは、通常では選択できない空白の技へカーソルを合わせるという、開発者が想定していなかった操作から始まります。

プログラムは、入力されたデータが正常であることを前提に動作します。その前提が崩れると、文字列、画面、ポケモン番号など、本来は別々の役割を持つデータが混ざり合ってしまいます。

まとめ

初代ポケモンのけつばんは、正式に用意された隠しポケモンではありません。未使用の内部番号を、ゲームが誤ってポケモンのデータとして読み込んだことで現れるバグです。

空白の技を読み込んだことで文字列の終端を見失い、画面データが別のメモリ領域へコピーされる。その結果、相手ポケモンの内部番号が書き換えられ、けつばんが出現します。

さらに、存在しないグラフィックの参照やメモリ領域の上書きによって、画面崩れやフリーズ、アイテム増殖といった現象が発生します。

バグは、コンピュータが気まぐれに起こす不可思議な現象ではありません。想定外のデータに対しても、プログラムが書かれた命令を忠実に実行した結果です。

けつばんの仕組みをたどることは、初代ポケモンの都市伝説を解き明かすだけでなく、メモリ管理やデータ設計といったプログラムの基本を知ることにもつながります。不完全なコードの中には、限られた環境でゲームを完成させた開発者たちの工夫と試行錯誤が残されています。

0 件のコメント:

コメントを投稿