ポケモン 第二世代 マスターボール ID 調整 (任意コード実行)

はじめに

ポケモン 第二世代 RTA ではラジオ塔の ID くじで 1 等に当選しマスターボールを入手するチャートが存在します.

RTA では途中で入手する「ひきゃく」の ID が 01001 であることを利用してゲームを始める前に乱数調整 (状況再現?) でくじの ID を 01001 になるようにしています.
本記事では乱数調整を使わずに任意コード実行を用いてマスターボールの ID を 01001 に調整する手法について書いていきます.

メリット

乱数調整ではなくて任意コード実行を用いることのメリットは以下の通りかと思います.

  • フレーム技をする必要がないので任意コード実行の環境構築ができれば誰でもできる.
  • 機種に依存しないので 3DSVC でもできる.
  • データをリセットする必要がないのでポケモンスタジアム金銀を用いた 3 倍速 RTA の準備が簡単になる.

任意コード実行の環境構築方法

まずは任意コード実行の環境構築の手順について説明します.

前提:通信交換ができること*1
準備:他のソフトで「じてんしゃを持たせたポケモン」を用意する.

「じてんしゃを持たせたポケモン」を用意する方法についてはいくらでもあるのですが例えばオーキドせんせい研究者さんが出しているこの記事が参考になります.
タイムカプセル輸送時の「持っているどうぐ」変更バグ - オーキドせんせい研究者のページ

手順:
1. パソコンに預けてあるたいせつなものを全て引き取る.
2. コガネシティでじてんしゃを入手する.
3. 通信交換で「じてんしゃを持たせたポケモン」を受け取りたいせつなもの欄にじてんしゃを 2 つ用意したいせつなもの欄の一番下に配置する.
4. ルアーボール*2を入手しボール欄を以下のようにする.

ルアーボール ×1
モンスターボール ×1
やめる
5. たいせつなもの欄の 1 つ目のじてんしゃを 2 つ目のじてんしゃとセレクトボタンで入れ替える.
6. ボール欄の 2 番目がマスターボール × 255 になっているので残り個数を金銀なら 6 個,クリスタルなら 12 個になるように捨てる.
7. マスターボール ×6 or ×12 をボール欄の 65 番目と入れ替える.

この方法は以下の動画で述べられている方法と同じなので参考になるかと思います.
【クリスタル版】誰でも簡単!任意コード実行環境構築チャート解説【ポケモン第二世代 バグ技 任意コード実行】 - YouTube

ポケギアが使えなくなってしまうのですが気にせずにそのまま ID 調整を行います.

マスターボール ID 調整の方法

以上の方法で任意コード実行環境が整ったので実際のやり方について説明します.

準備:メールを購入し以下のメール内容を用意する.

金銀版

ョへマだぼァがあぜウひすづよ?づ
ョぶづへャだてぼガ     だっ

クリスタル版

ョへマぞぼァがッぜテづよ?づョぶ
づへャぞヅ ギブゆの    だっ

ここまでできたらせっていを

  • メッセージ はやい
  • エフェクト とばす
  • せんとう かちぬき

にしてセーブをしておくと良いかと思います.

手順:
1. 用意したメールを読んで図鑑を開いて任意コード実行を行う.
2. すぐにリセットしてさいしょからはじめてようびをにちようびにする.
3. 日付が変わるまでにコガネシティに行き「ひきゃく」を連れて ID くじを引く.

そうすることで ID くじが 01001 になりマスターボールを入手することができます.

注意

任意コード実行をしたら 24 時間*3は ID が固定されるので RTA のやり直し等でリセットする場合でもそのままさいしょからはじめて大丈夫です.24 時間経過すると ID が固定されなくなるのでうまくいかないと思ったら任意コード実行を適宜行うようにしてください.

マスターボール ID 調整の仕組み

説明を簡単にするために以下で使う名前とそのアドレスを表で紹介します.

名前 金銀 クリスタル
sLuckyNumberDay バンク00: B100 バンク00: AC90
sLuckyIDNumber バンク00: B101, B102 バンク00: AC91, AC92
wCurDay D1E5 D4BE
wLuckyIDNumber D9AF, D9B0 DC65, DC66

