ポケットモンスター 金・銀・クリスタルのRTAではラジオ塔のIDくじで1等に当選しマスターボールを入手するチャートが存在します。
上記の動画では「さいしょから はじめる」を押してタイマーを始める前に状況再現を行うことで、IDくじを01001になるように調整し、道中で入手するオニスズメ(ひきゃく)のおやのIDと一致させてマスターボールを入手しています。
本記事では状況再現を使わずに任意コード実行を用いてIDくじを01001にする方法について紹介します。
IDくじ調整手順
環境
ポケットモンスター 金・銀・クリスタルの日本語版のみに対応しています。日本語版以外のバージョンには対応していません。また、通信交換ができることを前提としています。
手順1: 他のソフトの準備
IDくじの調整を行いたいソフトとは別のソフトを用意します。この別のソフトは金・銀・クリスタルはもちろんのこと、赤・緑・青・ピカチュウでも構いません。ただし後述する理由により金・銀・クリスタルを用意することをおすすめします。この別のソフトで「じてんしゃを持たせたポケモン」を用意し、通信交換でIDくじの調整を行いたいソフトに移動させます。
さらに、IDくじの調整を行いたいソフトが金・銀である場合は、別ソフトでおやの名前が「じがまァ」のポケモンを用意し、通信交換でIDくじの調整を行いたいソフトに移動させます。このおやの名前が「じがまァ」のポケモンは、「じてんしゃを持たせたポケモン」と同一の個体で構いません。
「じてんしゃを持たせたポケモン」を用意する方法
「じてんしゃを持たせたポケモン」を用意するには、バイナリエディタを導入すると楽になります。ポケモンスタジアム金銀を使わない場合は、タイムカプセルを使えるようにする必要があったり、赤・緑・青・ピカチュウに送るポケモンに制限があることから、赤・緑・青・ピカチュウよりも金・銀・クリスタルでバイナリエディタを導入するのをおすすめします。
- 📄ポケットモンスター 赤・緑・青 バイナリエディタ
- 📄ポケットモンスター ピカチュウ バイナリエディタ
- 📄ポケットモンスター 金・銀 バイナリエディタ
- 📄ポケットモンスター クリスタル バイナリエディタ
赤・緑・青・ピカチュウでは、捕捉率と呼ばれるパラメータが金・銀・クリスタルにおける持ちものに対応しており、アドレスD132を07
にすることで手持ちのポケモンの1匹目を金・銀・クリスタルに送ったときの持ちものがじてんしゃになります。金・銀ではアドレスD9F1、クリスタルではアドレスDCA6を07
にすることで手持ちのポケモンの1匹目の持ちものをじてんしゃにすることができます。
バイナリエディタを導入すれば、おやの名前が「じがまァ」のポケモンの準備も簡単になります。赤・緑・青・ピカチュウではアドレスD233以降、金・銀ではアドレスDB10以降、クリスタルではアドレスDDC5以降の中身を2C 26 CF E9 50
にすることで手持ちのポケモンの1匹目のおやの名前が「じがまァ」となります。
手順2: 任意コード実行環境を整える
- IDくじの調整を行いたいソフトが金・銀である場合は、手持ちのポケモンの3匹目をおやの名前が4文字以下のポケモン、手持ちの4匹目をおやの名前が「じがまァ」のポケモンにします。
- 主人公の名前が5文字のソフトを使っている場合は、ゲーム内交換または通信交換でおやの名前が4文字以下のポケモンを入手するようにしてください。
- パソコンにあるたいせつなものを全て引き出します。
- ガンテツからルアーボールをもらいます。
- ガンテツボールであれば何でも良いですが、ヤドンのいどの攻略後にはじめてガンテツに話しかけることでもらえるルアーボールが一番入手しやすいでしょう。
- コガネシティで(1個目の)じてんしゃを入手して、べんりボタン(セレクトボタン)にとうろくします。
- ボールポケットを開いて1番目をルアーボール×1、2番目をモンスターボールにします。モンスターボールの個数は1、2、4、5のいずれかにしておきます。
- 「じてんしゃを持たせたポケモン」から(2個目の)じてんしゃをあずかります。
- たいせつなものポケットを開いてじてんしゃを一番下に2つ並べて配置し、1つ目のじてんしゃでセレクトボタンを押してから2つ目のじてんしゃでセレクトボタンを押して入れ替え操作を行います。
- ボールポケットの2番目のボールが255個になるので、残り個数を金・銀なら17個、クリスタルなら12個になるようにすてます。
- ボールポケットの2番目と65番目を入れ替えます。
- ボールポケットの64~67番目については以下のようになっている(要検証)のでこれを目印にしてボールポケットの2番目と65番目を入れ替えると良いです。🔍ボールポケットの64番目:?×??
ボールポケットの65番目:?×0
ボールポケットの66番目:?×129
ボールポケットの67番目:じてんしゃ
- ボールポケットの64~67番目については以下のようになっている(要検証)のでこれを目印にしてボールポケットの2番目と65番目を入れ替えると良いです。
- メニューからポケギアが消えていれば任意コード実行の環境構築が終了となります。
手順3: IDくじ調整
下記の内容のメールをポケモンにもたせます。
金・銀
ョぶづへャだてぼガ
クリスタル
づへャぞヅ ギブゆの だっ
メールの作成後はメールの中身を読みます。その後、ポケモンずかんを開くことで任意コード実行を行うことができます。ただし金・銀で任意コード実行をする場合は、ポケモンスタジアム金銀のGBビルは使わないようにしてください。
手順4: 実際のプレイ
- 手順3の任意コード実行を行った後にリセットをします。リセットをする前にセーブはしなくてもよいです。
- 「さいしょから はじめる」を選択し、ようびをにちようびにします。
- ようびが変わるまでにコガネシティに行き、オニスズメ(ひきゃく)を入手してからIDくじを引きます。
上記の手順でIDくじが01001となり、マスターボールを入手することができます。
注意
任意コード実行をしたら、しばらくはIDくじの番号が固定されます。具体的には、ひる10じからはじめる場合は任意コード実行後10時間以内に、ひる5じ50ふんからはじめる場合は任意コード実行後17時間50以内に「さいしょから はじめる」を選択して時間を設定する必要があります。しばらくはIDくじの番号が固定されるため、RTAのやり直し等でリセットする場合でもそのまま「さいしょから はじめる」を選択してやり直しをして大丈夫です。一定時間経過するとIDが固定されなくなるので、うまくいかないと思ったら任意コード実行を適宜行うようにしてください。
おまけ1: 既存のセーブデータでIDくじ調整ができているかの確認
IDくじ調整ができているかを確認するには、実際にはじめからにしてIDくじを引くことでできます。しかし、既存のセーブデータでIDくじ調整ができているかを確認するには、別のメールを使って任意コード実行をする必要があります。
下記の内容のメールをポケモンにもたせます。
金・銀
ゥャるの
クリスタル
がわぜーひすづの だっ
メールの作成後はメールの中身を読みます。その後、ポケモンずかんを開くことで任意コード実行を行うことができます。ただし金・銀の場合は、ポケモンスタジアム金銀のGBビルは使わないようにしてください。また金・銀の場合は、手持ちのポケモンの3匹目をおやの名前が4文字以下のポケモン、手持ちの4匹目をおやの名前が「じがまァ」のポケモンであることを確認してから任意コード実行をするようにしてください。
任意コード実行を行った後にIDくじを引いてIDが01001となっていればIDくじ調整ができている証拠となります。なお、既にIDくじを引いていた場合でも再度引くことができます。
コード実行後にセーブを行うとIDくじ調整の任意コード実行を行ってからの時間がゲーム内の時間となります。そのため、注意で述べた時間制限を確認することができるようになります。
おまけ2: 殿堂入り
ポケモンスタジアム金銀のGBビルを使った3倍速RTAでは、3倍速をするために殿堂入りしたソフトでプレイする必要があります。以下は任意コード実行で殿堂入りをするための方法となります。まずは上記の手順2までを事前に行ってください。
下記の内容のメールをポケモンにもたせます。
金・銀
クリスタル
だっ
メールの作成後はメールの中身を読みます。その後、ポケモンずかんを開いてからメニューを閉じることで殿堂入りとなります。ただし金・銀の場合は、ポケモンスタジアム金銀のGBビルは使わないようにしてください。また金・銀の場合は、手持ちのポケモンの3匹目をおやの名前が4文字以下のポケモン、手持ちの4匹目をおやの名前が「じがまァ」のポケモンであることを確認してから任意コード実行をするようにしてください。
おまけ3: つづきからのセーブデータ
手順3の任意コード実行を行った後にリセットをするとつづきからのセーブデータがある状態になります。しかしつづきからのセーブデータがあること(より厳密には「つづきから はじめる」を選択できること)は、任意コード実行でIDくじ調整を行っているための必要条件にはなりません。実際に任意コード実行を用いてIDくじ調整を行いつつ、つづきからのセーブデータをない状態にすることができるからです。IDくじ調整の任意コード実行を行った後、下の三角形をクリックすると閲覧できるメールを使って任意コード実行を行い、セーブをしないでリセットすることで、IDくじ調整を行いつつ、つづきからのセーブデータがない状態になります。
明確な理由なしにここで述べる任意コード実行を行うことは推奨しません。
金・銀
へャだの
クリスタル
へャぞの だっ
技術的補足
説明を簡単にするために以下で使う名前とそのアドレスを表で紹介します。
名前 | 金・銀 | クリスタル |
---|---|---|
sLuckyNumberDay | 00: B100 | 00: AC90 |
sLuckyIDNumber | 00: B101, B102 | 00: AC91, AC92 |
wStartDay | D1D5 | 01: D4AE |
wCurDay | D1E5 | 01: D4BE |
wLuckyIDNumber | D9AF, D9B0 | 01: DC65, DC66 |
IDくじの番号
IDくじの係員に話しかけると「こんかいの アイディナンバーは ????? です」と表示されますが、この?????の部分にwLuckyIDNumber
の中身(を10進数に変換したもの)が入ります。マスターボールを入手するためには、このアドレスに03 E9
(10進数で01001)が入るように調整をしなければなりません。wLuckyIDNumber
の中身が変わるタイミングは以下の2つです。
- 「さいしょから はじめる」を選択した直後。
- きんようびになって以降、はじめてラッキーチャンネルを視聴する瞬間またはIDくじの係員に話しかけて「こんかいの アイディナンバーは ????? です」の表示が出る直前。
手順4: 実際のプレイでは、この2つとも発生することになります。
wLuckyIDNumber
の中身の変わり方
wLuckyIDNumber
の中身の変わり方は、どちらのタイミングでも共通です。
sLuckyNumberDay
の中身と(wCurDay
の中身+01h)を比較する。2. 等しければsLuckyIDNumber
の中身をそのままwLuckyIDNumber
に書き込む。
3. 等しくなければランダムに値を発生させて、そのランダムな値をsLuckyIDNumber
とwLuckyIDNumber
に書き込む。
ランダムに値が発生してしまうと、IDを調整することが困難になるため、ランダムな値にならず狙った値にするためにはsLuckyNumberDay
とwCurDay
の中身が重要になってきます。「さいしょから はじめる」を選択すると、メインメモリの大部分を00
にする処理が行われるため、wCurDay
の中身は00
になっています。そしてsLuckyNumberDay
の中身が01
であれば、sLuckyNumberDay
の中身と(wCurDay
の中身+01h)が等しくなり、さらにsLuckyIDNumber
の中身は「さいしょから はじめる」を選択することによって発生する処理の影響を受けずに既存のセーブデータと同じ中身となっています。そのため、任意コード実行でsLuckyNumberDay
の中身を01
にし、sLuckyIDNumber
の中身を03 E9
にすることで、「さいしょから はじめる」を選択したタイミングでwLuckyIDNumber
の中身を03 E9
にすることができます。残る問題は、IDくじの番号が表示されるときのwCurDay
の中身となります。
wCurDay
の中身について
wCurDay
の中身は現在の日付を表すもので、7で割った余りがそれぞれのようびに対応しています。sLuckyNumberDay
の中身が01
であり、IDくじの係員に話しかけたタイミングでsLuckyNumberDay
の中身と(wCurDay
の中身+01h)を一致させる必要があるので、wCurDay
の中身を00
にする必要があります。00
を7で割った余りは0で、これはにちようびに対応しています。そのため、にちようびでないようびにおいてはwCurDay
は00
にはなり得ないため、IDくじ調整ができなくなります。
現在の時間
ポケットモンスター 金・銀・クリスタルには、ゲーム内時間を管理するリアルタイムクロック(RTC)機能が搭載されています。この機能により、時計に関する情報がゲーム機のHRAM領域に格納され、ゲーム内での時間が現実世界の時間と連動するようになっています。
「現在の時間」はwStartDay
以下4バイトで構成される「開始時間」に「RTCの時間」を進めることで得られ、そのうち日付に関するデータがwCurDay
に格納されています。
開始時間
「開始時間」は「さいしょから はじめる」を選択して、じかんとようびを決める際に設定されるもので、「プレイヤーが設定した時間」から「RTCの時間」を戻した時間となります。特に「開始時間」≠「プレイヤーが設定した時間」となります。
「開始時間」のうち日付に関するデータはwStartDay
に格納され、計算する際に7で割るという処理が発生するため、格納されている値は00~06のいずれかとなります。
「開始時間」に「RTCの時間」を進めることでwCurDay
の値が求められるので、wCurDay
に00
が格納されるためにはwStartDay
に00
が格納されることが必要です。wStartDay
の決定には「RTCの時間」が関係するため任意コード実行ではRTCの初期化を行い現実の時間に依存しないようにしています。
RTCの初期化で起きること
RTCの初期化を行うことで「開始時間」を設定する際に戻す「RTCの時間」が短くなります。そのため、「さいしょから はじめる」を選択し、ようびをにちようびにすることで「開始時間」の日付に関するデータwStartDay
に00
が格納されます。その結果、ようびが変わるまではwCurDay
に00
が格納されることになり、ようびが変わるまでにIDくじを引くことで、IDくじの番号が表示されるときのwCurDay
の中身を00
にすることができます。
RTCの初期化から一定時間経過した場合
RTCの初期化から一定時間経過すると「開始時間」を設定する際に戻す「RTCの時間」が長くなります。その結果、例えばRTCの初期化から10~34時間後にひる10じからはじめてにちようびに設定を行うと、「開始時間」の計算によってwStartDay
に06
が格納されます。「現在の時間」は「開始時間」に「RTCの時間」を進めることによって得られるためwCurDay
の中身が07
となってIDくじ調整がうまくいかなくなります。
IDくじ調整のまとめ
以上のことから、任意コード実行では以下のことを行っています。
sLuckyNumberDay
の値を01
にし、sLuckyIDNumber
の値を03 E9
にする。- RTCの初期化を行う。
これにより、IDくじの番号を01001に設定し、さらにRTCを初期化することでwCurDay
の値を制御し、IDくじ調整を可能にしています。
IDくじ調整のプログラム
説明
コードで行っていることは上記のIDくじ調整のまとめの通りです。メールを読んでからポケモンずかんを開くことで金・銀ではアドレスFB20、クリスタルではアドレスD021を実行します。金・銀に関してはアドレスFB20を実行する際、lレジスタには20が格納されているので、アドレスFB24の実行ではアドレスCF21にジャンプします。
金・銀
WRA0:CF21 AF xor a
WRA0:CF22 CD 9D 30 call 309D
WRA0:CF25 3E E9 ld a,E9
WRA0:CF27 26 B1 ld h,B1
WRA0:CF29 2E 82 ld l,82
WRA0:CF2B CB BD res 7,l
WRA0:CF2D 32 ldd (hl),a
WRA0:CF2E D6 E6 sub a,E6
WRA0:CF30 32 ldd (hl),a
WRA0:CF31 4E ld c,(hl)
WRA0:CF32 AF xor a
WRA0:CF33 3C inc a
WRA0:CF34 32 ldd (hl),a
WRA0:CF35 CD AD 30 call 30AD
WRA0:CF38 C3 3E 05 jp 053E
ECH1:FB20 50 ld d,b
ECH1:FB21 50 ld d,b
ECH1:FB22 2C inc l
ECH1:FB23 26 CF ld h,CF
ECH1:FB24 E9 jp hl
クリスタル
WRA1:D002 AF xor a
WRA1:D003 CD 9D 2F call 2F9D
WRA1:D006 3E E9 ld a,E9
WRA1:D008 26 AC ld h,AC
WRA1:D00A 2E 92 ld l,92
WRA1:D00C 32 ldd (hl),a
WRA1:D00D D6 E6 sub a,E6
WRA1:D00F 32 ldd (hl),a
WRA1:D010 AF xor a
WRA1:D011 3C inc a
WRA1:D012 4E ld c,(hl)
WRA1:D013 32 ldd (hl),a
WRA1:D014 CD AD 2F call 2FAD
WRA1:D017 11 7F 06 ld de,067F
WRA1:D01A 1B dec de
WRA1:D01B D5 push de
WRA1:D01C C9 ret
WRA1:D01D 7F ld a,a
WRA1:D01E 7F ld a,a
WRA1:D01F 7F ld a,a
WRA1:D020 7F ld a,a
WRA1:D021 30 DF jr nc,D002
バイナリ
金・銀
CF21:
AF CD 9D 30 3E E9 26 B1 2E 82 CB BD 32 D6 E6 32 4E
AF 3C 32 CD AD 30 C3 3E 05
FB20:
50 50 2C 26 CF E9
クリスタル
AF CD 9D 2F 3E E9 26 AC 2E 92 32 D6 E6 32 AF 3C 4E
32 CD AD 2F 11 7F 06 1B D5 C9 7F 7F 7F 7F 30 DF
既存のセーブデータでIDくじ調整ができているかの確認するためのプログラム
説明
コードが行っていることは上記の「開始時間」をにちようびのよる0じ0ふんにすることと、IDくじの終了のフラグと抽選のフラグの変更を行っています。
金・銀
WRA0:CF21 AF xor a
WRA0:CF22 26 D1 ld h,D1
WRA0:CF24 2E D8 ld l,D8
WRA0:CF26 32 ldd (hl),a
WRA0:CF27 32 ldd (hl),a
WRA0:CF28 32 ldd (hl),a
WRA0:CF29 32 ldd (hl),a
WRA0:CF2A EA 3D D9 ld (D93D),a
WRA0:CF2D EA 3E D9 ld (D93E),a
WRA0:CF30 A7 and a
WRA0:CF31 4E ld c,(hl)
WRA0:CF32 EA AD D9 ld (D9AD),a
WRA0:CF35 C9 ret
ECH1:FB20 50 ld d,b
ECH1:FB21 50 ld d,b
ECH1:FB22 2C inc l
ECH1:FB23 26 CF ld h,CF
ECH1:FB24 E9 jp hl
クリスタル
WRA1:D002 AF xor a
WRA1:D003 26 D4 ld h,D4
WRA1:D005 2E B1 ld l,B1
WRA1:D007 32 ldd (hl),a
WRA1:D008 32 ldd (hl),a
WRA1:D009 32 ldd (hl),a
WRA1:D00A 32 ldd (hl),a
WRA1:D00B EA F3 DB ld (DBF3),a
WRA1:D00E EA F4 DB ld (DBF4),a
WRA1:D011 A7 and a
WRA1:D012 4E ld c,(hl)
WRA1:D013 26 DC ld h,DC
WRA1:D015 2E E3 ld l,E3
WRA1:D017 CB BD res 7,l
WRA1:D019 32 ldd (hl),a
WRA1:D01A C9 ret
WRA1:D01B 7F ld a,a
WRA1:D01C 7F ld a,a
WRA1:D01D 7F ld a,a
WRA1:D01E 7F ld a,a
WRA1:D01F 7F ld a,a
WRA1:D020 7F ld a,a
WRA1:D021 30 DF jr nc,D002
バイナリ
金・銀
CF21:
AF 26 D1 2E D8 32 32 32 32 EA 3D D9 EA 3E D9 A7 4E
EA AD D9 C9
FB20:
50 50 2C 26 CF E9
クリスタル
AF 26 D4 2E B1 32 32 32 32 EA F3 DB EA F4 DB A7 4E
26 DC 2E E3 CB BD 32 C9 7F 7F 7F 7F 7F 7F 30 DF
つづきからのセーブデータに関するプログラム
説明
セーブデータが存在するかどうかのフラグを編集することでセーブデータをない状態にしています。
金・銀
WRA0:CF21 AF xor a
WRA0:CF22 3C inc a
WRA0:CF23 CD 9D 30 call 309D
WRA0:CF26 EA 08 A0 ld (A008),a
WRA0:CF29 3C inc a
WRA0:CF2A 3C inc a
WRA0:CF2B CD 9D 30 call 309D
WRA0:CF2E EA 08 B2 ld (B208),a
WRA0:CF31 4E ld c,a
WRA0:CF32 CD AD 30 call 30AD
WRA0:CF35 C9 ret
ECH1:FB20 50 ld d,b
ECH1:FB21 50 ld d,b
ECH1:FB22 2C inc l
ECH1:FB23 26 CF ld h,CF
ECH1:FB24 E9 jp hl
クリスタル
WRA1:D002 AF xor a
WRA1:D003 3C inc a
WRA1:D004 CD 9D 30 call 2F9D
WRA1:D007 EA 08 A0 ld (A008),a
WRA1:D00A 3C inc a
WRA1:D00B 3C inc a
WRA1:D00C CD 9D 30 call 2F9D
WRA1:D00F EA 08 B2 ld (B208),a
WRA1:D012 4E ld c,a
WRA1:D013 CD AD 30 call 30AD
WRA1:D016 C9 ret
WRA1:D017 7F ld a,a
WRA1:D018 7F ld a,a
WRA1:D019 7F ld a,a
WRA1:D01A 7F ld a,a
WRA1:D01B 7F ld a,a
WRA1:D01C 7F ld a,a
WRA1:D01D 7F ld a,a
WRA1:D01E 7F ld a,a
WRA1:D01F 7F ld a,a
WRA1:D020 7F ld a,a
WRA1:D021 30 DF jr nc,D002
バイナリ
金・銀
CF21:
AF 3C CD 9D 30 EA 08 A0 3C 3C CD 9D 30 EA 08 B2 4E
CD AD 30 C9
FB20:
50 50 2C 26 CF E9
クリスタル
AF 3C CD 9D 2F EA 08 A0 3C 3C CD 9D 2F EA 08 B2 4E
CD AD 2F C9 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 30 DF