reiju's diary

オタクが文字を入力しておくだけ

Cyro氏のアルセウス取得方法の解説

Cyro氏による、このトリックについての翻訳済みの文章および解説は公開を許諾されています。詳細はこちらへ

こんにちは、Reijuです。Cyro氏が十年来に解明した、アルセウスの取得方法を解説します。

私の翻訳ではどうしてもわかりづらいことが多いので、改めて書こうと思いました。

まず、重要なステップはこちらです。

  1. ポケッチカンパニーに逆向きに入ってかべのなかにはいる
  2. Map IDが558より大きいマップを読み込んでセーブする
  3. 再計算ののちキャラの位置が大きく変わったら、ちかつうろのマップに行く
  4. ちかつうろのSprite 1とメモリ上で出会い221ばんどうろへ行ったことにする
  5. 221ばんどうろのワープとメモリ上で出会いパルパークのエントランスを読み込む
  6. パルパークのエントランスのワープとメモリ上で出会いパルパークを読み込み、パルパークモードを有効にする
  7. クロガネシティを読み込んで、Sprite 13にメモリ上で出会いリッシこを読み込む
  8. リッシこのSprite 0にメモリ上で出会いはじまりのまを読み込む
  9. 「リタイア」してアルセウスエンカウントするスクリプトを実行する
  10. 5~6をする
  11. 「リタイア」してパルパークモードを無効にし、かべのなかから抜け出す

…見ていて長いので、簡略化しますと、こうなります。

  1. かべのなかにはいる
  2. Map ID > 558 なマップを読み込んでセーブする
  3. リセット
  4. ワープを何回かする
    1. ちかつうろのSprite 1 -> 221ばんどうろ
    2. 221ばんどうろのワープ -> パルパークのエントランス
    3. パルパークのエントランスのワープ -> パルパーク
  5. 瞬間的にパルパークモードが有効化される
  6. ワープを何回かする
    1. クロガネシティのSprite 13 -> リッシこ
    2. リッシこのSprite 0 -> はじまりのま
  7. 「リタイア」をする
  8. 4をもう一度繰り返す
  9. 「リタイア」をする

この説明を読み進める上で、前提知識として知って欲しいのは、Pokemon DPのマップの配列情報がキャラの座標情報とは別にあるということです。

あなたがコトブキシティから202ばんどうろに行くためには、y座標をいくつか減らしますね。これでわかる通り、あなたのいるマップは座標の変更によって変わります。オリジナルの記事で書いてある"map matrix"とは、このような操作によって変更が起こります。これはタウンマップであなたの位置が動くのと同じことだと考えてください。そして、あなたが今タウンマップの世界をイメージしていますが、今突然メモリの世界へ飛び込んでしまったと考えましょう!「タウンマップ」ではなく、「メモリマップ」です!今から移動するキャラは、まさにメモリ上を駆け巡るのだと、強く理解してください。

Step 1

かべのなかにはいる

Step 1では、ポケッチカンパニーの中に反対から入ります。そのために、じてんしゃでマップを処理に追いつかないようにゲームに読み込ませて、別の場所にあるはずのマップデータをポケッチカンパニーの場所にあるようにします。ドアから1マス離れたところで画面をすべて描画しなおし、実際のワープを読み込んで、ポケッチカンパニーに入ります。

Step 2

Map ID > 558 なマップを読み込んでセーブする

1 S⬇️
17 W⬅
14 N⬆

この動作でポケッチカンパニーの左上に歩きます。ポケッチカンパニーの左上の床は、ポケッチカンパニー自身の配置から-1だけX座標がずれています。

2015 W⬅
192 E➡️
512 S⬇
セーブして再起動

16歩動くことにより、1バイトずつメモリ上のキャラの位置が変わっていきます。よって、2015+1 / 16 = 126であり、また512 / 16 = 32だから、

126バイトだけメモリの値を減らし、32バイトだけメモリの値を増やす

となっています。だから、126 - 32 = 94となり、94バイトだけマトリックスの最初から離れた場所にキャラが置かれます。結果としてMap IDが558より大きいマップを読み込みます。

Step 3

リセット
x_offset = floor(x / 32) * 2
y_offset = floor(y / 32) * (2 * matrix_width)
 
current_offset = matrix_layout_start + x_offset + y_offset

x_offsetは、たとえばキャラが全体の中の(130, 230)にいたとします。そうすると、

