K3の住民

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

【N64ゼルダ】「モーション再生間制御禁止バグ」の原理についての考え

皆さん、こんにちは雪圀です。
今回はN64ゼルダに存在する視点を変更するアイテムを使う際後ろ歩きをしながら
2個連続で使うと制御禁止になってしまうバグについて考えを書いていこうと
思います。


まず、何故モーション再生してる間は制御禁止になるの?というところから
考えていきましょう。

先ず後ろ歩きは終えると、引きモーションのような動作をします。このとき、横歩き
が出来なくなります。
次に、視点変更系アイテム(妖精のパチンコ、ブーメラン、妖精の弓、
フックショット(ロングショット)の4つ)を使う際に、アイテム出しモーションが
再生され、その間前後左右動かせなくなります。
これが原因と言っていいでしょう。

皆さんは割込み、というのをご存知でしょうか。割込みというのは、プロセス
(プログラムの処理の流れのこと)実行中に違うプロセスを実行させるためにその
プロセスを一旦中断させ、違うプロセスが実行中になることを言います。

この割込みがバグの原因では無いか、と自分は考えています。なぜそのようなこと
を思ったのかの経緯について、詳しく解説させていただきます。

後ろ歩きを終えたとき、横に対しても完全に動かせるようになるのはモーション
の再生を終えたときです。つまり、モーションの種類などは問わない、という
わけです。だからハンマーを振るときのモーションや、横歩きのモーション、そして
立ちモーションなど、モーションであれば何でもいいわけです
そこに弓が入ってきたことで、割込みされ、弓を持つというプロセスが実行
されます。するとおそらく同じ変数でも使っているのでしょうか、制御禁止の区域が
左右から全方向に変わります。しかし、これでは弓のアイテムを持った状態が完了
したとき、それは弓を持つというプロセスを終了するので後ろ歩き終了のプロセスに
戻ります。よって、後ろ歩きが終了します。ここで、後ろ歩き→弓→フックショット
とすることで、割込みの上にさらに割込みが発生し、フックショットを持つという
プロセスが実行されます。
「・・・どうなってんのか分からん」って人に、画像を用意しましたのでそちらを
参考にしながら読んでいただけると分かりやすいと思います。

f:id:ryoryoau24:20170524221159p:plain
(図)バグの原因と考えられる割込み処理の図

「FS」はフックショットの略です(本当は「Hook Shot」ですが、めんどいんで
もうローマ字での略称でいいです)。

ところが、ここで一つ問題があります。それは、割込みが2つ同時に行えるか、に
ついてです。
おそらく、割込みルーチンと言うルーチン(処理の一塊のようなもの)は1つしか
無いので、2回連続で(プロセスの終了をしていないのに)割込みをしてしまうと、
最初の割込みが無くなるのでしょう。つまり、最初に割り込まれたプロセスは永遠
に中断されている状態となります。
後ろ歩き終了プロセスは、今その状態にいるわけです。割込み処理が終わるのを
待っている後ろ歩き終了プロセスですが、割込みルーチンが移動してしまったので
永遠に残ります。つまり、ゾンビプロセス(ずっと残っているプロセスのこと)と
化します。
よって、リンクは永遠に制御が出来なくなります。「つみです」・・・と思いきや、
そのゾンビプロセスを終了する方法が2つあります。
リンクはそのゾンビプロセスが存在している間はフックショットを持っています。
フックショット・ブーメランは特別で、持っている間もプロセスが実行されて
います(これについては確認済み)。
これも推測ですが、N64ゼルダではプロセスを全部終了させるために残っている
プロセスがあれば一つ残らずとりあえず実行させ、終了させるというつくりに
なっているのかもしれません。
つまり、割込みルーチンが消え残ってしまったゾンビプロセスでも、プロセスを
全部終了してしまえばその残ったプロセスの方に移動するのでは無いかと思われ
ます。
よって、フックショットをしまうことで、フックショットを持つ処理が終了し、
ゾンビプロセスであった後ろ歩き終了プロセスに戻るのでは無いか、と思ったわけ
です。後ろ歩き終了プロセスの終了条件はモーションの再生終了なので、
フックショットをしまった後のモーションが終了条件となります。そのときの
モーションが立ちモーション、というわけです。
しまうことで立ちモーションが終了するにつれ、プロセスは全部終了となりますが、
ここでフックショットをもう一度持つと、再度割込みが発生、フックショットを
しまうまでまた制御禁止となります。
このとき、反発力が加えられると、「スーパースライド」となります。永続方法は
アイテムを出すしまうの繰り返しです(永続アイテムについてはこちら)。
もう一つの方法ですが、横跳びやバック宙、注目状態で前転することで後ろ歩き
関連のプロセスは全部強制終了されます。つまり制御禁止が解除されます。


以上です。今回は考察でしたが、いつか解明出来るといいな、と思います。
まぁ割込みが原因なのはほぼ確定なのでそれ以降を中心に分かるまで研究出来たら
いいなと思います。

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