ハマログ

株式会社イーツー・インフォの社員ブログ

ゲームのバグ技をプログラムの観点で解説してみる – 2

またまた遅れての投稿ですつーじーです。本当は毎月16日更新です覚えてくれると嬉しいです!
さて、今回もまた紹介していきたいと思いますゲームバグ。今回の題材は、

『ポケットモンスター赤・緑』「レベル100バグ」です!

『ポケットモンスター』のレベル100になるバグ技

ポケットモンスターを知らない人はまずいないと思うので割愛しますが、その中でも赤・緑はポケモンシリーズの初代作となります。発売は1996年です。ポケモン初代作には実は様々なバグ技があるのですが(「ミュウを捕まえる」「アイテム無限増殖」「壁抜け」「オーキド博士とポケモンバトル」など)、その中でもとりわけ有名なのが「レベル100バグ」です。
 レベル100バグとは、特定の手順を踏むとポケモンが必ずレベル100になるというバグ技です。今回はそのバグ技をプログラムの観点で解説していきたいと思います。

※ここからバグ技を紹介してまいりますが、これらのバグ技は場合によってはゲームソフトを破損させる可能性があります。実際に試すことは推奨できません。

バグ技発生手順

レベル100バグの発生手順は以下の通り、

1.メニューから「どうぐ」を開き、7番目の道具のところでセレクトボタンを1回押す
2.Bボタンを2回押してメニューを抜ける
3.野生のポケモンと戦闘し、「たたかう」を選択し、4番目の技のところでセレクトボタン押下
4.ここで表示がバグるが、気にせずそのまま通常通り敵ポケモンを倒す
5.戦闘終了と同時にレベル100となる

この手順で内部で何が起きているのか、可能な限りわかりやすく解説していきます。

まず1つ目の「どうぐの7番目でセレクトボタンを押す」ですが、初代ポケモンには
「メニュー内でセレクトボタンを押すと並び替えができる」という機能があります。
任意の道具を選んでセレクトボタンを押し、そのあと別の道具を選ぶとそれらの道具の順番を入れ替えることができるというものです。ここをもう少しプログラム寄りの言い方に変えると、

「x番地のデータとy番地のデータを入れ替える」という処理になっております。

 ここからは内部構造を理解する必要が出てきますが、
どんなゲームでも最深部まで突き詰めると、すべて数値で管理されております。ポケモンのアイテム欄も数値で管理されており、以下のように「何バイト目に何のデータが」といった具合にデータ管理されております

セレクトボタンの処理を順に説明すると、

1.7番目の道具のところでセレクトボタンを1回押す(x番地=7番地)
2.3番目の道具のところでセレクトボタンを1回押す(y番地=3番地)
3.「7番地のデータと3番地のデータを入れ替える」

これが”本来の”セレクトボタンの処理です。ではレベル100のバグ技上ではどんな動きになっているのでしょうか。

1.メニューから「どうぐ」を開き、7番目の道具のところでセレクトボタンを1回押す

この時点で「x番地=7番地」となります。

2.Bボタンを2回押してメニューを抜ける
ここでのとある処理忘れがすべての元凶でした。

なんと、

ここで「x番地のデータとy番地のデータを入れ替える」の処理が
初期化されていなかったのです。

つまりアイテム画面を抜けても入れ替え処理が待機状態のままとなっていたのでした。

「でもアイテムの処理が他の画面で実行されても問題なくない?」

と思う方もいらっしゃるかもしれませんが、
データの管理方法は全データ共通で「何バイト目に何のデータが」という形式になっているため、アイテム以外でも上記の処理が実行できてしまいます。

これを放置して先に進めると何が起きるのでしょう。

3.野生のポケモンと戦闘し、「たたかう」を選択し、4番目の技のところでセレクトボタン押下

順を追って説明しましょう。
まずアイテム欄での操作で「x番地=7番地」の処理が残ったままとなっております。
次にポケモンの技画面でのセレクトボタン処理ですが、ポケモンの技データないしポケモンのデータは以下のような構造となっております。

もう察しの良い方はお気づきになられたのではないでしょうか。この状態で「4番目の技のところでセレクトボタン押下」をすると何が起きるか。

「y番地=4番地」となる

「7番地のデータと4番地のデータを入れ替える」

このように、「経験値(上桁)」に「4つ目の技」のデータが入ってしまうのです。

「技データが経験値に入るってどういうこと?」

と思われるかもしれませんが、結局のところ技もデータなので、すべての技にID(数値)が割り振られております。

16進数ID技名
1Aとびげり
1Bまわしげり
1Cすなかけ
:

この数値が「経験値(上桁)」に入ってしまうのです。

経験値には合計3バイトの領域が割り振られており、1バイトで8桁の2進数、3バイトで24桁の2進数で管理されます

経験値上桁経験値中桁経験値下桁
000000000000000000001010

こんな状態なら10進数換算で「10」の経験値が溜まっております。その上桁に無理やり数値を入れると、
(例えば「すなかけ」(1C=00011100)が入ると)

経験値上桁経験値中桁経験値下桁
000111000000000000001010

10進数で表すと「183万5018」の経験値が溜まっていることになります。

こんだけ経験値があればいやでもレベル100になるよ!

というのがレベル100バグの正体でした。

補足:経験値上桁に入れ替える技のID番号が小さかった場合(ID1:はたく など)はレベル100になりきらないこともあります

上記はレベル100バグの解説でしたが、他のほとんどのバグもセレクトバグを使用したものとなっております。「データの入れ替え」が理論上無制限に実行可能となっているため、突き詰めればほぼどんな現象でも起こせてしまいます。恐ろしいものです。

上記レベル100バグを応用して、
「1.メニューから「どうぐ」を開き、8番目(=経験値中桁)の道具のところでセレクトボタンを1回押す」
のようにやり方を変えると、逆に「レベルを下げる」というバグ技も使えます。

本項で紹介した「初期化のし忘れ」については、ポケモンを開発した株式会社ゲームフリークの公式YouTubeチャンネルの動画でも少し触れられています。

こちらの動画では「ミュウの誕生秘話」について語られておりますが、その一部の「ミュウを捕まえるバグ技」について語る際に「初期化のし忘れ」について触れられております。公式からこのような動画が出るのはすごい時代になったものです。

以上、初代ポケモンのとんでもないバグの紹介でした。「初期化のし忘れ」は我々IT開発者にとっては耳が痛いお話です。皆さん必ず初期化処理は忘れずに!

今回はこれにて!

ゲームバグ技プログラム

  つーじー   2021年6月17日


関連記事

初めてのcore dump

初めてcore dumpをつかったデバッグをしたので、 記念に書きます! cor…

Laravel5.2のMulti-Auth

Laravel5.2がでました。大目玉の機能として、ついに認証にMulti-Au…

株式会社イーツー・インフォに入社しました!

はじめまして。wakaです。 2019年4月から中途(27歳)で実務未経験からエ…


← 前の投稿

次の投稿 →