K3の住民

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

【N64系統ゼルダ】色々な技の補足

皆さんどうも、雪圀です。
今回は色々な技の原理が分かりづらかった人の為に補足を書いていこうと思います。
但し、常識も同然なことは紹介するつもりはありません。



先ず、「ポインタ変え」からの補足ですね。
「ポインタ」は「アドレス」と同じようなもんだ、と書きましたが、では、実際に
アドレスとは何か?について補足します。

先ず、ゲームのプログラムの中にはメモリ、と言う物があり、そのメモリの中には
様々な領域が存在します。マップポインタは厳密に言えば「ROM領域」の中に入る
領域ですが、この記事ではマップポインタが複数存在する領域を「マップ領域」と
呼ばせていただきます。
先ずマップ領域のメモリアドレス値を読み込み、RAM領域に呼び出します(RAMとは
書き換える為のものと思ってください)。RAM領域でメモリアドレス値を書き換え
ます。これがマップの演算処理、ムービーの演算処理の原理ですね(本当はもっと
段階があるんですが、ややこしくなると思うので、省略)。で、ROM領域で(ROMは
読み込む為のものと思ってください)値を読み込むことで、リンクがマップ移動を
しているわけですね。
因みにゲーム中では当たり前のようにこのような処理が行われますので、大体の
処理を用いた技の説明は全てこの原理を用いているということを知っておいて
ください(例えば演算するだけでなく、演算を呼び出す等)。

それではアドレスとは?簡単に言え変えれば、住所のようなもんですね。例えば、
マリオの家の住所、リンクの家の住所があったとしましょう。ここで、家の見た目
が全く同じで、住所の番号が無いとしたら、どうなるでしょうか?
マリオがリンクの家にいたり、リンクがマリオの家にいたり、とにかくごっちゃに
なりますよね。それはメモリにおいても一緒で、アドレスと言うものが無ければ、
色々なデータがごっちゃになってしまいます。だからアドレスは必要なのです。

「ポインタ」は「アドレス」だと言う説明をしましたが、コンピュータにおいて
ポインタは「指し示す」と言う意味があります。住所だって「指し示す」ことが
出来ますので(例えば住所の番号を見たら「これ、あいつの家だぜ」と確実に言える
し、犯人が住んでる家も住所さえあれば特定出来ますよね)、意味合い的には一緒
でしょ?って話です。


次に、RBAの準備等についての補足をします。
RBAの説明ではビン系アイテムをセットしたボタン(Cアイテムと呼ぶ)とアイテム化
したBボタン(Bアイテムと呼ぶ)をあることをして素早くCアイテム→Bアイテムと
することにより、Bのアイテムがビン系アイテムに変化すると言うことについて
ですが、何故そうなるのか分からないと思った人の為に、原理を一応説明しとき
ます。

先ずは、スタックの領域(「スタック領域」と言う)が存在する、と言うことと、
スタック領域は「RAM領域」に含まれていると言うことを知っておいてください。
ではスタックとは何かについて説明します。

スタックとは、データ構造の一種で、探索アルゴリズム等に使われたりするもの
です。まぁ、考え方の一つ、って感じで覚えておけば良いでしょう。
スタックと言うのはデータを「積み重ねること」が出来、そして最後に積んだもの
を最初に取り出す(これを「LIFO(Last In First Out)」と言う、また最初
に積んだものを最後に取り出す、と考えることも出来るので、「FILO(First In
Last Out)」とも言う)ことで、データを順番に返していきます。積み重ねを
「Push」と言い、取り出しを「Pop」と言います。
具体的にはどういうものなのか、例えばxと言う変数があったとしてそれをPush
します。そしてyと言う変数をPushします。最後にzと言う変数をPushすること
で変数が3つ積み重なったことが分かります。で、スタックは「LIFO」(「FILO」)
方式なので、Popをすると、最後にPushした変数zが取り出されます。以上の例を
図1に示します。

f:id:ryoryoau24:20161116145551p:plain
図1 スタックのイメージ

まぁ、大体こんなイメージですね。で、何故こいつがBアイテムをあきビンにする
のと関係あるの?というのを解説していきます。

先ず、もし仮にC←が「さかな入りビン」で、Bがデクの棒(0)であったとすると、
最初に「さかな入りビン」からさかなを出すことで、「さかな入りビン」から
「あきビン」に変化しますね。このとき、「さかな入りビン」の名前値がPush
されており、Popして名前値を書き換えることで、「さかな入りビン」から
「あきビン」に変化させています。
で、「あきビン」にさかなを入れることで、「あきビン」から「さかな入りビン」
に変化、その方法も前と同じようになっています。
ですが、ここで、さかな入りビンをリンクが持ったままの状態になっています。
このとき、「さかな入りビン」の名前値はPushされたままになっており、C←を
押せばすぐにそのアイテムの名前値を書き換えられるようになっています。
ここで、C←と一緒にBが押されると、どうなるでしょうか?
デクの棒の名前値がPushされ、そしてデクの棒の名前値がPopされ、「デクの棒」
の名前値を「あきビン」に書き換えてしまうのです。
イメージ的にはこんな感じです(図2)。

f:id:ryoryoau24:20161116154745p:plain
図2 スタックによるBボタンのあきビン化

因みにこれは「さかな入りビン」の名前値がスタック領域にPushされている状態
であり、同時にPush出来るアイテムのみ可能です。例えば「デクの実」は「さかな
入りビン」とともに名前値をPushをすることが可能です。このゲーム内で言えば、
ビン系アイテムを持ったまま使えるアイテムをビン系アイテムに変えることが可能
(但しブーツ系アイテムはエリア移動、またはアイテムを変えようとするまでしか
あきビン化されない)です。
同時に使えると言っても、デクの棒は持ち変えるアイテムなので、当然同時にPush
出来ませんね。そこで、所持数を0にすることで、デクの棒を使ってもビン系
アイテムをしまわないように出来るのです。バクダンや、ボムチュウも同様です。

このバグは「スタック」では無く、「キュー」と言うデータ構造を使えば、起こす
ことは出来なかったのかもしれませんね(「キュー」は「FIFO(First In First Out)」
なのでこれによる対策は十分可能。後はググってください)。



以上です。「いや、これ常識だろ」と思う人もいるかもしれませんが、この辺は
プログラムの世界に入っていない人、特に文系等は(文系でも出来る人はいる
かもしれませんが)知らない人の方が多いと思いますので、今回はそれを知らない
人たちのための補足です。それ以外はほとんどの人が知ってる知識であるはず
なので、教えることは無いでしょう。まぁ、僕もこの世界にはそこまで浸って
いないので、この記事に間違いもあるかもしれませんが。

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