ロングワープ解説

ロングワープはゲームシステムの様々な要素が絡み合いながら最終的な結果が決まる技であるため、ロングワープを詳細に解説するとどうしても複雑になりがちである。

ゲーム内部の仕組みを知る

まずエントランステーブルについて説明する。エントランステーブルとは 1556 項目という大量のデータを含む表データで、エリア移動時にロードするシーンや、リンクの初期位置などを設定するために使われている。別のエリアとつながっているポイント(たとえば森の神殿正面の入口など)は、プレイヤーの視点から見ると常に同じ場所にワープしているように見えるが、実際はエントランステーブルには 1 箇所のエリア移動地点につき最低 4 項目のデータが用意されている。この 4 つのデータは昼/夜と子供/大人の組み合わせ全種を表現するためのものである。また、シーンのロードと同時に再生されるタイプのムービーを複数持つシーンには、この 4 つのデータに加えてさらに各ムービー用の追加データが用意されている。このムービー用データが置かれる場所は、同じエリア移動地点を使用するエントランスデータの集まりの 5 項目め以降になる。

エントランステーブル内のデータを探し出す方法は 2 通りあるが、どちらもある計算式を用いてデータの場所を割り出す必要がある。1 つ目はエントランスベース番号(以下ベース番号と呼ぶ)単体から計算する方法(エントランスデータは同じエリア移動地点を使うものでまとめられており、そのまとまりの先頭位置を表すものがベース番号である)、2 つ目はエントランスベース番号とムービー再生用オフセット(ムービーオフセット、ムービー番号と呼ぶこともある)を組み合わせて使う方法である(ムービー番号が使われているデータを読み込むとある種の属性を持つムービーが再生される)。ベース番号はエリア移動後も使用される。たとえば、異空間に落下して元の場所に復帰したり、フロルの風を設置したりする際にはベース番号をもとに計算が行われる。

ベース番号単体でデータを探し出す場合は、現在のゲーム内時間(昼・夜)と時代(子供・大人)のステータスを利用して最終的に使用するエントランスデータの場所を計算する。

たとえば、普通の方法でハイラル平原から城下町に入ると、0x0033 という数値(子供城下町用データを表す)がベース番号としてセットされる。ごくわずかな例外を除き、時代や時間帯を変えてもここでセットされるベース番号が変わることはない。その後に、リンクが大人ならばこの数値に 2 を足し、そして時間帯が夜なら 1 を足す。このような仕組みを使って 1 つのベース番号から 4 つのエントランスデータの場所を割り出すことを可能にしている。

ベース番号とムービー番号の 2 つを使ってデータを探し出す場合は、まず数値 4 がベース番号に加算される。4 を足すのは通常用のエントランスデータ 4 つをスキップするためである。その後でムービー番号として保存されている数が続けて加算される。

たとえばタイトルムービーを再生すると、ベース番号には 0x00CD、ムービー番号には 3 がセットされる。すると計算式は CD + 4 + 3 となり、番号 0x00D4 がタイトルムービー用のエントランスデータの場所を表していることがわかる。

実際に使用するエントランスデータの場所が割り出されたら、ゲームプログラムによりエリア移動先のシーンデータやポジション番号(座標の取得に使用するデータ)が取得され、次のシーンのロードが開始される。

このようにエントランスデータを探す方法は 2 種類あるが、このうち 2 つ目、すなわちムービー番号を使ってムービーデータを読み込む方法を利用した技がロングワープである。ロングワープの仕組みは、まず本来の正しいワープ先情報が設定された後でなんらかの方法を使ってワープ先のベース番号を書き換える。すると新たに書き換えたベース番号と本来のワープ先用のムービー番号の組み合わせができあがるため、全く関係のない場所へワープすることになるのである。

シーンのロード

