K3の住民

最近はレア社のゲームについては書いていませんが、一応レア社のゲームが一番好きな人です。『雪圀』で"圀"は"国"とほぼ同義ですが、国ではありませんって当たり前か(笑)。

【時オカ】「Reverse Bottle Adventure(RBA)」「Bottle Adventure(BA)」を詳しく解説

どうも、雪圀です。

今回はRBA、BAと言う一昔前に流行った技の解説を行いたいと思います。
時オカ(3D)では「Wrong Warp(ポインタ変え)」の登場により、全く使われなく
なりましたが、ポインタ変え縛りにはかなり有効となる技です。



先ず、この技は「ポインタ変え」と同じくメモリを書き換える技です。書き換えると
言っても、あきビンがムシ入りビン等になるとアイテムの名前値(詳細は後述)が
書き換えられることを利用して、メモリの書き換えを行うので、「前判定型ポインタ
変え」よりかは自由度が低いです。

さて、アイテムの名前値とは、どういうことか、と言いますと、先ずアイテムの
名前は引き渡されたある値を返すことにより呼び出されるようになっています。
これを名前値と呼び、例えば名前値0を返すことにより、アイテム「デクの棒」が
呼び出されます。

次に、アイテム保存領域と言う、アイテムが保存されている領域が存在します。
アイテム保存領域はメモリ空間であり、こちらも、値を引き渡すことで、メモリ空間
を取っています。そしてその保存領域には、指定された幾つかのアイテムを保存する
ことが出来ます。例えば値が9のメモリアドレスには、名前値10のアイテム
「フックショット」と名前値11のアイテム「ロングフック」を保存することが
出来ます。

で、このアイテム保存領域と言う領域の値と、アイテムの名前値は、当然ながらも
別々の値であることが分かります。今回、アイテム書き換えの原理を理解する為に、
どうしてもアイテムの名前値と、アイテム保存領域の値は違うものであるということ
を理解しておく必要があります。

ここで注意してほしいのが、あきビンが最大で4つありますが、そのあきビンの一つ
一つが別々の保存領域となっていると言うことに注意してください。


原理を解説する前に、RBAを行う準備をする必要があります。

その為に、Bボタンをあきビン化させる必要があります。
先ずは初期ロッドである場合、釣り堀でBボタンを釣り竿にし(ルピー必須)、
バーブーツを履いて水面を歩き、ホバー状態が解除される前にBボタンを押し、
着水することで、釣り糸を垂らしながら移動が出来るようになります。そうで無い
場合、先ずは着水して浅瀬で潜り、水しぶきが出たと同時にBボタンを押すことで
釣り糸を垂らしながら移動が出来るようになります。この時、止められるように
処理されておらず、釣竿を持ったまま釣り堀を出ることが出来るようになります。
しかし、釣り堀以外では釣りが出来るように処理されていないので、釣りをすると
フリーズをします。
そこで、着水をし、Bアイテムを半透明状態にします。そして、メニューを開く
ことでBアイテムはデクの棒に変わります(因みに3D版の場合は着水後一回釣り堀
に入る必要がある)。そしてデクの棒の数を0にすることで、エラー音が発生する
ようになります。ビンを振ってるときにもエラー音を出すことが出来る、または
バック宙やESSポジションで入力バッファを2つ溜めることが出来ることを利用し、
アイテムボタンにセットされたビン系アイテムを変えながらBボタンを押すことに
より、Bボタンをビン系アイテムにすることが可能となります。


ということで、原理を解説します。

先ず最初に普通にあきビンをムシ入りビンに変えた場合、どのように書き込まれて
いるかを解説します。例えばN64の場合、C←に「あきビン」をセットして、
「ムシ入りビン」にします。
すると、アイテムボタンに名前値、保存領域の値の二つが取られます。そして、
「あきビン」を「ムシ入りビン」に変更し、名前値を書き換え、その名前値の
アイテムがどの保存領域にあったものかを確かめる為にそのアイテムから右に3番目
の値を確かめるように処理し、保存領域内のメモリの内容を書き換えます。これら
をまとめて図1に示します。
因みに保存領域名はスロット数にしていますので、そこにご注意を。

f:id:ryoryoau24:20161107155727p:plain
図1 アイテム書き換え処理

このようにして、処理されています。では、Bボタンを「あきビン」に変え、それを
「ムシ入りビン」にすると、どうなるでしょうか。
答えは前と同じで図2のようになります。

