見出し画像

初代ポケモンのセレクトバグ

画像1

初代ポケモンのセレクトバグをご存知だろうか。一番有名なものだと、メニューボタンでどうぐ の7番目でゲームボーイのセレクトボタンを押し、キャンセルした後に戦闘に入り、いらない技でもう一度セレクトを押した時レベル100になるというバグだ。
今回はこの仕組みについて解説しようと思う。
まず、ポケモンのデータは図のようにそれぞれの技に1 byte (8 bit), その後に親のIDに2 bytes, そして経験値が3 bytes(その後に攻撃力などが続く)がメモリに格納されている。そして、セレクトボタンを押すとm番目とn番目のデータを入れ替える。しかし、バグにより最初のm番目を入れ替えるフラグが消えずに残ってしまっている。つまり、この場合戦闘中に技でセレクトを押した時、その技と経験値の上の1 byteが入れ替わってしまう。それによって経験値が書き換えられ、戦闘後にその経験値に基づいたレベルに上がる。
例をあげると、現在の経験値が135の場合、経験値の3 bytesに入ってるのは16進法で0x000087、そして技4にたいあたり(技ID 33)が入ってるとすると技4のメモリには0x21が入っている。これらを入れ替えることにより、経験値が0x210087、つまり200万を超える。レベル100に必要な最大経験値が125万なので、それを超えることにより、レベル100へと到る。(どうでもいいが初代のポケモンのレベルNに必要な経験値は0.8N^3, N^3, 1.2N^3-15N^2+100N-140, 1.25N^3と4パターンある)。つまりレベル100にならない現象は技のIDが小さいからだ。
近年、アセンブリやC/C++に触れない限りメモリに対して考える機会が少なくなったがコンピュータープログラムはメモリに対して演算した結果を出力していることを理解すればプログラミングに対する理解はより深まるだろう。

この記事が気に入ったらサポートをしてみませんか?