シーンには 2 つのタイプがある。1 つはデータの先頭に 0x18 という命令コードをもつシーン、もう 1 つはこのコードをもたないシーンである。命令コード 0x18 はシーンパターン生成リストを読み込むコードである。シーンパターンというのはエリアの状態を変化させるための仕組みで、たとえばカカリコ村には 4 つのシーンパターンが用意されており、子供昼・子供夜・大人昼・大人夜と状況に合わせてエリアの状態が変化する。また、シーンパターンはムービー用エリアの生成にも使用されている。エントランステーブルにあるデータのうち、ムービーでしか使われないシーンはすべて 0x18 コードをもつ。ムービー用のエントランスが存在しないのにもかかわらず 0x18 コードをもつシーンはゾーラ川と大量ツボの家の 2 つだけである。

シーンパターン生成リストの構造はエントランステーブルとほとんど同じである。最初のデータ 4 つ(0~3 番)はすべて通常のプレイモード用のデータであり(基本的には昼・夜・子供・大人の各組合せパターンを表す)、パターン番号 4 番以降はムービー用のデータである。そしてパターン番号 4 はムービー番号 0 に対応するデータで、パターン番号 5 はムービー番号 1、パターン番号 6 はムービー番号 2 と以降同様の関係が続く。ムービー用のパターンデータが通常のプレイモード用のパターンデータと異なる部分はムービーポインタをセットするコードが含まれていることである(ムービーポインタとは再生するムービーデータのメモリ位置を表す数値で、セットされる数値はムービーデータの先頭のアドレスとなる)。このコードが読み込まれるとデータ読み込み後に再生するムービー用データのメモリアドレスがムービーポインタにセットされる。

ロングワープ先のシーンにコード 0x18 が含まれている場合、ゲームプログラムはシーンパターンを読み込んでムービーを再生しようとする。その場合、ロングワープの結果は次のどちらかになる。

  • セットされたムービー番号に対応するシーンパターンが存在しない場合、シーンパターン生成リストの範囲外のデータが読み込まれてしまうので結果はクラッシュとなる。
  • セットされたムービー番号に対応するシーンパターンが存在する場合は割り出されたパターンデータが読み込まれる。するとムービーポインタが更新されてほぼ通常通りムービーを再生することができる。

ロングワープ先のシーンにコード 0x18 が含まれていない場合、そのシーンにはエリアのパターンが 1 つしかないためそのままパターン 0 のデータが読み込まれる。ただしロングワープがクラッシュしなかった場合は必ずパターンデータ読み込み後にムービーの再生が行われようとする。パターン 0 のデータにはムービーポインタを書き換える機能が備わっていないため、パターンデータ読み込み後もムービーポインタには前回見たムービーデータの場所が設定されたままになる。ムービーポインタに設定されているメモリアドレスには、ロングワープ発動時にもまだ前回見たムービーデータがそのまま残っていることもあるが、場合によっては全く違うデータが上書きされていることもある。いずれにせよロングワープの結果はソフトロックやクラッシュになるか、もしくは都合のいいデータが設定されていればムービーの再生に失敗するだけで済み、そのままプレイを続行できることもある。

ワープ可能先一覧(シーン番号順)のページでは全てのシーンのコード 0x18 の有無が確認できる。また、コード 0x18 をもつシーンに関しては、ロングワープ時に再生されるムービーがあればムービーの内容も確認することができる。

エリア情報のロード

ロードするシーンパターンデータが見つかり、クラッシュの回避にも成功したら、次は読み込んだシーンのエリア情報や初期位置のデータを探し出してロードすることになる。通常リンクを設置するエリアや座標は、エントランスデータの中にあるポジション番号を使用して設定される。しかしフロルの風を使用して帰還ポイントにワープする場合は、フロルの風設置時に保存したエリア番号と座標を使って設定される。

まとめ

