編集部イチオシ

【スマブラSP】しずえさん無限アシストフィギュアバグを考察してみた

なかなかアツいバグが発見されたので発生原理を推察してみました。
31
AiNI @aini_bellwood

しずえさん無限アシストフィギュアバグについて考察する。 #スマブラSP #SmashBrosSP しずえさん無限アシストフィギュアバグは、2人のしずえさんが1つのアシストフィギュアに同時に釣り針をひっかけた際に起こるバグ。アシストフィギュアを手にした方のしずえさんがアシストフィギュアを無限に使う。

2018-12-19 01:12:11
AiNI @aini_bellwood

おそらくこれはアイテムの使用フラグに関するバグだ。 「アシストフィギュアを使用しても消滅しない」という挙動がそれを物語っている。 詳しく推察してみよう。具体的には「Aボタンを押した後、実際にアイテムを使用するまで」の挙動だ。

2018-12-19 01:12:11
AiNI @aini_bellwood

スマブラでは実際に効果が現れるまでにダメージを受けたりするとアイテム使用を中断するケースがある。スペシャルフラッグなどがわかりやすい。 アシストフィギュアも、ケースを掲げるまでの間は厳密にはアイテムをまだ使用していない状態になる(はず)。

2018-12-19 01:12:11
AiNI @aini_bellwood

つまり、アイテムを使用したタイミングではアイテムはまだ消滅しておらず、消滅するのはフィギュアを掲げた瞬間ということだ。 しかしバグが発生すると、フィギュアが現れてもケースは消滅しない。しずえさんは再びケースを掲げる…。

2018-12-19 01:12:12
AiNI @aini_bellwood

なぜアイテムが消滅しないのか?これはおそらく、アイテム所有権に関わる問題だろう。アイテム所有権というのは、オンラインゲームではしばしば必要になる制御だ。 これがオフラインのゲームであれば、単に「アイテムを所持する」でいいのだが、複数の筐体で遊ぶゲームの場合はこの概念が必要になる。

2018-12-19 01:12:12
AiNI @aini_bellwood

どういうことかというと、通信ラグに対応するためである。 マルチプレイ中、プレイヤーが2人いる状態で同時に1つのアイテムを拾おうとしたとき。相手は棒立ちなので自分がアイテムを拾うのだが、少し遅れて相手からも「自分がアイテムを拾った」という通知が来る。

2018-12-19 01:12:12
AiNI @aini_bellwood

どちらの画面でも、自分がアイテムを拾ったとき、相手は棒立ちの状態なのだ。では、どちらにアイテムを与えれば良いのか?

2018-12-19 01:12:12
AiNI @aini_bellwood

実際にはどちらが早かったのかは誰にもわからないので、どちらかからアイテムを取り上げることはできない。 ひょっとすると既にそのアイテムは使われているかもしれない(1つのアイテムが2回使用できてしまう!)

2018-12-19 01:12:12
AiNI @aini_bellwood

これを防ぐため、アイテムの所有者はいずれか1つの筐体が決定する(この筐体は俗にホストなどと呼ばれる)。 プレイヤー2人が同時にアイテムを拾った際、どちらもホストに対しアイテムを拾った通知を送る。 ホストは通知を受け取り、どちらか早い方に受理通知を送る。

2018-12-19 01:12:13
AiNI @aini_bellwood

受理通知を受け取った方はアイテムを拾った扱いになり、受け取らなかった方はすんでのところで拾われてしまった扱いになる。 (実際には2人に対して「Aさんが拾ったよ通知」ないし「Bさんが拾ったよ通知」が届く。こうしないと拾えなかった方はいつまで経っても拾えたかどうかがわからないため)

2018-12-19 01:12:13
AiNI @aini_bellwood

(なおこの受理通知を受け取るまでの間、どちらのプレイヤーもアイテムを所持していることになるので、その間はアイテムを使用できないようにする措置が必要になる。具体的にはゲームを一時的にポーズ状態にするとか)

2018-12-19 01:12:13
AiNI @aini_bellwood

ここまでの推察でピンときた人もいるかもしれない。バグ発生時、しずえさんが掲げるアシストフィギュアにもう一方のしずえさんの釣り針がかかっている!つまり、プレイヤー2人が同時に同じアイテムを拾おうとした場合と同じ状況なのではないか?

