はんまーに乾杯

メダロットSプレイ記

【メダロットS】防御時のダメージ計算式

f:id:hakamaya:20220228183832p:plain

防御時のダメージ計算式

 防御時のダメージ D は、攻撃側の成功 a 、威力 b 、攻撃スキルレベル  s_1 、防御側の耐性  c 、回避  d 、補助スキルレベル  s_2 によって与えられます。

 D=D\left(a,b,c,d,s_1,s_2\right) \tag{1}

 また、各スキルレベルは成功と威力、耐性と回避に掛かる形でのみダメージに作用します。そこで、各変数を式(2)から式(5)のように変換します。

 a'=a'\left(a,s_1\right)=a\dfrac{s_1+50}{100} \tag{2}

 b'=b'\left(b,s_1\right)=b\dfrac{s_1+50}{100} \tag{3}

 c'=c'\left(c,s_2\right)=c\dfrac{s_2+50}{100} \tag{4}

 d'=d'\left(d,s_2\right)=d\dfrac{s_2+50}{100} \tag{5}

 再定義した4つの変数を用いると、防御時のダメージ D

\begin{eqnarray}D = \left\{ \begin{array}{ll} 1.025b'-1.028\dfrac{b'c'}{b'+c'} & \left(a'\leq a_0\right) \\
0.512\left(\dfrac{b'}{b'+c'}\right)\left(a'-a_0\right)+1.025b'-1.028\dfrac{b'c'}{b'+c'} & \left(a'\gt a_0\right)\end{array}\right.\tag{6} 
\end{eqnarray}

というある成功 a_0 (以下境界成功と呼びます)と攻撃時の成功 a' との大小によって場合分けされた2通りの式で表されます。ここで a_0

a_0=\left(0.501\left(c'+d'\right)-5.7\right) \tag{7}