今までの説明をまとめて確認するため、何も技を使わずにデクの樹のブルーワープに入ったときのプロセスを見てみよう。

  • ブルーワープの中へ入る。リンクの位置が固定され、ブルーワープが自身のデータ内にあるブルーワープタイマーのカウントアップを始める。
  • プルーワープタイマーがある一定の数値に達すると、ブルーワープによってベース番号に「ワープ先エントランス」のデータがセットされ、最終的なワープ先データを割り出す準備が始まる(デクの樹のブルーワープの場合 0x00EE がベース番号にセットされる)。さらに待機ムービー番号に「次に再生するムービー番号」がセットされる(デクの樹のブルーワープの場合ムービー番号は 1 番なので、ムービー番号 1 を表す 0xFFF1 がセットされる)。
  • 最終的なエントランスデータの場所を割り出す。計算は 0x00EE + 4 + 1 で 0x00F3。
  • 番号 0x00F3 のエントランスデータを見ると、番号 85 のシーンを読み込み、ポジション番号 0 にリンクを設置するという情報が取得できる。
  • 番号 85 のシーンはコキリの森であり、通常のロムカセットにも存在するシーンデータである。よってコキリの森のデータファイルがメモリに読み込まれる。
  • コキリの森はコード 0x18 をもつシーンである。再生するムービー番号は 1 なので、対応するシーンパターン番号は 5。よってシーンパターン番号 5 のデータが読み込まれる。
  • パターン番号 5 は存在するデータであり、ムービーポインタを更新するコードも含まれている。確認後、シーンパターン 5 からポジション番号 0 が表す実際のデータを取得する。
  • ポジション番号 0 が表す位置はエリア 1、デクの樹の前であるという情報が取得され、この位置にリンクが設置される。
  • 「ワープ先エントランス」アドレスのデータが「前回のエントランス」を表すデータとしてコピーされる。「前回のエントランス」は異空間に落下して元の場所に復帰する時や、フロルの帰還ポイントを正しい位置にセットするために使われるデータである。
  • 「次に再生するムービー番号」アドレスのデータが「現在のムービー番号」にコピーされる。このプロセスでムービーの再生準備が開始される。
  • ムービーポインタアドレスのチェックが行われる。ムービーポインタには再生可能なムービーが設定されているため、バグは起こらず通常通りの結果となる。

エリアの読み込みとリンクの初期位置設定が本来どのように行われるかを大体把握したところで、1 つ目のロングワープ、ガノンドアを見てみよう。

ガノンドア

ガノンドアを行う場合、まずオカリナアイテムバグを発動する。オカリナアイテムバグを使う目的はブルーワープに入った後もリンクの操作可能状態を維持するためである。その後、ある特定のフレームで扉を開く。すると「ワープ先エントランス」として保存されているデータが、本来ブルーワープがセットする正しいエントランスではなく、ボス部屋からデクの樹のメインエリアに戻る時に使用するエントランスを表すベース番号(0x0252)に書き換えられる。しかしこの時、「次に再生するムービー番号」は 0xFFF1(ムービー番号 1)のまま変化しない。よって計算後番号 0x0257 のデータ、すなわちガノン城崩壊イベントの塔内部シーンが読み込まれる。

ガノン城崩壊イベントの塔内部はコード 0x18 を持たないシーンである。よって普通にデクの樹のブルーワープを使った時とは違い、ゲームプログラムは現在のムービーポインタにセットされているムービーデータを使ってムービーを再生しようとする。結果はムービーポインタの内容によって変わり、ムービーの発生なし・いつまでも終わらない無限ムービーが始まって操作不能に陥る・前回のムービーが再生される・クラッシュするといった現象が発生する。

一時フラグ

もう 1 つガノンドアに関係する要素は一時フラグである。一時フラグはセーブファイルに保存されないステータスを保持するためのデータであり、2 つの種類がある。1 つ目はスイッチフラグで、ブルースイッチの起動状態や時の歌ブロックの状態を管理するためのものである。2 つ目はコレクトフラグで、壊したツボを記録するなど、ちょっとしたステータス情報全般を管理するためのものである。

一時フラグ用のデータ領域は全ダンジョンが共有で使用する。また、一時フラグをリセットせずに別のシーンに移動することも可能である。一時フラグをリセットする時はシーン移動を行うときにどの出口を使ったかをもとに判定されているらしく、そのため、あるエリアで一時フラグをオンにした後ロングワープを行えば、先ほどオンにした一時フラグを別のシーン用の一時フラグとして使うことができるようになる。この場合、先ほどオンにした一時フラグによって、ワープ先エリアの仕掛けなどが最初から起動した状態になることがある。

