Site cover image

🐾flag3

ポケットモンスター 金・銀・クリスタル IDくじ調整(任意コード実行)

ポケットモンスター 金・銀・クリスタルの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: 任意コード実行環境を整える

  1. IDくじの調整を行いたいソフトが金・銀である場合は、手持ちのポケモンの3匹目をおやの名前が4文字以下のポケモン、手持ちの4匹目をおやの名前が「じがまァ」のポケモンにします。
    • 主人公の名前が5文字のソフトを使っている場合は、ゲーム内交換または通信交換でおやの名前が4文字以下のポケモンを入手するようにしてください。
  2. パソコンにあるたいせつなものを全て引き出します。
  3. ガンテツからルアーボールをもらいます。
    • ガンテツボールであれば何でも良いですが、ヤドンのいどの攻略後にはじめてガンテツに話しかけることでもらえるルアーボールが一番入手しやすいでしょう。
  4. コガネシティで(1個目の)じてんしゃを入手して、べんりボタン(セレクトボタン)にとうろくします。
  5. ボールポケットを開いて1番目をルアーボール×1、2番目をモンスターボールにします。モンスターボールの個数は1、2、4、5のいずれかにしておきます。
  6. 「じてんしゃを持たせたポケモン」から(2個目の)じてんしゃをあずかります。
  7. たいせつなものポケットを開いてじてんしゃを一番下に2つ並べて配置し、1つ目のじてんしゃでセレクトボタンを押してから2つ目のじてんしゃでセレクトボタンを押して入れ替え操作を行います。
  8. ボールポケットの2番目のボールが255個になるので、残り個数を金・銀なら17個、クリスタルなら12個になるようにすてます。
  9. ボールポケットの2番目と65番目を入れ替えます。
    • ボールポケットの64~67番目については以下のようになっている(要検証)のでこれを目印にしてボールポケットの2番目と65番目を入れ替えると良いです。
      🔍
      ボールポケットの64番目:?×??

      ボールポケットの65番目:?×0

      ボールポケットの66番目:?×129

      ボールポケットの67番目:じてんしゃ

  10. メニューからポケギアが消えていれば任意コード実行の環境構築が終了となります。

手順3: IDくじ調整

下記の内容のメールをポケモンにもたせます。

金・銀

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

クリスタル

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

メールの作成後はメールの中身を読みます。その後、ポケモンずかんを開くことで任意コード実行を行うことができます。ただし金・銀で任意コード実行をする場合は、ポケモンスタジアム金銀のGBビルは使わないようにしてください。

手順4: 実際のプレイ

  1. 手順3の任意コード実行を行った後にリセットをします。リセットをする前にセーブはしなくてもよいです。
  2. 「さいしょから はじめる」を選択し、ようびをにちようびにします。
  3. ようびが変わるまでにコガネシティに行き、オニスズメ(ひきゃく)を入手してからIDくじを引きます。

上記の手順でIDくじが01001となり、マスターボールを入手することができます。

Image in a image block

注意

任意コード実行をしたら、しばらくは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くじ調整を行いつつ、つづきからのセーブデータがない状態になります。

明確な理由なしにここで述べる任意コード実行を行うことは推奨しません。

金・銀

✉️
ョぶへマだゥゲメぶぶへマだゥゲい
へャだの

クリスタル

✉️
ョぶへマぞゥゲメぶぶヘマぞゥゲい
へャぞの          だっ

技術的補足

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

名前金・銀クリスタル
sLuckyNumberDay00: B10000: AC90
sLuckyIDNumber00: B101, B10200: AC91, AC92
wStartDayD1D501: D4AE
wCurDayD1E501: D4BE
wLuckyIDNumberD9AF, D9B001: DC65, DC66

IDくじの番号

IDくじの係員に話しかけると「こんかいの アイディナンバーは ????? です」と表示されますが、この?????の部分にwLuckyIDNumberの中身(を10進数に変換したもの)が入ります。マスターボールを入手するためには、このアドレスに03 E9(10進数で01001)が入るように調整をしなければなりません。wLuckyIDNumberの中身が変わるタイミングは以下の2つです。

  1. 「さいしょから はじめる」を選択した直後。
  2. きんようびになって以降、はじめてラッキーチャンネルを視聴する瞬間またはIDくじの係員に話しかけて「こんかいの アイディナンバーは ????? です」の表示が出る直前。

手順4: 実際のプレイでは、この2つとも発生することになります。

wLuckyIDNumberの中身の変わり方

wLuckyIDNumberの中身の変わり方は、どちらのタイミングでも共通です。

1. sLuckyNumberDayの中身と(wCurDayの中身+01h)を比較する。

2. 等しければsLuckyIDNumberの中身をそのままwLuckyIDNumberに書き込む。

3. 等しくなければランダムに値を発生させて、そのランダムな値をsLuckyIDNumberwLuckyIDNumberに書き込む。

ランダムに値が発生してしまうと、IDを調整することが困難になるため、ランダムな値にならず狙った値にするためにはsLuckyNumberDaywCurDayの中身が重要になってきます。「さいしょから はじめる」を選択すると、メインメモリの大部分を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で、これはにちようびに対応しています。そのため、にちようびでないようびにおいてはwCurDay00にはなり得ないため、IDくじ調整ができなくなります。

現在の時間

ポケットモンスター 金・銀・クリスタルには、ゲーム内時間を管理するリアルタイムクロック(RTC)機能が搭載されています。この機能により、時計に関する情報がゲーム機のHRAM領域に格納され、ゲーム内での時間が現実世界の時間と連動するようになっています。

「現在の時間」はwStartDay以下4バイトで構成される「開始時間」に「RTCの時間」を進めることで得られ、そのうち日付に関するデータがwCurDayに格納されています。

開始時間

「開始時間」は「さいしょから はじめる」を選択して、じかんとようびを決める際に設定されるもので、「プレイヤーが設定した時間」から「RTCの時間」を戻した時間となります。特に「開始時間」≠「プレイヤーが設定した時間」となります。

「開始時間」のうち日付に関するデータはwStartDayに格納され、計算する際に7で割るという処理が発生するため、格納されている値は00~06のいずれかとなります。

「開始時間」に「RTCの時間」を進めることでwCurDayの値が求められるので、wCurDay00が格納されるためにはwStartDay00が格納されることが必要です。wStartDayの決定には「RTCの時間」が関係するため任意コード実行ではRTCの初期化を行い現実の時間に依存しないようにしています。

RTCの初期化で起きること

RTCの初期化を行うことで「開始時間」を設定する際に戻す「RTCの時間」が短くなります。そのため、「さいしょから はじめる」を選択し、ようびをにちようびにすることで「開始時間」の日付に関するデータwStartDay00が格納されます。その結果、ようびが変わるまではwCurDay00が格納されることになり、ようびが変わるまでにIDくじを引くことで、IDくじの番号が表示されるときのwCurDayの中身を00にすることができます。

RTCの初期化から一定時間経過した場合

RTCの初期化から一定時間経過すると「開始時間」を設定する際に戻す「RTCの時間」が長くなります。その結果、例えばRTCの初期化から10~34時間後にひる10じからはじめてにちようびに設定を行うと、「開始時間」の計算によってwStartDay06が格納されます。「現在の時間」は「開始時間」に「RTCの時間」を進めることによって得られるためwCurDayの中身が07となってIDくじ調整がうまくいかなくなります。

IDくじ調整のまとめ

以上のことから、任意コード実行では以下のことを行っています。

  1. sLuckyNumberDayの値を01にし、sLuckyIDNumberの値を03 E9にする。
  2. 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