ID くじの番号について

ID くじの人に話しかけると「こんかいの アイディナンバーは ????? です」と表示されるのですがこの?????の部分に wLuckyIDNumber の値 (を 10 進数に変換したもの) が入ります.マスターボールを入手するためにこのアドレスに 03 E9 (10 進数で 01001) が入ってくれるように調整をしなければなりません.wLuckyIDNumber の値が変わるタイミングは以下の 2 回です.
1. 「さいしょから はじめる」を選択した直後.
2. きんようびになって以降,はじめてラッキーチャンネルを視聴する瞬間 or ID くじの人に話しかけて「こんかいの アイディナンバーは ????? です」の表示が出る直前.

RTA でプレイするときは 2 回とも発生することになります.

wLuckyIDNumber の値の書き換え方法

wLuckyIDNumber の値の書き換え方法はどちらのタイミングでも共通です.

1. sLuckyNumberDay の値 と (wCurDay の値)+1 を比較する.
2. 等しければ sLuckyIDNumber の値をそのまま wLuckyIDNumber に書き込む.
3. 等しくなければランダムに値を発生させてその値を sLuckyIDNumber と wLuckyIDNumber に書き込む.

ランダムに値が発生してしまったら ID を調整することが困難になるので sLuckyNumberDay と wCurDay の値が重要になってきます.「さいしょから はじめる」を選択すると wCurDay の値は 00 になっている*4ので sLuckyNumberDay の値を 01 にするとランダムに値が発生しなくなりそうです.そして実際に sLuckyNumberDay の値が 01 であれば sLuckyIDNumber の値は既存のデータと同じになっています*5.そのため任意コード実行で sLuckyNumberDay の値を 01 にし,sLuckyIDNumber の値を 03 E9 になるようにしています.残る問題は wCurDay の値の挙動になります.

wCurDay の値について

この値は現在のようびを表すもので 7 で割った余りがそれぞれのようびに対応しています.sLuckyNumberDay の値が 01 であり ID くじの人に話しかけたタイミングで sLuckyNumberDay の値 と (wCurDay の値)+1 を一致させる必要があるので wCurDay の値を 00 にする必要があります.00 を 7 で割った余りは 0 でこれはにちようびに対応しています.そのため ID くじの人に話しかけた時点でにちようびでない場合は ID 調整に失敗します.

ポケモン第二世代には RTC (リアルタイムクロック) 機能がありそのデータが HRAM 領域に格納されています.さいしょからはじめるでこの領域は初期化されず 1 日以上データがあると現在がにちようびであっても wCurDay の値が 00 にならなくなってしまいます.RTC のデータが初期化されていればにちようびのとき wCurDay を 00 にすることができるので,RTC のデータをリセットするためのサブルーチンを任意コード実行で行っています.

まとめ

以上の考察から任意コード実行で以下のことをすれば良いことになります.
1. sLuckyNumberDay の値を 01 にし,sLuckyIDNumber の値を 03 E9 にする.
2. RTC 機能を初期化する.

謝辞

今回マスターボール ID 調整を任意コードで行うというアイデアをくださり (実際には依頼されたものではありますが) また実際にクリスタル 3 倍速 RTA で検証していただいたプニュタさんに感謝致します.

*1:金銀の場合は通信交換なしでもできますが虫取り大会に参加する必要があり RTA で選択するにちようびと相性が悪いので通信交換を使うと楽だと思います.

*2:ガンテツボールであれば何でも良いですがヤドンのいどの攻略後はじめてガンテツに話しかけるともらえるルアーボールが一番入手しやすいかと思います.

*3:本当に 24 時間かどうかは要検証ですが…

*4:「さいしょから はじめる」を選択するとメインメモリの大部分を 00 にする処理が行われるので既存のデータに依らずに 00 になっています.メインメモリの大部分を 00 にした後 wLuckyIDNumber の値の書き換えの処理が行われます.

*5:sLuckyNumberDay の値が 01 でない場合は wLuckyIDNumber の書き換えの処理によって sLuckyIDNumber が変化します.