たとえば、デクの樹でダンジョンのメインエリアからボス部屋へ移動し、もう 1 度メインエリアに戻っても、一時フラグのリセットは行われない。それに対し、通常の出入り口からコキリの森に戻ったり、ブルーワープを使って外に出たりすると一時フラグはリセットされる。この仕様とガノンドアを組み合わせるとあることが起きる。ガノンドアで出口として使用するのはメインダンジョンに戻る扉であるため、ガノンドアを行うとワープ後もデクの樹でオンにした一時フラグをそのまま持ち越すことができる。これを利用し、通常プレイで訪れるパチンコの部屋にあるハシゴを下に落とすことで、ガノン城崩壊イベントの塔外側にあるゲートの 1 つを最初から開いた状態にすることができる。

デスロングワープ

次にデスロングワープについて説明する。仕組みはガノンドアとほとんど同じだが、異なるのは「ワープ先エントランス」データを書き換える手段として扉を開ける方法ではなく、ある特定のフレームで死亡した後「ゲームを続ける」を選択する方法を使うという部分である。デスロングワープは「ゲームを続ける」選択後もブルーワープのタイマーが進み続けるという仕様を利用した技である。デスロングワープを使ってワープする時は必ずダンジョンのメインエリア入口のベース番号が「ワープ先エントランス」データとしてセットされる。ちなみにデスロングワープ使用時も一時フラグの持ち越しが可能。

フロルロングワープ

フロルの風を使ってロングワープを発動する場合は少し流れが変わる。フロルの帰還ポイントがセットされると最後に使用したエントランスのベース番号・リンクの座標・向いている方向・現在エリアの識別番号・そして部屋に入った時点における一時フラグの状態が保存される。帰還ポイントに戻るを選択してフロルロングワープを発動させると、帰還ポイント設置時に保存したこれらの情報すべてが返ってくる。

フロルの風をセットする部屋が原因でフロルロングワープ発動時にクラッシュが発生することがある。これはロングワープ先シーンのルーム数がフロルの風設置時に使用したルーム番号よりも小さいときに起こる現象である。たとえば炎の神殿のルーム数は 27 で森の神殿のルーム数は 23 であるため、炎の神殿には帰還ポイントをセットできない、あるいはセットするとフロルロングワープ発動時にクラッシュしてしまう部屋が 6 つ存在するということになる。

最後にもう 1 つ、フロルロングワープ失敗の原因となる要素がある。フロル設置時に保存する座標によっては、ロングワープ後初期座標が異空間に出てしまい、結果無限落下になってしまうことがある。しかし座標がダンジョンの外側に出ておらず、ムービーの発生もない場合であれば初期座標が異空間でも落下する前にセーブワープすることでダンジョンの入口へ戻ることができる。

異空間落下・リバースロングワープ

先ほどの説明の繰り返しになるが、通常の方法でロードゾーンに触れて別のシーンへ移動すると、実際に使用するエントランスデータ計算用のベース番号が「ワープ先エントランス」としてセットされ、そしてシーン移動後、このデータは「前回のエントランス」としてコピーされる。ロングワープを発動した後、シーン移動を行う前に異空間に落下すると、ゲームプログラムは「前回のエントランス」データのみを頼りにシーンを読み込もうとするため、プレイヤーをエントランス書き換えに使用したエントランス位置へ戻そうとする。この現象はどのロングワープ手段に関わらず発生する。

ロングワープ後に異空間落下をする時の挙動はフロルの風で帰還ポイントにワープする時に似ている。ロードするシーンは「前回のエントランス」データをもとに決定されるが、エリア情報や座標は最後に使用した扉に関する情報を使用して設定される。また、一時フラグの持ち越しも可能。

タイトル画面ロングワープ・デスホールロングワープ

タイトル画面ロングワープ(ベータクエストロングワープと呼ばれることもある)とデスホールワープは他のロングワープとは仕組みが完全に異なる。ゲーム内にはゲームモードを設定するためのデータが存在し、現在 3 種類のゲームモードが確認されている。

  • 00 - 通常のプレイモード
  • 01 - 鑑賞モード(タイトル画面・デモムービー)
  • 02 - ファイル選択モード

この 2 つのロングワープはゲームモードを鑑賞モードに設定すると発生する。

ロングウォーキング

今後追加予定。

Last updated 01/16/2017 – izu