K3の住民

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

【N64ゼルダ】「制御禁止バグ」推論

皆さん、こんにちは。雪圀です。

今回、「制御禁止バグ」の推論をしていこうと思います。


先ず、発生条件としては、後ろ歩きをしながら弓矢とフックショットを連続で出す
ことで、歩行制御が出来なくなる(但し解除方法はある)。原理としてはこの制御
禁止バグは割込みを2回連続で行うことで発生する。これは間違いないと思います。

「結局のところ割込みって何なの?」って方に、もう少し割込みについて解説したい
と思います。
先ず処理は並列に実行出来ません。その為、今回で例えるならば後ろ歩きしながら
フックショットが使えません。
ですが、処理を一旦停止させ、別の処理に移行する方法が存在します。それが割込み
と呼ばれるもので、この割込み処理を利用すれば人から見ればあたかも並列に処理
しているように見せることが出来ます。今あなたが使っているパソコンやスマホ
にも、割込み処理は入っています。
この割込み処理を、今回の話で置き換えてみましょう。先ず後ろ歩きをします。
後ろ歩きの途中で弓矢を出します。そうすることで、後ろ歩き処理を停止し、
弓矢処理に移行します。そして、弓矢を出している途中でフックショットを
出します。そうすることで、弓矢処理を停止し、フックショット処理に移行します。
今回の割込み処理はこんな感じになりますね。
で、今回、このバグの原因として考えられるのが、後ろ歩きによる左右の制御禁止、
視点変更道具(弓矢、フックショット等)による前後の制御禁止が重なり、左右前後
全ての移動制御が禁止になってしまったということでしょう。
先ず、この割込み処理ですが、欠点が無いわけではありません。例えば、xという
変数を使ってx+=1(xの中身をx+1にする)、x+=2(xの中身をx+2にする)を
「別々の処理にして」計算してみましょう。
「x+=1」の処理ではx=3、「x+=2」の処理ではxは未知数としましょう。x+=1の結果
は4となっていればいいわけで、x+=2の結果はx+2となっていればいいわけです。
ところが、x+=1の途中で、x+=2の処理が割り込んできました。すると、x+=2はx=x+1
なので、(x+1)+2=x+3となります。つまり、本来であればx+2としたいのに、それが別の
結果になってしまうわけです
これを図で表してみると、このような感じです。

f:id:ryoryoau24:20170609203158p:plain

今回のバグは、それを対策していないので起こったバグである可能性が非常に高い
です。今回のバグでは、左右移動が後ろ歩きで禁止になり、前後移動が視点変更
アイテムで禁止になった・・・この処理、非常によく似ていると思いませんか?
以上から考えられることは、移動禁止の際に置いた何かを、後ろ歩きの際に使い、
視点変更アイテム使用の際にも使っている為、その原因の一つとなっているのだ
と思われます。
ですが、これだけではまだバグが起こりません。そこで重要なのがフックショット
と言う存在です。
弓矢は出した瞬間に射る、ということはしませんが、フックショットは出した
瞬間に撃ちます。このとき、動作が保存されて、撃っています。試しにZ/L注目
して横歩きしながらフックショットを撃ってZ/L注目を外してみれば分かります。
保存してしまったのが、左右前後の制御禁止だったのでしょう。しかもこれは
動作では無いので、横歩きのときは元に戻りますが、この場合は元に戻りません。
以上で、制御禁止バグの完成と言うわけです。


これで推論は以上です。うーん、やっぱりこの方法ではネールの愛無しで
スーパースライドが可能には出来ないかもしれませんね。3D版スーパースライド
がネールの愛無しで出来ればまだ活躍出来るかもしれないと思ってずっと研究
してたのですが・・・。
他の方法を探したほうがいいかもしれません。

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