2022年11月8日火曜日

大往生の蜂アイテムオーバーフローバグについて

 

先日、trap15氏により怒首領蜂大往生の蜂取得点数シミュレーターが公開されました。

このシミュレーターにより、未解明であったバグ「蜂アイテムオーバーフローバグ」が解明されるに至りました。

そもそもどういうバグなのか

蜂アイテムオーバーフローバグとは簡単に言うと「最後の蜂アイテムを取得した際、本来点数が2倍されるはずなのに2倍されないことがある」という現象です。
具体的には以下の条件で道中最後の蜂アイテムを取得すると発生します。
・蜂アイテムの素点が6000点~9000点
・蜂パーフェクト(道中ノーミスで蜂アイテムを全取得)を達成する

発生例を見ていきましょう。

状況は2-2道中最後、蜂アイテム素点が7000点の時に最後の蜂アイテムを取得した時です。
画像左側が最後の蜂アイテム取得前、画像右側が取得後です。

机上計算では2635×7000×2 = 36,890,000点の点数が得られるはずですが…
画像右側の点数と画像の左側の点数の差を見てみると、
1,364,014,610 - 1,343,890,610 = 20,124,000点しか入っていないことが分かります。

このように、特定条件下での蜂取得はバグにより大幅に点数が落ちてしまいます。



こちらはシミュレータでの計算結果です。実測値と比較しても正確な結果を算出していることが分かると思います。

なお、当該バグはAC版に加えPS2版、XBOX360版でも同様に発生します。

バグの仕組み

興味が無かったら飛ばしてもOKです。
trap15氏曰く、「蜂アイテムの素点はBCD(ニ進化十進表記)で表現されているが、BCDの値を10進想定で計算してしまっていることにより結果がおかしくなっている」とのことです。



MS電卓で見てましょう。
仮に蜂アイテムの素点が8000点だったとします。
本来はこのように10進数(Decimal)で8000点として蜂パフェボーナスの2倍を掛けて16000点とするべきですが… 


実際はBCD表記での16進数(Hexa)の8000を2倍しているため0x8000×2で10000点となってしまいます。
つまり、最後の蜂アイテムの素点は16000点としなければならないところを10000点として見ており、この関係で点数に誤差が発生しているということになります。

2-3(蜂8000点)でのシミュ結果。
期待値16000点のはずが実際は10000点になっていることがわかる

なお、蜂アイテムが1000~5000点、10000点のときはBCDでも10進で計算した時と同じ結果になるので、(結果的には)誤差を免れることになります。
先ほど「このバグは蜂素点が6000~9000点の時に発生する」と書きましたが、これは言い換えると「BCD値から2倍した結果と10進値から2倍した時の結果で誤差が発生するのが6000~9000点の時になる」と言えます。

※厳密には蜂アイテム5000点は2倍すると0xA000点になるのでバグが発生しそうに見えるのですが、結果には問題無いようです。

実際の損害

「で、このバグは実際どれだけ損害があるの?」という所を説明していきます。

◆2-1(蜂素点が6000点の時)

白黒ともにほぼ実害はありません。2700HITあたりから計算に誤差が出始めるようですが、そもそもどれだけ頑張って稼いでも1300HIT台が関の山ですので、事実上オーバーフローすることはありません。良かった良かった。一安心。

◆2-2(蜂素点が7000点の時)

大問題です。
というのも、蜂アイテムが7000点の時は内部的に本来あり得ない値(0xE000)をBCD変換ルーチンに与えているため点数の計算結果が非常に不安定になり、大半のケースでオーバーフローが発生します。中でも酷いのが2615HIT~2799HITの領域です。

2614HIT
2614HITの際は60万6000点落ちで済みますが…

2615HIT

2799HIT

2615HIT~2799HITの時はオーバーフローによって約44%もの点数が差し引かれることになります。余りにも落差が酷すぎる。


2800HIT
2800HITからは120万~136万ぐらいの範囲でのオーバーフローとなり、比較的軽微な損害になります。

このことから、対策として以下の2パターンを導き出すことが出来ます。
①なんとしてでも2614HIT以内に抑える
後半5ハイパーのケツ炙りなどHIT数が上がりすぎる稼ぎを切り捨ててオーバーフローを少しでも抑制する方針です。このやり方は黒往生のDVDでも実践されている伝統的な手法です。
なお、白往生では最高効率のパターンでも2600HIT台程度となるため、原則としてこの方針を採ることになります。

②思いっきりHITを稼いで2800HIT以上を叩き出す
私が最近編み出した方法です。2-2開幕に5ハイパーを持ち込み、以後でもオーラ撃ちや細かい炙りなどのテクニックを駆使し、2800HIT以上を叩き出してオーバーフローを抑制する方法です。現在の最高値は2957HITで、問題なく回避出来ています。
パターン的な難易度は高いものの、①のやり方と比較すると800万点ほど道中点もアップします。
そのうち参考動画をYoutubeに上げようと思います。

長くなりましたが2-2は以上です。

◆2-3(蜂素点が8000点の時)

白黒ともに確実にオーバーフローします。
2-2のような回避手段はありません。諦めましょう(>´ω`< )

◆2-4(蜂素点が9000点の時)

白黒ともに確実にオーバーフローします。
2-2のような回避手段はありません。諦めましょう(>´ω`< )(>´ω`< )(>´ω`< )

おわりに

実はこのシミュレータが出来るずっとずっと前から「なんか知らんけど2周目の蜂パフェの計算式おかしくね?」という疑問は大往生勢の間でよく話されていました。

特に2-2のオーバーフローについては具体的にいつ見つかったかはわかりませんが、少なくとも2007年の黒往生DVDのブックレットで「2-2でHIT数を稼ぎすぎると何故か点数が安くなるのでHIT数を抑えている」とプレイヤーのHFDさんが証言されており、少なくとも稼働数年以内には現象の確認と対策方法が確立されていたようです。
仕組みはよく分かっていなかったとはいえ、先人の大往生スコアラー達は実測値から点数検証を重ねていってこの謎の現象に立ち向かっていったんだな…と思うと、こうしたバグにも深い想いを感じます。

また、実は9年ほど前にフォロワーの某大往生プレイヤーにより「BCDに起因するバグである」という仮説自体は立てられてまして、今回のシミュレータ公開でその仮説が正しさが裏付けられた形になります。

色んな方が色んな方法で解決に向かっていったバグですが、今回一つの決着を迎える形となりました。そう考えると少し感慨深いですね。