📚
本記事は、Glitch City Wiki の Guides: Obtaining an unnamed Pokémon using Transporter Glitch をもとに、日本語版向けに翻訳・編集したものです。
『ポケットモンスター クリスタル』日本語版(ニンテンドー3DSバーチャルコンソール)で、名前がバグったポケモンを入手する方法を解説します。
概要 セットアップ1:ボックス1を一度も満タンにしたことがない場合 手順1:準備とポケムーバーバグの実行 手順2:バグったボックス1から名前のバグったポケモンを作る 手順3:ボックス1を正常な状態へ戻す セットアップ2:ボックス1をすでに満タンにしたことがある場合 手順1:準備とポケムーバーバグの実行 手順2:0x1500制御コードによる任意コード実行で、手持ち1匹目の名前をバグらせる 手順3:ボックス1を正常な状態へ戻す 付録 セットアップの詳しい仕組み ボックス名コードの解説 アセンブリコード バイナリ
概要
このガイドでは、ニンテンドー3DSダウンロードソフト「ポケムーバー」のバグを利用して、任意コード実行に使うポケモンを入手します。
この方法は VC版専用 です。手順を進めるには、ポケモンずかんを入手し、モンスターボールを使えるところまでゲームを進めておく必要があります。
このガイドには2種類のセットアップがありますが、実行するのはどちらか一方だけです。プレイ中にボックス1を満タンにしたことがあるかどうかで、手順が異なります。
- ボックス1を一度も満タンにしたことがない → セットアップ1
- ボックス1を一度でも満タンにしたことがある → セットアップ2
セットアップ1:ボックス1を一度も満タンにしたことがない場合
手順1:準備とポケムーバーバグの実行
- ボックス1を空にし、中にいるポケモンをすべて別のボックスへ移動します。
- 手持ちを4匹以上にします。そのうち2匹は、後の手順でボックス1へ預けます。
- 手持ちのポケモン1匹に任意のどうぐを持たせます。
- 使用するボックスをボックス1に切り替えます。
- 以下の手順でポケムーバーを使用します。
- どうぐを持たせたポケモンをボックス1へ預け、セーブします。
- 別のポケモンを1匹、ボックス1へ預けます。セーブせずにゲームを終了します。
- ポケムーバーを起動し、ボックス1の中身を転送します。
- どうぐを持っているポケモンは転送されません。これは想定どおりの動作です。
- 最後に預けたポケモンをポケムーバーが転送しようとしたら、そのまま転送します。
- ゲームを再開します。「ボックスをかえる」メニューではボックス1のポケモン数が0匹と表示されますが、実際には1匹残っている状態になります。
手順2:バグったボックス1から名前のバグったポケモンを作る
- バッグを一度開きます。
- 「ボックスせいり/メールはずしてね」を使い、先ほどセーブせずに預けたポケモンを、手持ちからボックス1の一番上のスロットへ移動します。ほかのスロットへ移動するとゲームがフリーズするため注意してください。
- 同じメニューで、ボックス1の2番目のスロットにいるポケモンを一番上へ移動します。その後、同じ操作をもう一度繰り返します。
- 「ひきだす」メニューでポケモンを確認します。下の画像のように、2匹のニックネームがどちらも複数の「?」になっていれば成功です。どちらも任意コード実行に利用できます。
- 複数回入れ替えても2匹の名前が完全な空欄のままの場合、過去にボックス1を満タンにしたことがある可能性が高いです。その場合はセットアップ2を使用してください。
手順3:ボックス1を正常な状態へ戻す
- ボックス1の一番上にいる名前のバグったポケモンを、ボックス3の一番上に移動します。
- 「ポケモンをあずける」を選び、任意のポケモンをボックス1に直接預けます。「ボックスせいり/メールはずしてね」は使わないでください。これにより、現在ボックス1に存在しているバグったポケモンが上書きされ、ボックス内のポケモン数も正常な値へ戻ります。
- 使用するボックスをボックス3に切り替えます。これでセットアップは完了です。
続きは 📄ポケットモンスター クリスタル バイナリエディタ の「手順4:0x1500制御コードによる任意コード実行を行う」を参照してください。
セットアップ2:ボックス1をすでに満タンにしたことがある場合
手順1:準備とポケムーバーバグの実行
- ボックス1を空にし、中にいるポケモンをすべて別のボックスへ移動します。また、オニスズメを1匹用意します。入手方法は次のいずれかです。
- 野生のオニスズメを捕まえます。ゲーム開始直後から行ける46ばんどうろの南側がおすすめです。朝または昼のみ出現し、出現率は30%です。
- コガネシティと35ばんどうろの間にいるゲートの係員からオニスズメを受け取ります。
- オニスズメをボックス2へ入れます。
- ボックス2の残りの枠を、任意のポケモンで埋めて満タンにします。これらのポケモンは手順中にデータが破損する可能性があるため、失っても問題ないポケモンを使用してください。
- 手持ちを6匹にします。このセットアップでは、手持ちの1匹目が名前がバグったポケモンになるため、1匹目には名前がバグっても構わないポケモンを置いてください。
- 手持ちの6匹目のポケモンに任意のどうぐを持たせます。
- 使用するボックスをボックス1に切り替えます。
- 以下の手順でポケムーバーを使用します。
- どうぐを持たせたポケモンをボックス1へ預け、セーブします。
- 手持ちの5匹目のポケモンをボックス1へ預けます。セーブせずにゲームを終了します。
- ポケムーバーを起動し、ボックス1の中身を転送します。
- どうぐを持っているポケモンは転送されません。これは想定どおりの動作です。
- 最後に預けたポケモンをポケムーバーが転送しようとしたら、そのまま転送します。
- ゲームを再開します。「ボックスをかえる」メニューではボックス1のポケモン数が0匹と表示されますが、実際には1匹残っている状態になります。
- 「ボックスせいり/メールはずしてね」を使い、ボックス2のオニスズメを ボックス1の一番上のスロット へ移動します。
- 「ボックスせいり/メールはずしてね」を使い、ボックス2のポケモンをボックス1の一番上のスロットへ繰り返し移動します。これ以上追加できなくなるまで続け、ボックス1を満タンにします。
- 正しくできていれば、ボックス1の 下から2番目のスロット にオニスズメがいる状態になります。
- ボックス2に最後に残ったポケモンを手持ちに加え、手持ちを再び6匹にします。
- 手持ちが満タンの状態で野生のポケモンを1匹捕まえます。捕まえたポケモンはボックス1へ送られ、ボックス1がオーバーフローした状態になります。
手順2:0x1500制御コードによる任意コード実行で、手持ち1匹目の名前をバグらせる
- ポケモンセンターのパソコンを開き、ボックス1〜3の名前を以下のように変更します。それ以外のボックスは変更不要です。 📦ボックス1:にユゥリとてろろ
ボックス2:ヅレダバョづづづ
ボックス3:づづづぢさたの
- ポケモンセンターのパソコンの前でセーブとリセットを行います。
- ゲームを再開したら、パソコンの前から左へ1歩→下へ1歩の順に移動し、ポケモンずかんを開きます。下の画像で示した位置で開いてください。
- ポケモンずかんを閉じてから、右へ1歩→上へ1歩の順に移動し、パソコンを開きます。「ひきだす」メニューに入って一番下のスロットまでスクロールします。正しくセットアップできていれば、「ひきだす」メニューが自動的に閉じ、パソコンのメインメニューへ戻ります。
- 手持ちポケモンを確認します。1匹目のニックネームが「?」1文字に変化していれば成功です。 この時点では、そのポケモンの「つよさをみる」を開かないでください。
手順3:ボックス1を正常な状態へ戻す
- バッグを一度開きます。
- 以下の操作でボックス1を正常な状態に戻します。
- ボックス1の一番上にいる2匹を逃がします。
- 「ポケモンをあずける」を選び、手持ちの名前がバグっていないポケモンをボックス1に直接預けます。「ボックスせいり/メールはずしてね」は使わないでください。
- これでボックス1の機能は正常な状態に戻ります。
- 「ボックスせいり/メールはずしてね」を使い、手持ち1匹目の名前がバグったポケモンを、ボックス3の一番上に移動します。
- 使用するボックスをボックス3に切り替えます。これでセットアップは完了です。
続きは 📄ポケットモンスター クリスタル バイナリエディタ の「手順4:0x1500制御コードによる任意コード実行を行う」を参照してください。
付録
セットアップの詳しい仕組み
ボックス名コードの解説
このコードは、手持ち1匹目のポケモンのニックネームを消去・破損させ、通常の0x1500制御コードによる任意コード実行セットアップで使用できるようにするためのものです。
hlを使った直接書き込みにより、ニックネームを0で埋めます。
アセンブリコード
SECTION "Main", ROM0
Main:
LOAD "BoxCode", WRAMX[wBoxNames]
BoxCode:
add a, 0xA3 ; a = 0x71
ld [0xC4D8], a ; 次の命令を書き換え、.entryPoint へジャンプさせる
jp .entryPoint
ld d, b ; ボックス名の終端文字0x50(ジャンプで飛び越すため実行されない)
.entryPoint
ld de, 0x0FA7
add hl, de ; hl = 0xDDEE、wPartyMon1Nickname の最後のバイト
xor a, a
ld [hld], a
ld [hld], a
ld [hld], a
ld d, d
ld [hld], a
ld [hld], a
ld [hld], a ; 0x00を6回書き込むことでニックネームを実質的に0で埋める
ld sp, 0xC0BB ; 安全に戻るための準備
ret
.end バイナリ
C6 A3 EA D8 C4 C3 DB DB 50
11 A7 0F 19 AF 32 32 32 50
32 32 32 31 BB C0 C9 50