【初代ポケモンのバグについて②】なぜ道具の7番目でセレクトを押すとレベル100になるか

前回の記事の続きです。

間に1ヶ月以上+センター試験の記事が挟まってますが、ここは書きたいことを書くところですのでお気になさらず。

前回言った通り、この件に関する解説はWebに山のようにありますので、一番噛み砕いた解説になるように心がけます

ものすっごく丁寧に解説してるのでコンピュータの知識がある人にはきっと退屈ですが、どうぞお付き合い下さい。

初代ポケモンはとにかくバグが多い。というのが前回の話でした。

また、前回提示した「なぜ、道具の7番目でセレクトを押すとレベル100になるのか?」という疑問には、一応の解答を示しました。

すなわち、「バグを使って累積経験値のデータをいじって大きくしているため」ですね。

今回はもう少し踏み込んだ解答を提示してみます。

道具の7番目でセレクトを押してレベル100になるのは、「覚えている技のデータと経験値を保存している領域とを入れ替えて、経験値の値を大きくしているため」です。

 

技と経験値のデータ上での表現

ポケモンが覚えている技のデータ

あるポケモンが覚えている技のデータは、そのポケモンのステータス・レベルなどのデータと一緒に、数字の形で保存されています。

ソフトの側で数字と技の対応情報をあらかじめ持っておき、ポケモンが技を覚えたら対応する数字を保存するわけですね。

技と数字の対応は例えば以下のとおりです。

  • 01:はたく
  • 02:からてチョップ
  • 03:おうふくビンタ
  • ……

データの単位

さて、先ほど「技のデータは、そのポケモンのステータスやレベルなどのデータと一緒に保存されている」と書きましたが、このようなデータは1バイト単位で保存されてます。

ご存知の方も多いと思いますが、1バイトというのはデータの大きさの単位。データというのは、大きければ大きいほど豊かな表現力を持ちます。ノートの1ページに書いてあるマスが多いほどたくさんの文字が書けるのと一緒ですね。

さて、その1バイトの表現力とは。整数ならば、1バイトで0~255の数字を保存することができます。

逆に言えば、255通りより種類の多いデータは保存できないということ。例えば、レベルならば1から100までなので1バイトで保存できますが、最大HPは255を超えることがあるので2バイト使う必要があります。

技と累積経験値の表現に必要なデータ量

では、今回俎上に上がっている技と累積経験値を表現するのに何バイト必要なのか?

結論からいうと、技が1バイト、累積経験値が3バイトです。

初代ポケモンの技は165種類なので、1つの技は1バイトで表現することができます。

累積経験値は、レベル100になるまでの累積経験値(の最大値、レベル100までの経験値はポケモンごとに違う)である125万までを保存できれば良いわけなので、2バイトの表現力=0~65535でも足りません。というわけで、0~1677万7215まで表現できる3バイトを使います。

3バイトを使ってどのように経験値を表現しているかというと、このような式になります。

render

技と累積経験値の先頭バイトを入れ替えると

さて、3バイトの表現力は1677万なのに、表現すれば良いのは125万まで。これが何を意味するか。

最初のバイト(先頭バイト)にはたいがい何が入っていても、MAXの125万を超えてしまうということです。

冒頭に、レベル100にするために覚えている技のデータと経験値を保存している領域とを入れ替えている、と書きました。

つまり、たいていの技なら、データを累積経験値の先頭バイトに持ってくることでレベル100にすることができるのです。

具体的には、20以上の値が入っていると125万以上になります。

初代ポケモンの技は165種類なので、9割くらいの技が該当しますね。

レベル100にならないケース

逆に言えば、1割ぐらいの技は累積経験値の先頭バイトと入れ替えても、累積経験値が125万を超えません。これが、前回言っていたレベル100にならないケースです。

該当するのは以下の19個の技。

  • はたく
  • からてチョップ
  • おうふくビンタ
  • れんぞくパンチ
  • メガトンパンチ
  • ネコにこばん
  • ほのおのパンチ
  • れいとうパンチ
  • かみなりパンチ
  • ひっかく
  • はさむ
  • ハサミギロチン
  • かまいたち
  • つるぎのまい
  • いあいぎり
  • かぜおこし
  • つばさでうつ
  • ふきとばし
  • そらをとぶ

左上から順番に、「つるぎのまい」まではどのポケモンもレベル100にはなりません。「いあいぎり」以降はレベル100になるポケモンがいます。

具体例を示してみました。

スライドショーには JavaScript が必要です。

なぜ技と累積経験値のデータが入れ替わるか

ここまでは「データが入れ替わった結果、なぜレベル100になるか」でした。

ここからは、「なぜ道具の7番目セレクトでデータが入れ替わるか」を解説します。

技の何番目でセレクトを押したか?

戦闘中、入れ替えたい技にカーソルを合わせてセレクトボタンを押すと、何番目の技でセレクトボタンを押したかが保存されます。

また、メニューから「どうぐ」を開いて、入れ替えたい道具にカーソルを合わせてセレクトボタンを押すと、何番目の道具でセレクトボタンを押したかが保存されます。

察しの良い方はお分かりでしょう。この「何番目でセレクトを押したか」の情報、実は同じデータ領域が使われています。

しかも、「どうぐ」の方はセレクトを押してから閉じても、戦闘に入っても、「何番目でセレクトを押したか」の情報が保存されたままです。

試しに、道具の2番目でセレクトを押してから戦闘に入ってみましょう。

amarec(20160215-232119)

戦闘開始の時点で、すでに技の2番目でセレクトを押された状態になっています。

さて、では「どうぐ」の5番目以降でセレクトを押してから戦闘に入るとどうなるでしょうか?

当然、ポケモンの技は4つまでしかないのですが……

 

「どうぐ」の5番目以降でセレクトを押すと

結論から言いましょう。技より後ろにあるデータが、入れ替える対象として選ばれた状態で戦闘が始まります。

技より後ろのデータは、以下の順番で並んでいます。

  • ……
  • 技1
  • 技2
  • 技3
  • 技4
  • ID(2バイト)[技5]
  • ID[技6]
  • 累積経験値(3バイト)[技7]
  • 累積経験値[技8]
  • 累積経験値[技9]
  • ……

ですから、7番目でセレクトを押してから戦闘に突入すると、累積経験値の先頭バイトが選ばれた状態で戦闘が始まるのです。

ここで適当な技を選んでセレクトを押せば、その技の番号と累積経験値の先頭バイトが入れ替わる、という寸法です。

実際にやってみた

スライドショーには JavaScript が必要です。

はい、こういうカラクリでレベル100に上がるのでした。

しかし、「データを入れ替える」という手段は実に汎用性が高く、これを使って様々な裏技を考えることが出来ます。

というわけで次回は解説は少なめで応用編です。

いつまで続くんでしょうね、この誰得企画。でも続けます

 

以下のサイトを参考にさせていただきました。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中