2018-12-19 01:12:13
AiNI @aini_bellwood

だが少し待ってほしい。しずえさんのつりざおはもう少し複雑な処理を行っている。釣り針にアイテムを引っ掛けてから、自分のもとに釣り針を引き寄せることで、やっと拾った扱いになるのだ。

2018-12-19 01:12:14
AiNI @aini_bellwood

つまり、 1.Bボタンを押し、つりざおを使用する 2.釣り針がアイテムに触れる 3.釣り針を戻す 4.釣り針が全て戻るとアイテムを拾った扱いになる という流れ。 通常はAボタンを押した時点で拾った扱いになる。

2018-12-19 01:12:14
AiNI @aini_bellwood

2人のしずえさんが同時に同じアイテムを釣ろうとすると、おそらくこれが同時に起こるのだ。 つまり、 1.しずえさんAの釣り針がアイテムに触れる 2.しずえさんBの釣り針がアイテムに触れる 3.しずえさんAが釣り針を戻す 4.しずえさんBが釣り針を戻す…という感じ。

2018-12-19 01:12:14
AiNI @aini_bellwood

実際の挙動を見ると、 1.しずえさんAの釣り針がアイテムに触れる 2.しずえさんAが釣り針を戻す 3.しずえさんBの釣り針がアイテムに触れる 4.しずえさんAがアイテムを取得する 5.しずえさんBが釣り針を戻す…という感じっぽい。

2018-12-19 01:12:14
AiNI @aini_bellwood

おそらくこの処理5、しずえさんBが釣り針を戻す際に釣り針が外れ、しずえさんBは所有権を失っているはずだ。だがひょっとすると、ここで所有権をしずえさんAに戻す処理がないのかもしれない。だとすればそれがバグの原因だろう。

2018-12-19 01:12:14
AiNI @aini_bellwood

アイテム所有権とアイテムが消滅しなくなる挙動に一体何の関係があるのか?それは、アイテムを消滅させられるのはアイテムの所有者だけである、とすることが多いからだ。

2018-12-19 01:12:15
AiNI @aini_bellwood

1つのアイテムを同時に所有できるのは1人だけだ。であれば、そのアイテムに対して「アイテムを使ったのでこのアイテムは消滅しましたよ」という通知もまた、その所有者でなければ送れない。 所持したはずのアイテムが急に消えたりしては困るからだ。

2018-12-19 01:12:15
AiNI @aini_bellwood

つまり…実際にアイテムを所持しているのはしずえさんAだが、しずえさんBが所有権を持っている。しずえさんAからホストに対し消滅通知が送られるが、ホストはこの消滅通知を受理せず、アイテムが消えないのではないか?

2018-12-19 01:12:15
AiNI @aini_bellwood

使用したアイテムが消滅しなかった場合に何が起こるかはわからないのだが、少なくとも、再びアイテムを使用できてしまうことは間違いないようだ。さらに、アイテム使用コマンドがリセットされないなら、最短で無限にアイテムを使用し続けることになる。まさに確認された現象そのものだ!

2018-12-19 01:12:15
AiNI @aini_bellwood

だがそれなら、しずえさんの釣り針以外ではこのバグが発生しないのはなぜだ?トレーニングでも発生するというのも不思議だ。所有権に関する問題はマルチプレイでしか発生し得ないのでは?

2018-12-19 01:12:16
AiNI @aini_bellwood

後者の疑問については、おそらく実装上の理由によるものだろう。たしかにトレーニングなどのオフラインでのプレイならばアイテム所有権など気にする必要はないが、わざわざ処理を分離する必要もない。

2018-12-19 01:12:16
AiNI @aini_bellwood

相手の所有権に関する通知を待つ必要などはないのだが、仕組み自体はオンラインのものをそのまま流用してしまって問題ないのだ。つりざおのようにオフラインでも所有権の取り合いになるケースもうまく処理できるはずだし(今回の場合は、できていなかったのだが)。

2018-12-19 01:12:16
AiNI @aini_bellwood

前者の疑問についてはしずえさんの釣り針を使ったアイテム使用が通常のアイテム使用とは異なる処理であることが関係していると思われる。つまり、通常のアイテム取得ではとっくに修正されたバグが、特殊なアイテム取得処理を行うしずえさんのつりざおでのみ生き残っていたのではないだろうか。

2018-12-19 01:12:16