ピクセル化された幻影:グリッチを超えて
シオンタウン沖に潜んでいました。ギザギザの逆さまの「L」字のピクセル、時には幽霊、時には化石として。90年代後半のポケモン世代にとって、MissingNo.は単なるグリッチではありませんでした。それは現象であり、ささやかれる秘密であり、想像を絶する力への意図しない入り口でした。20年以上経った今もその遺産は続いていますが、このデジタルな幻影の真の驚異を理解している人はほとんどいません。それは伝統的な意味でのバグではなく、深く技術的なバッファオーバーフローであり、ポケモン赤・緑のゲームエンジンの骨格そのものを露呈させ、意図せずしてゲーム文化の時代全体を定義したメモリ管理の奇妙な点だったのです。
入手不可能なものの神話
噂で盛り上がる校庭を想像してみてください: 「グレンタウンに飛んで、海岸線を波乗りすると、突然…いた!」 MissingNo.は都市伝説の生き物であり、富を約束する禁断の果実でした。出会うとセーブデータが破損する可能性があると囁かれましたが、同時に抗いがたい報酬、つまりアイテムの複製も提供しました。突然、ふしぎなアメ、マスターボール、そして無数のきんのたまが無限に複製可能になりました。これは単なるトリックではありませんでした。それはポケモン世界の経済的再編であり、プレイヤーがゲームの進行と希少性システムとどのように相互作用するかを根本的に変えました。しかし、たった一つの未定義の存在が、デジタルなエーテルからどのようにしてこれほどの混乱を解き放つことができたのでしょうか?
事故の構造:ゲームボーイのメモリとデータ構造
MissingNo.を本当に理解するためには、初代ゲームボーイの素朴でありながらも巧妙なアーキテクチャ、そしてゲームフリークのエンジニアが初期のポケモンタイトルをどのように構築したかについて深く掘り下げる必要があります。ゲームボーイはわずか8KBの作業用RAM(WRAM)で動作し、様々なバンクとアドレスに分割されていました。このメモリは貴重であり、各バイトは目的に応じて割り当てられ、ポケモンのステータスからプレイヤーのキャラクター名、そしてどのポケモンがどこに出現するかを決定する野生の出会いテーブルまで、あらゆるものを保存していました。
重要なことに、野生のポケモンとの遭遇はリアルタイムでランダムに生成されるわけではありません。代わりに、ゲームは特定のデータをメモリに保存します — 遭遇テーブル — それが異なるエリアに対応しています。これらのテーブルには、ポケモンの種族IDとそれぞれの出現確率のリストが含まれています。新しいエリアに入ったり、遭遇を開始したりすると、ゲームはこれらのテーブルを事前定義されたメモリアドレス(例:wEncounterData1、wEncounterData2)で参照します。
プレイヤーキャラクターの名前も、メモリの特定のチャンクを占めていました。通常、一時的なバッファ、おそらくwTempPlayerNameとして指定された、小さな固定サイズのバイト配列に保存されており、永続的な保存場所に書き込まれるのを待っていました。問題は、これから説明するように、特定の一連の行動によってこの一時バッファが隣接する無関係なメモリアドレスに漏れ出すときに発生しました。
おじいさんとオーバーフロー:データが自らを破損した経緯
MissingNo.の誕生は、悪名高い「おじいさんバグ」(グレンタウンバグとしても知られる)にあります。手順は簡単でした。
- トキワシティへそらをとぶ。
- ポケモンを捕まえる方法を教えてくれるおじいさんに話しかける。この行動により、チュートリアル中、プレイヤーキャラクターの名前バッファ(
wTempPlayerName)が一時的に「OLD MAN」に変わり、決定的に、野生のポケモンとの遭遇に関連するメモリポインタが操作されます。 - すぐにグレンタウンへそらをとぶ。
- 東海岸を上下に波乗りする。
何が起こるかの技術的な内訳は次のとおりです。
1. 名前バッファとメモリのリセット
プレイヤーがおじいさんのチュートリアルを開始すると、ゲームは一時的に特定のメモリセクションを書き換えます。具体的には、通常は現在の場所の野生ポケモン遭遇データを管理するゲームの内部ポインタが、意図せずに影響を受けます。チュートリアル後、飛び去るとき、これらのポインタは野生遭遇の正しい値に完全にリセットまたは再初期化されません。代わりに、プレイヤーの名前(または「OLD MAN」という文字列)が最後に保存されたメモリアドレスのすぐ次のメモリアドレスを効果的に「指して」しまいます。
2. バッファオーバーフロー:位置ずれしたポインタ
この致命的な欠陥は、典型的なバッファオーバーフローのシナリオです。グレンタウンの東海岸を波乗りすると、ゲームは指定されたエンカウントテーブルから野生のポケモンをロードしようとします。しかし、おじいさんとの以前のやり取りにより、wEncounterData1(または野生のポケモンのIDを担当する同様のアドレス)のポインタがずれています。ゲームの事前定義されたポケモンのリストを指す代わりに、プレイヤーの名前(または以前の「OLD MAN」という文字列)がまだ存在するメモリ領域を直接指しているのです。
ゲームエンジンは、その忠実でありながら素朴な実行において、プレイヤーの名前(または「OLD MAN」)の文字を表す生の16進数値を、有効なポケモンの種族IDとして解釈しようとします。これらのASCII/Shift-JIS文字コードは、ゲームの内部図鑑(通常は151匹のポケモンと重複のために0x01から0xC8の範囲)に存在する正当なポケモンに対応しないため、ゲームは未定義のデータに遭遇します。
3. 発現:グラフィック、ステータス、そしてグリッチ
破損した名前バッファには、0x00(NUL文字)、0xFF(文字列終端マーカーに使用されますが、ここでは無効なID)、および0x64-0x70や0x90-0xA0のような範囲(プレイヤー名の特定の文字エンコーディングによって異なります)の16進数値が頻繁に現れます。ゲームがこれらをポケモンのIDとして解釈しようとすると、いくつかのことが起こります。
- グラフィックの破損:ゲームは存在しないIDのスプライトをロードしようとします。有効なスプライトデータがないため、多くの場合、未使用のグラフィックタイルや他のメモリセクションからの破損したデータをレンダリングし、MissingNo.の象徴的な「L」字型のブロック、幽霊の姿、または化石の姿につながります。これらは本質的に、ポケモンのスプライトとしてレンダリングされるゴミデータの塊です。
- ステータス生成:同様に、ゲームはこれらの「ポケモン」の基本ステータスと技を引っ張ろうとします。適切なデータがないため、しばしばゼロ値にデフォルトで設定されたり、ランダムな、初期化されていないメモリ値が引っ張られたりして、MissingNo.の有名な奇妙なステータス(多くの場合、攻撃力は高いが、他はすべて低い)や、頻繁に覚えられない、グリッチのある技が発生します。
- アイテムの複製:ここが文化的影響の頂点でした。MissingNo.に遭遇し、アイテムバッグを確認すると、インベントリの6番目のアイテムの数量が不可解にも128増加します。これはランダムではありません。メモリオーバーフローの別の直接的な結果です。MissingNo.に遭遇する行為、またはそれに続くバッグへのメモリアクセスが、6番目のスロット(または16進数で
0x00、10進数で128)のアイテム数に関連する特定のバイト(またはバイトのセット)を上書きします。これは、ゲームのアイテムデータ構造に対する正確ではあるものの、意図しない操作です。
レガシー:コードの遺物によって定義された世代
MissingNo.は熱心なプレイヤーによってすぐに「発見」され、校庭や初期のインターネットフォーラムで急速に広まりました。任天堂とゲームフリークは、メモリ操作の性質を考慮すると正当な懸念であるセーブデータ破損の可能性を挙げて、その使用に公式に警告しました。しかし、多くの人にとって、リスクは報酬に値しました。それは通過儀礼となり、ゲームの意図された境界に逆らうことを敢行した者たちの名誉の証となったのです。
このピクセル化されたエラーは単なる好奇の対象ではありませんでした。それは初期ポケモンのメタゲームの礎石でした。アイテムの複製は、プレイヤーがレベル上げを回避し、チームを瞬時に最大化し、従来の資源制約なしに異なるビルドを試すことを可能にしました。それは、根底にある技術的脆弱性を理解することで、ゲームを自分の意のままに操る力を与える、ユニークな種類のプレイヤーの主体性を育みました。
MissingNo.は、低レベルエンジニアリングと高レベル文化の影響の間の魅力的な相互作用の証です。単純なバッファオーバーフロー、基本的なメモリ管理の見落としが、単なるグラフィック上の奇妙な点を作り出したのではありません。それは、世代を定義する神話、実用的なエクスプロイト、そしてコードの冷たく硬い論理の中に潜む隠された深みと意図せぬ驚異の永続的な象徴を生み出しました。それは、ゲームの最も魔法的な部分が意図的に設計されたものではなく、むしろそのデジタル基盤の未加工で予測不可能なキャンバスから生まれることもあることを私たちに思い出させます。