x_offset = floor(130 / 32) * 2 = 8
y_offset = floor(230 / 32) * (2 * 30) = 7  * 60 = 420
current_offset = 1 + 8 + 420 = 429

のように、現在の相対位置を確認できます。この場合、リセット前は1x1から22バイト前のマップにいたことになりますが、この再計算により1x1から429バイト先のマップに移動されます。これはただの例えで実際は全く別の数値です。

32 E➡️
384 S⬇️
32 W⬅️

この動作で、クラッシュの原因となるMap Id 176~188を含むマップを回避します。ここを通過した後に全体の画面描画が行われるとゲームがクラッシュするためです。

1792 S⬇️

この中の1664 S目のステップでちかつうろに到達しますが、その前にこの長いステップによってマップ全体を一周しています。この動作により、実際にマップデータ上にキャラを配置することが可能になるからです。

128 W⬅️
32 S⬇️
192 W⬅️
64 S⬇️
160 W⬅️

これらの動作で配置されているちかつうろのSprite 1にメモリ上で会いに行きます。先程書いたとおり、これらの移動でキャラのいるマトリックス上の位置を変更しています。それにより、Sprite 1のX座標のあるアドレスにアクセスし、221ばんどうろを読み込むのです。

Step 4

ワープを何回かする

① ちかつうろのSprite 1 -> 221ばんどうろ

先程221ばんどうろを読み込みましたね。

② 221ばんどうろのワープ -> パルパークのエントランス

96 S⬇️
96 E➡️
32 S⬇️
63 E➡️
1 N⬆️
63 E➡ (すでにパルパークに行ったことがあるなら64 E➡)

これらの動作によって、メモリ上で221ばんどうろの持つパルパークのエントランスへのワープの出口のMap IDに出会います。

③パルパークのエントランスのワープ -> パルパーク

191 N⬆️
1 N⬆

おわかりのとおり、メモリ上でパルパークのエントランスのワープの出口のMap IDに出会います。

Step 5

瞬間的にパルパークモードが有効化される

何も書くことはないでしょう。あえて言うなら、パルパークを読み込むと、自動的にパルパークモードが有効化されるスクリプトが実行されるということです。

Script 1:
    Fanfare 1500 
    Lockall 
    Message2 9 
    Return 30 32780 
    Message2 10 
    Fanfare 1501 
    Return 30 32780 
    Message2 11 
    Fanfare 1501 
    Return 30 32780 
    Message2 12 
    Fanfare 1501 
    Return 30 32780 
    Message2 13 
    Fanfare 1603 
    Return 30 32780 
    StopGreatMarsh 0 
    Setvar 16627 1 
    Setflag 2453 
    PlaySound 1069 
    CloseMsgOnKeyPress 
    Releaseall 
    End

つまり、https://youtu.be/VrhHXG3cuAw?t=3m21s を見ればわかるとおり、

Script 1:
    *sound*
    let your all inputs disable
    "Let the countdown begin!"
    "Three..." *sound*
    "Two..." *sound*
    "One..." *sound*
    "Start!" *sound*
    turn on Pal park mode
    The music begins playing
    CloseMsgOnKeyPress
    Releaseall
    End

このような動作が発生しています。

Step 6

ワープを何回かする

Step 6の説明の前に、利便性のためにステップの表記を変更します。

192 E➡️
66 S⬇️
65 S⬇️
1 S⬇️
1 N⬆

まずクロガネシティに行きます。

192 E➡️
65 S⬇️

①クロガネシティのSprite 13 -> リッシこ

1 S⬇️

そして最後に位置調整のため、

1 N⬆

②リッシこのSprite 0 -> はじまりのま

192 W⬅️
64 N⬆️
64 W⬅️
32 N⬆️
128 W⬅️
64 N⬆️
64 W⬅️
96 N⬆️
226 E➡️

メモリ上ではじまりのまのMap IDと等しい値をフラグとして持つSprite 0に会いに行きます。もし今まででそれらの値について興味を持ったのなら、オリジナルのフォーラムから添付ファイルをダウンロードして、"Lake Valor"で検索してみましょう。

Sprite 0のメモリに到達するまでに、リッシこより多くのマップデータを含むマップをロードすることがないので、最終的にSprite 0に会うことが可能です。走る間はずっとなぞのばしょにいます(╹◡╹)

Step 7

「リタイア」をする

Step 8

Step 4と同様

Step 9

Step 7と同様

説明は以上になります。お読みいただきありがとうございます。