f:id:ryoryoau24:20161107155739p:plain
図2 アイテム書き換え処理(Bが「あきビン」の場合)

というわけで、名前値と保存領域が引き渡した値は値であることに変わりは無い為、
値47は保存領域に返してしまい、その保存領域内のメモリの内容を29に書き換えて
しまいます。因みにスロット47と言うのは厳密には存在せず、アイテムとは別の保存
領域となっています。アイテム保存領域で言うスロット47には矢立・ボム袋の最大
所持数、グローブの色等が保存されており、29と書き換えると、矢立の最大所持数が
20、ボム袋の最大所持数が40となり、ウロコが銀のウロコになります(弓矢所持済み
の場合)。

アイテム保存領域の空間は23まであり、ここまでは(N64版では)どのようなメモリ
となっているかがCアイテムコレクト場面を見れば分かりますが、それ以降の別の
保存領域は確認出来ず、何がどこに何bit取られているか分からない為、無暗に弄る
とゲーム内容そのものの一部を書き換え、ゲーム続行不可となりかねない為アイテム
以外の保存領域を書き換える場合は、注意が必要です。
アイテム保存領域に保存されているアイテムの場合、アイテムを書き換えるので、
例えば名前値10の「フックショット」をC→にセットし、Bの「あきビン」を
「ムシ入りビン」にすると、スロット10にあった「氷の矢」が「ムシ入りビン」に
書き換えられます。

3D版では、4つアイテムの枠がある為、そのボタンのアイテムから4つ右の値を
アイテム保存領域に渡して、名前値を書き込みます。まぁ、それだけなので、Bから
4つ右の値がIIボタンの名前値であることを理解しておけば、まぁ問題は無いで
しょう。


次に、BAの原理を解説します。

先ずBAに使うのはマスターソードの置台(時の神殿にあるアレ)です。大人時代、
子供時代になる際の処理を最初に解説します。

先ず、子供時代、大人時代とでは使えるアイテム、使えないアイテムが存在します。
その為、アイテムボタンにセットされたアイテムの保存領域は記憶させている必要が
あります。大人時代から子供時代に戻ると、先ずは大人時代のアイテムの名前値、
保存領域を取ります。そして、保存してあった子供時代のときのアイテムを再現する
為に先ずは記憶していた保存領域を大人時代の保存領域に書き込み、そして、その
中身の値を取り出し、3つ左の名前値に書き込み、アイテムに返すことで、子供時代
のアイテムを再現しています。
まぁ、ぶっちゃけ言えば、RBAの逆ですね。Reverseの逆と言っちゃなんかおかしい
気もするが。多分BAが先に発見されたからRBAはRBAとなったのでしょう。

で、BアイテムにCボタンにセットされるアイテムがセットされていると、Bアイテム
は当然ながらもアイテム保存領域のアイテムとなってしまいます。しかしBアイテム
は本来Cアイテムでは無い為、C→の名前値を保存領域の値として読み取り、その値の
保存領域内に入っている値をBアイテムに書き込むことにより、別のアイテムに変化
させてしまいます。
つまりこれも、RBAの逆ですね。因みに、記憶させているのは保存領域だけであり、
記憶されていなければ、そのまま書き込みます。よって、子供時代から大人時代に
なったとき、子供時代でのアイテムの名前値がそのまま大人時代のBアイテムの
保存領域として取り、Bアイテムの名前値に書き込まれます。

ここで重要なのが、C→にセットされているアイテムによって、所持数の値が名前値
として読み込まれ、それがBアイテムとなることです。例えばポウをC→にセットし、
ポウの名前値をその保存領域の値にすると、その保存領域の大体の中身はボムチュウ
の所持数なのでボムチュウの所持数の値が名前値としてそのまま読み込まれます。
ボムチュウの所持数が17だと、皆さんご存知の通り、名前値17のアイテム
「メガトンハンマー」がBアイテムにセットされます。


以上ですが、ここで最も注意しなければならないことがあります。それは、3D版
ではアイテム保存領域にヘビーブーツとホバーブーツが追加されたことにより、
アイテム保存領域以降の保存領域は2つずつずれていることです。
ここだけ注意して、楽しくRBA、BAをしましょう。

今回はこれくらいにしときます。


今回はこのサイトを諸に参考にしました(英語)。↓
http://www.zeldaspeedruns.com/oot/ba/reverse-bottle-adventure
http://www.zeldaspeedruns.com/oot/ba/bottle-adventure
http://www.zeldaspeedruns.com/oot/ba/item-chart