毒サファリ+いあいぎりによるPC道具欄拡張の仕組みについて
はじめに
ピカチュウバージョンの任意コード実行環境・バイナリエディタを構築する方法の1つに、毒サファリによる壁抜けといあいぎりを使用する方法があります[1][2]。この方法の途中に、バグ世界に侵入していあいぎりを使い、PC道具欄を拡張する手順があります。以下にその手順を示します。
準備
- PCに道具を50種類 (満タンまで) あずける.
(2~6は省略)
手順
(1~5と8は省略)
[2]
この記事では、PCの道具欄拡張の仕組みと、それを行うために必要となる歩数の算出について説明します。
PCの道具欄拡張の仕組み
「はじめに」で示した手順は、Cut abuseと呼ばれる、特定のバグマップで細い木*1や草を切ることによってRAMの値を操作するバグを利用しています[3]。
このバグの説明の前に、ブロックについて説明します。
- ブロック
-
初代ポケモンでは、マップはブロックで構成されています。1ブロックは2x2マスの4マスで構成され、各ブロックには1バイトのIDが割り当てられています。各IDに対応するブロックについては、以下を参照してください*2。
File:TileBlockDex.png - Glitch City Wiki
バグマップについて
メモリ上には、マップデータが格納されている領域があります。この領域は通常プレイで見える分だけ確保されており、通常プレイにおいてはこの領域のみが参照されます。しかし、壁抜け状態などでマップの範囲外へアクセスした場合、領域外のアドレスを参照します。領域外のアドレスは他の用途に使用されているため、マップとしてみた場合はでたらめな値が入っています。
バグマップの正体は、この領域外のアドレスを無理やりマップとして表示したものです。
いあいぎりを使ったときの挙動について
フィールド上でいあいぎりを使って細い木や草を切ったとき、メモリ上の対応するアドレスの値が書き換わります。ブロックには細い木や草が存在するものがあり、いあいぎりを使うと細い木や草がないブロックに書き換わります。具体的にどのように変化するかについては、表1を参照してください。
いあいぎり使用前のブロックID | いあいぎり使用後のブロックID | 切るものとブロック内の位置 |
---|---|---|
0Bh(11) | 0Ah(10) | 草むら(全体) |
32h(50) | 6Dh(109) | 細い木(右上) |
33h(51) | 6Ch(108) | 細い木(右下) |
34h(52) | 6Fh(111) | 細い木(左上) |
35h(53) | 4Ch(76) | 細い木(右上) |
60h(96) | 6Eh(110) | 細い木(左下) |
通常のマップでは、マップデータが格納されている領域を書き換えるので特に問題はありませんが、バグマップでこれを行うと、マップデータではない領域を書き換えることになります。
「はじめに」で歩いていった場所は、PCに預けている道具の個数(アドレスD4B9h)に対応しています。PCに道具を50個預けることで、このアドレスに対応するブロックに木が含まれるようになり、この木を切ることで値が50から109に書き換わり、PCに預けている道具の個数が109個になります。
歩数の算出
20ばんすいどうのバグマップで、目的のアドレスに対応するブロックにたどり着くための歩数を求める方法について説明します。
まず、当該ブロックがある座標を求めます。求め方は以下のとおりです。なお、以下の手順で求まる座標はブロックの左上の座標となるので、ブロックの左上以外の座標に行きたい場合は適宜求めた座標を調整してください。
アドレスAの座標(y, x)を求めるためには、次の手順を実行する。
- AからC793hを引く(これをBとする)
- Bを38hで割り、端数を切り捨てる(これをCとする)
- Cに38hを掛ける(これをDとする)
- BからDを引く(これをEとする)
- 目的地の座標は(C * 2, E * 2)で求められる
[3]を翻訳、ただし手順1のアドレスは日本語版向けに修正した
もしくは、以下のスプレッドシートから対応する座標を求めます。
20ばんすいどうの座標に対応するアドレス表 - Google スプレッドシート
次にセキチクのポケモンセンター入り口から、求めた座標へ行くための歩数を求めます。上記で求めた座標(y, x)を、以下の文に代入します。
- 下に8歩、左に99 - x + 10歩、上に220 - y歩
※y >= 222の場合は、「上」を「下」に読み替える
必要に応じて以下の調整をします。これは、細い木や草を切るためには、その1歩手前に立つ必要があるためです。
- y = 220の場合は、左に歩く歩数を1減らす
- y ≠ 220の場合は、上(下)に歩く歩数を1減らす
歩数を求めたら、セキチクシティのポケモンセンターの入口から求めたとおりに歩きます。
例: PCの道具欄を拡張するためのアクセス方法
まずは座標を求めます。
- [3]の方法を用いて求める場合
- D4B9h - C793h = D26h (B)
- D26h / 38h = 3Ch (C)
- 3Ch * 38h = D20h (D)
- D26h - D20h = 6h (E)
- 目的地の座標は(3Ch * 2, 6h * 2)、すなわち(120, 12)
- 細い木はブロックの右上にあるのでx座標に1を足して、求める座標は(120, 13)となる
- スプレッドシートを用いて求める場合
- スプレッドシートを開き、アドレス「D4B9」を検索する
- D4B9が書かれているセルはI63なので、これに対応する座標は(120~121、12~13)となる
- 細い木はブロックの右上にあるので、求める座標は(120, 13)となる
座標を求めたので、次は歩数を求めます。
下に8歩、左に99 - 13 + 10 = 96歩、上に220 - 120 = 100歩
調整を行ったあとの歩数は下に8歩、左に96歩、上に99歩
歩数を求める式について
上記の歩数の式を導出する過程について説明します。
20ばんすいどうのバグマップは、本来の19ばんすいどうと20ばんすいどうが繋がっている範囲より上から進入することで到達できます。
セキチクシティのポケモンセンター入口から下に8歩歩くと、19ばんすいどうの(y = 0, x = 9)に到達し、そこから左に10歩歩くと20ばんすいどうの(y = 220, x = 99)に到達します(図1参照)。ここから目的の座標(y, x)には左に99 - x歩、上に220 - y歩歩くと到達できます。目的の座標に存在する細い木や草を切るためにはその1歩手前に主人公が立つ必要があるので、その分の調整をします。これらを合わせると、前述の歩数の式が導出されます。
ところで、19ばんすいどうから左に歩いて20ばんすいどうへ到達したとき、y座標が220と不自然に大きくなることを疑問に思うかもしれません。これは本来繋がっている場所よりも上から侵入した結果、y座標がオーバーフローするためです(図1参照)。
19ばんすいどうから20ばんすいどうへの道は、下のほう(y = 36~53)でつながっています。19ばんすいどうのy = 0~35から20ばんすいどうへアクセスした場合は、20ばんすいどうのy座標がオーバーフローして20ばんすいどうのy = 220~255に到達します。
参考文献
[1] オーキドせんせい研究者、【初代ポケモン】ピカチュウ版任意コード実行チャート解説【完全版 バグ技 毒サファリ+いあいぎり】 | YouTube、https://www.youtube.com/watch?v=6-_mu95YK9M、2023年5月4日閲覧。
[2] flag3、バイナリエディタ導入 毒サファリ・いあいぎりルート ピカチュウ版 | flag3833753、https://flag3833753.hatenablog.com/entry/2023/02/09/200159、2023年5月4日閲覧。
[3] Glitch City RAM manipulation (Cut abuse) - Glitch City Wiki、https://glitchcity.wiki/Glitch_City_RAM_manipulation_(Cut_abuse)、2023年5月4日閲覧。