で与えられます。以上の式(2)から式(7)まで、あらゆる条件での防御時の平均ダメージが計算できます。計測データとの比較から、誤差は最大でも10程度だと考えています。乱数によるダメージ幅が±7.3%あること(luxさん | Twitter威力、成功のダメージ寄与とダメージ乱数幅の推定#1 - luxのメダロットブログ)を踏まえれば、実用には十二分な精度です。

 式が複雑すぎるという文句はわたしが開発に言いたいくらいですが、このまま記事を閉じるのも不親切なので、以下に解説を続けます。天下り的な説明に終始しないよう、都度実測データに基づく解析手順を併記しています。

 式の使い方は応用の章で何例か紹介しています。当記事がゲームの楽しみを深めるものとなれば幸いです。

解説

パーツステータスとスキルレベル

 はじめに、独立変数となるステータスを整理します。防御時のダメージに作用するゲーム内ステータスには成功、威力、耐性(格耐または射耐)、回避のパーツ等に設定されたもの(以下特にパーツステータスと呼びます)と、メダルのスキルレベルに大別されます。このうちスキルレベルは、成功等の各ステータスに掛かる形でのみダメージに作用します。格闘スキルを上げると格闘攻撃の与ダメージが上がる、補助スキルレベルを上げると被ダメージが下がるといった認識は、広くプレイヤーに共有されているでしょう。

 問題はその度合いで、これは式(2)から式(5)のように、スキルレベル+50倍でそれぞれ表されます。

 a'=a'\left(a,s_1\right)=a\dfrac{s_1+50}{100} \tag{2}

 b'=b'\left(b,s_1\right)=b\dfrac{s_1+50}{100} \tag{3}

 c'=c'\left(c,s_2\right)=c\dfrac{s_2+50}{100} \tag{4}

 d'=d'\left(d,s_2\right)=d\dfrac{s_2+50}{100} \tag{5}

   a' b' c' d' はそれぞれ対応するステータスとスキルレベルを落とし込んだもので、パーツステータスの成功  a 等との混同を避けるために特に区別する際は補正成功等と呼ぶことにします。この変換をあらかじめ行うことで、ダメージ式から2つ変数を減らし、式をすっきりさせることができます。

 分母の100は一種の規格化で、50+50すなわちスキルレベル50を基準とし、その何倍であるかを意味します。スキルレベル0なら50時の0.5倍、当然50なら1倍、99なら1.49倍、150なら2倍になります。この関係は充填・冷却ステータスとスキルレベルのものと一致し、すでに馴染みがあるかもしれません(まばさん | Twitter【特別編】メダロットSの充填計算式 - 瞬く一時【備忘録】)。

 規格化は変数の値や対応するパラメータがいたずらに大きくあるいは小さくなることを防ぎ、直感的理解を助けます。基準とするレベルは0でも150でも何でもよい(変動分をフィッティングパラメータに反映させるだけ)です。たとえば99に取れば、攻撃機によく使われる攻撃スキル99振りの際に、成功と威力をそのまま補正成功、威力とすることができるメリットが生まれます。今回は100で割るという式の明快さと、フラットルール(全スキルレベル50固定)の普及、攻撃スキルと補助スキルでそろえることを重視し、50を基準としました。

解析

 実はスキルレベルの解析は難しいです。なぜなら攻撃スキルレベルは成功と威力、補助スキルレベルは耐性と回避にそれぞれ同時に作用するためです。そもそも解析時は式(2)から(5)どころかスキルレベル自体がダメージに直接作用するかどうかもわかっていません。ところが、この問題をうまく切り抜ける方法が見つかり、関係式の発見に至りました。ここではまだ説明が難しいので、別途節を設けて書くことにします。

3つの項

 ダメージを表す式(6)をみると、常に2つの項を持ち、さらに一定以上の成功のとき成功を変数に取る項を加えて持っています。解説する上でこれらの項は別々に扱う方が都合が良いため、スキルの補正は各ステータスに乗せたまま、ダメージ式を分割して再定義することにします。

D\left(a',b',c',d'\right)=D_1\left(a',b',c',d'\right)+D_2\left(b'\right)+D_3\left(b',c'\right) \tag{9}

\begin{eqnarray}D_1\left(a',b',c',d'\right) = \left\{ \begin{array}{ll} 0 & \left(a'\leq a_0\right) \\
0.512\left(\dfrac{b'}{b'+c'}\right)\left(a'-a_0\right) & \left(a'\gt a_0\right)\end{array}\right.\tag{10} 
\end{eqnarray}

\displaystyle D_2\left(b'\right)=1.025b' \tag{11}

\displaystyle D_3\left(b',c'\right)=-1.028\dfrac{b'c'}{b'+c'} \tag{12}

 式(6)を構成していた3つの項がそれぞれ D_1D_2D_3 に対応していることを確認してください。それぞれに特徴的な変数にちなみ、 D_1 を成功項、 D_2 を威力項、 D_3 を耐性項と呼ぶことにします。

成功項

 3項のうち唯一成功が寄与するのがこの成功項 D_1 です。改めて式を詳しくみていきましょう。

\begin{eqnarray}D_1\left(a',b',c',d'\right) = \left\{ \begin{array}{ll} 0 & \left(a'\leq a_0\right) \\
0.512\left(\dfrac{b'}{b'+c'}\right)\left(a'-a_0\right) & \left(a'\gt a_0\right)\end{array}\right.\tag{10} 
\end{eqnarray}

 最も特徴的なのは、成功によって式が2つに場合分けされる点です。補正成功 a' が境界成功 a_0 より小さいときには、成功をいくら上げてもダメージは増えません。検証#4にてこの仕様を初めて見つけた際、これは一定以上成功を下げてもダメージが下がらなくなるという意味で最低保障のようなものだと思っていましたが、むしろ成功のダメージへの寄与を限定する防御側に有利な仕様とも受け取れます。

 その解釈を補強するように、 a_0 は一定のパラメータではなく、式(7)に従って耐性 c' と回避 d' に比例して大きくなります。

a_0=\left(0.501\left(c'+d'\right)-5.7\right) \tag{7}

 この式(7)に成功項の2つ目の特徴が現れており、それは唯一回避が効く部分であるという点です。そもそも回避ステータスが回避率やかすりダメージだけでなく、限定的とはいえ防御時のダメージにも影響すること自体、わたしは一連の検証を始めてから初めて知りました。

 続けて、 a'\gt a_0 の場合をみていきます。成功の関数とみれば、これは1次関数です。しかし、その傾きはこれまた困ったことに一定ではないことがわかります。少しわかりにくいかもしれませんが、成功の前についている \frac{b'}{b'+c'} は、 b' が増えるほど大きく、また c' が増えるほど小さくなります。すなわち、威力が高いほど成功項の寄与も増し、他方で耐性が高いほど D_1 を抑えられることになります。このように威力と耐性はあっちやこっちやでダメージの増減に関わるという、実に不可解な仕様が取られています。

解析

 式の全容が判明した今でこそ言えることですが、ダメージの調査は成功から手を付けるのが最も筋が良いです。なぜなら成功は D_1 にのみ含まれているためです。あくまで計測できるのは(乱数をはらんだ)防御時のダメージ D であり、 D_1D_2 ではありません。ここに検証の難しさがあります。式全体の構造を知らないまま、式の異なる D_1D_2D_3 を同時に見てそれらを分離するのは不可能であり、2項以上に含まれる威力、耐性、各スキルレベルを評価できるようになるのは先です。

 図1と図2をご覧ください。それぞれビーストマスター(射耐2508、回避613.2、補助スキルレベル0)とダッシュボタン(射耐3314、回避0、補助スキルレベル150)相手に、威力936で成功の異なる射撃攻撃を与え、そのダメージを横軸成功に対し散布図にしたものです。ここから実測データを交えた議論を展開していきますが、手順や統計的扱いについては過去記事の#4#3をご参照ください。今回新たに計測したもので生データを見たい場合はお声掛けください。

f:id:hakamaya:20220228124831p:plain

図1 成功1次領域と無相関領域(ビーストマスター)

f:id:hakamaya:20220228125627p:plain

図2 成功1次領域と無相関領域(ダッシュボタン)

 この2図を比較するだけでも、1次関数の傾きや適用式が変化する境界の成功が条件に応じて変化することが視覚的にはっきりします。なお、ここでは横軸は式(10)の定義に合わせて補正成功 a' で取っていますが、射撃スキルレベル99固定の標本であるため、解析時はこの処理が適当か判断できません。当時はパーツ成功 a で作業を行っています。加えて、後にダメージ一定領域のダメージが D_2+D_3 であることがわかるのですが、この段階でも成功を変数に持たない D-D_1 の存在を知ることができます。

 ここまで一直線に話を進めていますが、一連の検証は本当に困難を極めました。傾きの条件による変化や a_0 を境にした場合分けの存在はつい最近になってようやく判明したことです。今となっては間違いだらけの#1を公開したのが昨年の8月、契機となった図1ビーストマスターのデータを記録したのが年明けての1月です。

 さて、話を解析に戻します。図1、図2の2つの系列の他にも、条件を変えて同様の計測を行い、やはり成功は特定の成功以下で無相関になること、それ以上では特定の傾きを持つ1次関数を取ることがわかってきました。問題はその境界値と傾きを決定する条件の定性化ならびに定量化です。

 図3から図5はそれぞれ、アインラート(射耐962.5、回避1003.2、補助スキルレベル44)相手に3通りの威力、順に612、780、936で成功を変化させてダメージを記録したものです。

f:id:hakamaya:20220228131723p:plain

図3 威力による成功の傾きの変化(威力612)

f:id:hakamaya:20220228131810p:plain

図4 威力による成功の傾きの変化(威力780)

f:id:hakamaya:20220228131826p:plain

図5 威力による成功の傾きの変化(威力936)

 図3から図5の比較により、関数の境界成功は威力には依存せず、他方で傾きは少なくとも威力には依存することがわかりました。加えて重要なのが依存の定量的評価です。図6はこの3点に高威力の2点を追加した計測の威力対傾きのプロットですが、残念なことに最も簡単な直線関係にはないことがわかりました。直線すなわち1次関数であれば誤差を含めて一意に決めることができますが、曲線はフィッティングする関数次第でいかようにも測定点に合わせられてしまい、真の計算式から外れてしまいます。このままでは関数として十分な記述ができないため、データの追加がたくさん必要になります。すでに式(10)を見ている読者にはもうおわかりでしょうが、この成功の傾きは耐性に関しても曲線を取るのです。

f:id:hakamaya:20220228132545p:plain

図6 威力による成功の傾きの変化

 傾きの最尤値は、1次領域内の標本の最小二乗近似で求め、その誤差は、同標本の標本誤差以内を通る最大値と最小値でつけています。また、境界成功値 a_0 の最尤値は、1次領域内の最尤回帰直線が無相関領域内の各標本の平均ダメージを取るときの成功で、その最大値は1次領域内の傾き最大の回帰直線が無相関領域内の各標本の標本誤差以内のダメージの最大値を取るときの成功、その最小値は1次領域内の傾き最小の回帰直線が無相関領域内の各標本の標本誤差以内のダメージの最小値を取るときの成功です。

 依存の定量的評価ももちろん重要ですが、並行して何には依存しないかも確かめてやる作業が必要です。図7と図8はそれぞれ、ヒメダッカー(射耐380.4、回避1850.4、補助スキルレベル43)とチャージドシーズ(格耐384、回避404、補助スキルレベル43)相手に、威力600で成功の異なる射撃あるいは格闘攻撃を与え、ダメージを成功についてプロットしたものです。図7の右から4点には、luxさんが計測されたデータを使用しています。

f:id:hakamaya:20220228133533p:plain

図7 回避依存性(ヒメダッカー)

f:id:hakamaya:20220228133639p:plain

図8 回避依存性(チャージドシーズ)

 これらの比較の何がよいかというと、ヒメダッカーの射耐とチャージドシーズの格耐が近くかつ補助スキルレベルが同じかつ乖離した回避であるため、対応する射撃、格闘の同じ威力のときの成功-ダメージの挙動を見てやることで、回避によるパラメータの変化だけをあぶりだすことができます。すると見事に傾きは一致し、境界値のみずれることがわかりました。さらにはベースである D-D_1 も一致しており、ここにも回避の寄与は存在しないことが判明しました。

 こうした計測の積み重ねで、成功の傾きは威力および耐性および各スキルレベルにのみ依存することがわかりました。さらに、成功の傾きが威力について(少なくとも計測範囲内で)上に凸の増加関数であることは、図6のように耐性固定で3通り以上の威力での傾きを取ればわかります。耐性について上に凸の減少関数であることもまた同様に3通りの計測からわかります。このようにフィッティング関数に制約を与えていくものの、威力、耐性、補助スキルレベルのうち1つだけを変数とするそれぞれの解析だけでは決め手に欠きました。

 式(10)にあるように、威力変化に伴う傾きの変化率と耐性変化に伴う傾きの変化率は独立には決まりません。上記の制約に加え、威力を b_1 から b_2 に動かしたときの傾きの変化量は耐性が大きいほど小さくなり、他方で耐性を c_1 から c_2 に動かしたときの傾きの変化量もまた然りです。この事実は \left(b_1,c_1\right),\left(b_1,c_2\right),\left(b_2,c_1\right),\left(b_2,c_2\right) の4通りを取った段階でわかり、一般にこれは2変数について上に凸の関数に含まれる1つ以上の同一の項に2変数が混在していることを示唆します。そこで、(基本的に99で計測している攻撃スキルレベルはひとまず置いておき)思い切って威力と耐性、補助スキルレベルの3つを含む媒介変数を仮定して、傾きが連続的に変化しないか試していくことにしました。

 この手法のメリットは、一度のフィッティングに使えるデータの数だけでなく幅を増やせることです。複数通りに威力を固定して成功を振るという厳密な計測の約束から、攻撃機はプレイヤー側で用意するほかなく、防御機もまたストーリーや超襲来といったステージの相手機体や地形、特別ルールの設定に縛られることになります。ところが、曲線のフィッティングでは、外挿を嫌って計測データの幅を広く取りたい事情があります。傾きについて威力は正の相関、耐性は負の相関であることから、低威力かつ高耐性で左に、高威力かつ低耐性で右に幅を広げたフィッティングが可能になります。

 これは後の節で説明しますが、並行して行っていた解析から、攻撃スキルレベルが成功と威力とにスキルレベル+50つまり式(2)といった現在考えている関係であることを突き止めつつありました。そこで耐性と補助スキルレベルについてもここから類推し、式(2)から式(5)に連なる現在の補正ステータスの考え方を予測しつつありました。

 結果的にこの戦略がはまりました。媒介変数として機能する \frac{b'}{c'} を見つけ(図9)、次いで1次の媒介変数として機能する 1-\cfrac{1}{\frac{b'}{c'}+1} を見つけるに至ったのでした(図10)。後者を式変形すれば、式(10)の \frac{b'}{b'+c'} と同じものであることを確認してください。

f:id:hakamaya:20220228135712p:plain

図9 媒介変数として機能する \frac{b'}{c'} 

f:id:hakamaya:20220228140204p:plain

図10 1次の媒介変数として機能する \frac{b'}{b'+c'} 

 場合分けの境界となる a_0 は、威力に無相関かつ耐性と回避に依存することが判明したうえでの解析は難しくありません。もっとも、回避が唯一寄与し、さらには場合分けを与えるという特殊性が、これまでの解析に陰から諸々悪さをしていたわけですが。式(7)の明快さそのまま、耐性と回避の単純和で美しい直線関係が表出します(図11)。

f:id:hakamaya:20220228140603p:plain

図11  a_0 の決定

威力項と耐性項

 威力項 D_2 の定義である式(11)、および耐性項 D_3 の定義である式(12)を再掲します。

\displaystyle D_2\left(b'\right)=1.025b' \tag{11}

\displaystyle D_3\left(b',c'\right)=-1.028\dfrac{b'c'}{b'+c'} \tag{12}

 威力項は攻撃スキルレベルが式(3)に従って補正されていることにさえ留意すれば、なんてことはない、極めてシンプルな1次式です、最高ですね。

 しかし、いかに D_2 がシンプルで最高であっても、これを直接ダメージから窺うことはできません。 D_1D_3 も威力に関しての曲線であるため、たとえ威力以外の全ステータスを固定して計測したとしても、これらの和の曲がったダメージが出力されることになります。

 耐性項は、3つのダメージ項のうち常に唯一負を取る項で、いわばダメージを耐性で直接的に軽減させる役割を担っています。ここに威力 b' も含まれていますが、やや割合で効くと受け取ればよろしいです。要するに威力が大きいほど耐性によるダメージの軽減量も増えるという具合です。それならそれでおとなしく比例にしておいてくれと思ってしまいますが。

 他に気になるのが、式(11)と式(12)の先頭についているパラメータの値が近いことです。仮にこれらを同じ定数 \alpha として \alpha b' で括ってやると、

\begin{align}D_2+D_3&=\alpha b'\left(1-\dfrac{c'}{b'+c'}\right)\\
&=\alpha b'\dfrac{b'}{b'+c'}\tag{13}\end{align}

となり、いかなる低威力高耐性であってもあくまで D_2D_3 の和としては正を取ることがわかります。しかし実際の計測では(もちろん有限の威力で)ゼロダメージを記録しており、フィッティングパラメータも D_3 の方が大きいです。実用上の恩恵はほとんど無さそうなものの、この辺りのダメージを追加で探ることでフィッティング関数により強い制約を課すことができるのかもしれません。

 また、 \frac{b'}{c'} であれば、威力 b' が2倍になればダメージも2倍、耐性 c' が2倍になればダメージは1/2倍という比例、割合で効くことになります。式(13)の \frac{b'}{b'+c'}b'\gg c' で1、 b'\ll c'\frac{1}{c'} の単純な比例関係に漸近します。

解析

 成功と回避を唯一含む D_1 は求まったため、この項の寄与だけは式(9)の変形によりダメージ D から除くことができます。なお、解析の段階では威力項と耐性項に分かれていることは知りようがなく、誤解を避けるためダメージから成功項を引いた D' を新たに定義することとします。

D\left(a',b',c',d'\right)=D_1\left(a',b',c',d'\right)+D_2\left(b'\right)+D_3\left(b',c'\right) \tag{9}

D'\left(b',c'\right)=D-D_1 \tag{14}

 式(14)は大変強力な式で、 D から D' への変換を行うことで、あらゆる条件のダメージから成功と回避の寄与を除外し、威力と耐性のみからなる関数として解析することができます。

  D' が成功だけでなく回避に依存しないことは、図7、図8のベースの比較で確認したことを思い出してください。実際、成功と威力固定で耐性と回避を変化させた#3のデータでは、補正耐性に対してダメージが連続的に変化する様が確認できます(図12)。

f:id:hakamaya:20220228141358p:plain

図12 連続的に変化する D' 

 ここで補正耐性と簡単に書きましたが、実は図12のデータは耐性と補助スキルレベルの関係を確認するのに適しています。スキルレベルの解析が難しい理由として、耐性と回避に同時に作用してしまうことを挙げていました。ところが、 D' は耐性のみに依存し、回避には依存しません。したがって、耐性に掛かる影響のみを知ることができます。

 同様に、攻撃スキルレベルについても D' の解析が有効です。成功依存性が無いため、威力に掛かる影響のみを知ることができます。ただし、成功依存性が無いという条件のみなら、 a'\lt a_0D_1=0 のときの D も満足します。より前の段階で調べたのはこちらの方で、たとえばダッシュボタン(射耐3314、回避0、補助スキルレベル150)であれば a_0=3315 という非常に広い成功無相関領域を持ちます。図13のように式(3)の補正威力で並べ、ダメージ D\left(=D'\right) が連続的に変化することを確認したときが、式(2)から式(5)の一律な補正方法を予測した瞬間だったのでした。とはいえ、連続性だけでは証拠として弱いと突っ込まれてしまうと、確かにそのとおりです。ただ、こうした論理の脆弱性をフィッティングから排除するのは困難で、最終的によく合うかどうかで良し悪しを判断してもらうしかないと思っています(そのために長々と解析の節を書いています)。

f:id:hakamaya:20220228142927p:plain

図13  a'\lt a_0 領域での威力と攻撃スキルレベル

 さて、スキルレベル補正の話が片付いたところで、耐性固定で取った D' を威力に対してプロットしたものが図14です。

f:id:hakamaya:20220228150553p:plain

図14 威力と耐性の関数 D' 

 図中の凡例に書いているのは防御機体の略記および補正耐性です。概観として、耐性の高いものから低いものまで威力がゼロに近づくと D' もゼロに近づきます(最低ダメージおよび D' がゼロであることも確認)。しかし、威力ゼロ近傍での傾きは耐性によって大きく異なります。耐性が低いものほど低威力でも傾きが大きく、威力の増加に伴ってわずかに傾きを増加させて1.03程度( D ではなく D' の傾きであることに注意、 D_1 が威力の増加関数であるため、 D の傾きより小さくなる)に落ち着きます。対して高耐性ほど低威力側での傾きが寝ており、大きく曲がりながら D' が増加します。

 いろいろと策を尽くした結果、最終的に適当なフィッティング関数の決定の第一のヒントとなったのが、低耐性のものほど曲がりが小さく、1次関数的である性質です。ここから、 D' は威力の1次項と耐性による負の項の和によって構成されているのではないかという、現在の D_2D_3 の原型に行き着きました。

 ものは試しで D'-1.03b' を威力(図15)、耐性(図16)に対して取ってみます。耐性固定のデータだけでなく図12で使用した威力固定のデータも同時にプロットしています。

f:id:hakamaya:20220228151444p:plain

図15 耐性項と威力

f:id:hakamaya:20220228151518p:plain

図16 耐性項と耐性

 図15と図16とを見比べると、グラフの形状が類似していると感じてもらえるでしょうか。こうした威力と耐性の対称性などもヒントに、成功項の傾きの解析でうまくいった媒介変数の仮定から攻めていき、1次の媒介変数として機能する \frac{b'c'}{b'+c'} の発見に至りました(図17)。さらにはこのことから、威力の1次項と耐性による軽減項の分離に正当性がもたらされました。

f:id:hakamaya:20220228151959p:plain

図17 1次の媒介変数として機能する \frac{b'c'}{b'+c'} 

 余談ですが、 D'\left(=D_2+D_3\right) を威力 b'微分すると、 \frac{1}{\left(b'+\mathrm{C}\right)^2} の1次式になります。#4にて D の差分商が \frac{1}{b+\mathrm{C}} の1次式にみえると書きましたが、当たらずとも遠からずだったわけです。

 ここからパラメータの微調整を行い、最終的なダメージ計算式の式(6)が完成しました。フィッティングに用いた全223個のデータ( 304.0\leq a'\leq6273.3,87.6\leq b'\leq12832.3,118.4\leq c'\leq6628,0\leq d'\leq5349.6,0\leq s_1\leq150,0\leq s_2\leq150 )について、実測ダメージに対し実測ダメージと予測ダメージの差を図18にプロットしました。

f:id:hakamaya:20220228154039p:plain

図18 フィッティングの評価

 ここで、誤差棒は実測ダメージの標本誤差です。実測と予測の差について、223点のうち196点(88%)が誤差範囲内、217点(97%)が誤差+2以内、最も外れる物でも誤差+7以内に収まりました。成功(図19)、威力(図20)、耐性(図21)、回避(図22)、攻撃スキルレベル(図23)、補助スキルレベル(図24)の6軸いずれも無相関で、あらゆる条件で常に良い予測を返すといえます。

f:id:hakamaya:20220228153811p:plain

図19 フィッティングの評価(成功)

f:id:hakamaya:20220228153217p:plain

図20 フィッティングの評価(威力)

f:id:hakamaya:20220228153624p:plain

図21 フィッティングの評価(耐性)

f:id:hakamaya:20220228153409p:plain

図22  フィッティングの評価(回避)

f:id:hakamaya:20220228154244p:plain

図23 フィッティングの評価(攻撃スキルレベル)

f:id:hakamaya:20220228154453p:plain

図24 フィッティングの評価(補助スキルレベル)

応用

 一般式こそこれ以上ない応用であり、利用の仕方は無限に存在します。スタンダードに仮想敵相手に好きな攻撃パーツの数値を入力してダメージを出力しても良いですが、個人的におすすめするのはグラフの作成およびそれによる比較です。

 例を挙げます。メダチェンジを除く戦車の中では最速ながら最低の射耐値を持つ脚部であるラストオーダー(ホドヨイシモフリ)と、脚部特性を含め全ステータス優秀と名高い浮遊脚部フィランソロピー(アルテミス)では、射撃攻撃の被ダメージがどれくらい違うのでしょうか。戦車のダメージ30%カットが優るのか、あるいは素の耐性値の高さには及ばないのかという比較です。

 双方の地形相性をS(したがってそれぞれの射耐が705.6、1605.4)、補助スキルレベルを51とし、攻撃側の成功を1100、射撃スキルレベルを99として、威力を横軸に取った予測ダメージのグラフを作成しました(図25)。

f:id:hakamaya:20220228154802p:plain

図25 ラストオーダーとフィランソロピー

 2次元散布図の良いところは、ほどよい情報量を含むところです。xとyの一対一対応は人間にとって理解しやすいです。そこに質の良い関数の連続性が加わることで、ただ2つの数字を見比べるよりずっと多くの情報を読み取ることができます。

 図25を見ると、低威力側ではフィランソロピーの方が堅いものの、威力2400辺りでダメージが逆転することがわかります。これは耐性が高いほどよく曲がるという計算式の特性によるもので、一方常に一定割合のダメージカットという別の原理でダメージの小さいラストオーダーは傾きの変化が小さく、高威力側ほどその恩恵を受けます。これはエルーシブなどダメージカットの脚部特性持ちについても同様のことがいえます。実用上威力1000以下を見ても仕方ないなどと、状況や目的に応じて横軸縦軸を適当な範囲とスケールに変えてやることも大切です。

 また別の例として、補助スキルレベルの違いによるダメージの差を見てみます。成功1100、射撃スキルレベル99の射撃攻撃に対し、再び大人気のフィランソロピーで、スキルレベルを0、50、100、150としたときの予測ダメージは図26のようになります。

f:id:hakamaya:20220228155001p:plain

図26 補助スキルレベルの影響(パーツ成功1100)

 4本の線の比較で、0から50に上げたときの減少量がとりわけ目につきます。これは実は成功項 D_1 が大きく影響しています。 D_1 がゼロか否かを決める a_0 というパラメータがありましたが、これは防御機の耐性と回避に依存するのでした。補助スキルレベル0、50、100、150の a_0 は順に815.5、1636.8、2458.0、3279.3と計算されます。ここで、パーツ成功1100、攻撃スキルレベル99での補正成功 a' は1639です。したがってスキルレベル0のときだけ a'\gt a_0 となり、成功項 D_1 がゼロにならずに他と比べて余分にダメージを受けてしまうのです。

 実際に、すべて a'\gt a_0 となる成功500に設定を変えて取ると、スキルレベル0と50の差は他とあまり変わらないように見えます(図27)。

f:id:hakamaya:20220228155057p:plain

図27 補助スキルレベルの影響(パーツ成功500)

 以上の2例をみても、防御時のダメージは直感的に理解しづらいものだと思います。威力を2倍にしたらダメージも倍になる、耐性を2倍にしたらダメージは半分になるという式であれば面倒なグラフ作成など不要なのですが。限定的な状況の数字がどうこうの他に、仕様の大枠を把握しておくというのは楽しく、これをもってその助けになるのではないかと期待します。

 図25、26、27の作成は図28のようなエクセルシートで行いました。

f:id:hakamaya:20220228160059p:plain

図28 エクセルを用いたグラフ作成

 A列にパラメータの数値を直打ちしておきます。次に、C7からC10、C12セルに下記の数式を入力し、C12について下向きに、その後C列の各数式セルについて右向きにオートフィルを行います。あとは1から6行目に好きなステータスを入力すれば、B列の威力に対応したダメージが当該列に並びます。

 入力するステータスというのはあらかじめ式(15)の実行ステータス(ダメージ計算式で定義するところのパーツステータス)の計算式に従って算出したものを用いてください(威力検証)。メダロッターやメダルに応じて自動計算するプログラムを書いてもよいでしょうが、参照データが膨大かつ日々増えていくためわたしはやる気がしません。

実行ステータス=((パーツ+チップ+メダロッター)*(1+乗算効果a+乗算効果b+...)+性格ボーナス+ランク効果+脚部特性)*地形相性 (15)

 ダメージカットはカット量をそのまま(戦車なら0.3)を入力してください。特にないものは0、もしくは空欄で構いません。現在2種類以上のダメージカットが同時に発動する状況として、戦車、脚部特性(フォートレス、チャーム等)、MFインプレグナブルのうち2つ以上が重なる場合が考えられます。このうち戦車(30%)とフォートレスないしチャーム(30%)の重ね掛けについては調査済みで、加算の60%減ではなく乗算の51%減になります。したがって当シートでは0.51と6行目に入力すればよいです。

 最後に、シートでは横軸の威力は補正威力ではなくパーツ威力であることに注意してください。この辺りも含めてご自分で使いやすいよう自由にアレンジを加えて活用してもらえるとうれしいです。

C7
=C$1*(C$2+50)/100

C8
=C$3*(C$5+50)/100

C9
=C$4*(C$5+50)/100

C10
=$A$2*(C$8+C$9)+$A$3

C12
=(IF(C$7>C$10,$A$4*$B12*(C$2+50)/100/($B12*(C$2+50)/100+C$8)*(C$7-C$10),0)+$A$5*$B12*(C$2+50)/100+$A$6*$B12*(C$2+50)/100*C$8/($B12*(C$2+50)/100+C$8))*(1-C$6)

おわりに

 状況を選ばないダメージ計算の一般式の完成、計画から8ヶ月を経てこの日を迎えることができ感無量です。とにかく大変で楽しいものでした。

 日々モチベーションを与えてくださったメダロッターの皆様には感謝しています。特にluxさんには統計的な乱数排除方法の考案にはじまり、解析を行ううえで大変力をいただきました。今回のフィッティングでも攻撃スキルレベル99以外のデータ46個のうち40個はluxさん記録のもので、これら無しに式の完成はありませんでした。ありがとうございました。

 検証の今後については、少しゆっくりしたいと思っています。かすりはともかくヒット(防御無視)やクリティカルのダメージは、ゴーストやアサッシン、フリーズ、トルネードといった戦略で計算式がほしいものですが、防御シール等を使うにしても計測が大変そうです。全くの未知だったこれまでと違い、ある程度防御時の立式が流用できるであろうことも、個人的には少し好奇心が削がれます。攻撃結果比率も含めたダメージ期待値みたいなものが最終的に作れたら面白いです。新たな検証プレイヤーの登場を待っています。