物理攻撃ダメージ計算式

物理攻撃のダメージ計算

以下の記事はBigBang以前のものです。
U&I以降のレベル補正に関する記事はこちらです。

物理攻撃のダメージ計算は以下のようになっていると推定されます。

通常攻撃の計算式
D = (攻撃力)×(レベル補正)−(防御補正)
スキルの計算式
Ds = D×(スキル倍率)
属性チャージ状態・コンボカウント充填状態の計算式
D' = (攻撃力)×(チャージ補正)×(レベル補正)×(属性相性補正)−(防御補正)
D's = D'×(スキル倍率)×(コンボ補正)
レベル補正
(100−(敵とのレベル差))÷100
防御補正
(敵防御力)×(0.5〜0.6の範囲の乱数)
(敵防御力は2000が上限、それを超えても2000で固定 →注1

「攻撃力」は、ステータス上の攻撃力(下図)です。(※注2
攻撃力 1382〜2450

「敵とのレベル差」は、(敵のレベル)−(自分のレベル)で計算されます。
自分の方がレベルが高い場合は0とします。

注1
メイポイベント様より。(→該当記事:2007年05月15日(火) 23:19:47のコメント参照)
注2
特定の場合に、表示上の攻撃力と異なることがあります。
斧・鈍器・鉾・槍を装備して攻撃した場合
これらの武器は振りモーションと突きモーションで攻撃力の計算式が違います。
攻撃のたびに振りor突きの判定が入り(一部モーション固定のスキルを除く)、
それぞれのモーションに応じて攻撃力が計算されます。
手裏剣や矢の残量がスキルに必要な数に足りない場合

手裏剣や矢は1つでも残っていれば、それで攻撃した場合の攻撃力が表示されますが、
複数の手裏剣や矢を消費するスキルの場合、実際に使ったものを元にして計算されています。

左下の図は残り1の土手裏剣(攻撃+23)を先頭にした場合、
右下は残り700の水手裏剣(攻撃+10)を先頭にした場合の攻撃力です。
土手裏剣残り1が先頭 攻撃力377〜676 水手裏剣残り700が先頭 攻撃力314〜563
左上のような状態で、手裏剣2枚を消費するラッキーセブンを使うと、
土手裏剣残り1が先頭 水手裏剣を2枚消費 攻撃力377〜676
表示上の攻撃力は土手裏剣のもので、水手裏剣が2枚消費されます。
この場合でも、実際のダメージは消費した手裏剣、つまり水手裏剣を元に計算されています。

攻撃補正のある矢を持った状態でソウルアローを使う場合
攻撃補正のある矢を持っていると、ステータス画面ではその攻撃力を元に計算されていますが、
ソウルアローを使うと攻撃力0の矢を使った、として実際のダメージは計算されます。
ラッキーセブン・トリプルスローの場合
これらのスキルは、LUKに強い影響を受ける特殊な計算式が使われます。
(→参考:ラッキーセブン計算式

検証

以下の検証の前提として、
「自分のレベルより敵のレベルが低い場合でもダメージは増えない」
「敵の防御力が0のとき、通常攻撃のダメージはステータスの攻撃力の範囲内」
ということを用いました。
これについて個別の検証はしていませんが、
デンデン(防御0)に通常攻撃をした場合、自分のレベルがいくら高くても、
ステータス上の攻撃力を外れたダメージが出ることがないことから推定できます。

検証1:防御力の影響

以前行ったスキル倍率とダメージ減少の検証データを再掲します。

検証ステータス
攻撃対象:アイアンボア(防御350)
ストレイフLv30通常時(倍率100%)クリティカル時(倍率200%)
観測値防御無視理論値観測値防御無視理論値
最小57250193128500372
最大264444180534888354
平均150.47347196.53311.88694382.12
計測数11891
アローレインLv28通常時(倍率158%)クリティカル時(倍率258%)
観測値防御無視理論値観測値防御無視理論値
最小83395312129645516
最大3967013056431145502
平均239.65548.26308.61394.06895.26501.20
計測数149118

この検証で(ダメージ)=(攻撃力−敵防御による影響)×(スキル倍率)であることを示しました。
このとき、敵防御によるダメージ減少量の平均は、

(196.53×118+382.12÷200%×91+308.61×149÷158%+501.20×118÷258%)
÷(118+91+149+118)
=194.54

になります。
これは、アイアンボアの防御力350の約0.556倍です。

ここで、上のデータにおいて、どれも

(最小ダメージが出たときのダメージ損失)>(最大ダメージが出たときのダメージ損失)

になっています。
観測されたダメージより小さい/大きい数値が正確な最小/最大ダメージであることも考えられますが、
その場合でも

(正確な最小値)<(観測最小値)
⇔(理論最小値)−(正確な最小値)>(理論最小値)−(観測最小値)=(上式左辺)
(正確な最大値)>(観測最小値)
⇔(理論最大値)−(正確な最大値)<(理論最大値)−(観測最大値)=(上式右辺)

となるので、やっぱり

(最小ダメージが出たときのダメージ損失)>(最大ダメージが出たときのダメージ損失)

は変わりません。

このぶれ幅を調べることと、ダメージ減少量が防御力に比例することを確かめることを目的とし、
次の観測を行いました。

攻撃力96〜146
・攻撃力:96〜146
・装備:剣(種別:片手剣)
・攻撃対象:ブロックパス(防御100)

最大値・最小値のどちらかが5回観測できるまで通常攻撃を続けました。

通常攻撃最小最大
観測値3696
防御無視時の攻撃力との差6050
観測回数15

防御力による減少量に50〜60の幅があるのが確認できました。
また、これらの中央値の55をブロックパスの防御100で割った値0.55が、
前述の検証で出た値に近いため、ダメージ減少量が防御力に比例すると推定されます。

したがって、(レベル差がない場合の防御補正)=(敵防御力)×(0.50〜0.60)と推定されます。

検証2:レベル補正の影響

アサルターの性能について実験していたところ、たまたま確認できたものです。
以下、確認に至る流れを載せておきます。

まず、Lv補正のない状態で、アサルターが防御力の影響を受けないことを調べました。

攻撃力162〜288
・Lv:70 ・攻撃力:162〜288
・装備:フルーツダガー
・スキル:アサルターLv1(210%)
・攻撃対象:アイアンボア(Lv45:防御350)

これで196回分のデータをとりました。

アサルターLv1最小最大平均
観測ダメージ340599469.50
防御無視時期待値340604472
052.50

アサルターが防御を無視することが確認できました。

次に、レベル差のある敵を相手に、アサルターを撃ってみました。

攻撃力162〜288
・Lv:70 ・攻撃力:162〜288
・装備:フルーツダガー
・スキル:アサルターLv1(210%)
・攻撃対象:上忍(Lv80:防御610)
アサルターvs上忍
・ウェンディゴとダークペペ(ウェンペペ)(Lv82:防御700)
アサルターvsウェンディゴとダークペペ
・デスマリオネット(Lv85:防御700)
アサルターvsデスマリオネット
・ファイアブル(Lv90:防御835)
アサルターvsファイアブル
・忍頭(Lv100:防御1020)
アサルターvs忍頭

それぞれ100回程度データを取りました。

アサルターLv1 vs 上忍(Lv差10)最小最大平均
観測ダメージ308544426
防御無視時期待値340604472
観測値÷期待値0.90590.90070.9025
アサルターLv1 vs ウェンペペ(Lv差12)最小最大平均
観測ダメージ300532416
防御無視時期待値340604472
観測値÷期待値0.88240.88080.8813
アサルターLv1 vs デスマリオネット(Lv差15)最小最大平均
観測ダメージ290514402
防御無視時期待値340604472
観測値÷期待値0.85290.85100.8517
アサルターLv1 vs ファイアブル(Lv差20)最小最大平均
観測ダメージ273483378
防御無視時期待値340604472
観測値÷期待値0.80290.79970.8008
アサルターLv1 vs 忍頭(Lv差30)最小最大平均
観測ダメージ239423331
防御無視時期待値340604472
観測値÷期待値0.70290.70030.7013

レベル差が1開くごとに、観測値÷期待値が0.01ずつ減っています。
防御が同じ700で、レベルが違うウェンペペ・デスマリオネットでもこの傾向は変わらなかったため、
それぞれの観測値の差は、敵の防御を無視したレベル補正によるものだと考えられます。

したがって、レベル補正は(ダメージ)×(100−レベル差)÷100と推定されます。

検証3:レベル補正と防御補正の相互影響

攻撃力657〜1152
・攻撃力:657〜1152
・スキル:通常攻撃
・攻撃対象:デスマリオネット(Lv85:防御700)・グリュード(Lv94:防御830)
・攻撃対象:・リセルグリュード(Lv97・防御830)

各1000回程度(クリティカル含む)データを取りました。

通常攻撃
(クリティカルは1/2して算入)
デスマリオネットグリュードリセルグリュード
レベル差51417
防御700830830
観測最大値744569540
観測最小値2157358
観測平均値478.34321.39294.71
データ数94210291004

ここで、敵の防御が0だった場合の期待値を考えると、

通常攻撃
(クリティカルは1/2して算入)
デスマリオネットグリュードリセルグリュード
レベル差51417
防御0と仮定0と仮定0と仮定
防御無視時最大値1094990956
防御無視時最小値624565545
防御無視時平均値859.28777.87750.74
データ数94210291004

となります。
ここで、グリュードとリセルグリュードの防御力は同じ830のため、
これら2種類の(防御無視時ダメージ)−(観測値)が、防御力によって減らされたダメージになります。

通常攻撃
(クリティカルは1/2して算入)
デスマリオネットグリュードリセルグリュード
レベル差51417
防御700830830
防御無視時最大値−観測最大値350421416
(防御無視時最大値−観測最大値)
÷防御力
0.50000.50720.5012
防御無視時最小値−観測最小値409492487
(防御無視時最小値−観測最小値)
÷防御力
0.58430.59280.5867
防御無視時平均値−観測平均値380.93456.48456.03
(防御無視時平均値−観測平均値)
÷防御力
0.54420.55000.5494
データ数94210291004

防御力によって減らされたダメージがグリュード・リセルグリュードでほぼ同じであることから、
防御による減算分にレベル差は影響しないことが分かります。
また、(防御無視時ダメージ)−(観測値)を防御力で割った値が0.50〜0.60の範囲内であるので、
(ダメージ)=(レベル補正後のダメージ)−(敵防御力)×(0.50〜0.60の範囲の乱数)
となります。

防御の影響が分かったので、観測値から防御による減少分を除くと、

通常攻撃
(クリティカルは1/2して算入)
デスマリオネットグリュードリセルグリュード
レベル差51417
防御700830830
観測最大値+(防御)×0.501094984955
観測最小値+(防御)×0.60635571556
観測平均値+(防御)×0.55863.34777.89751.21

となります。
これをそれぞれ{(100−レベル差)÷100}で割ると、

通常攻撃
(クリティカルは1/2して算入)
デスマリオネットグリュードリセルグリュード
レベル差51417
防御700830830
{観測最大値+(防御)×0.50}
÷{(100−レベル差)÷100}
1151.581144.191150.60
{観測最小値+(防御)×0.60}
÷{(100−レベル差)÷100}
668.42663.95669.88
{観測平均値+(防御)×0.55}
÷{(100−レベル差)÷100}
908.78904.53905.07

となり、攻撃力の値とほぼ同じになります。
したがって、レベル補正は検証2と同じく×(100−レベル差)÷100でいいようです。

これに防御の影響を加えた式、
(攻撃力)×(100−敵とのレベル差)÷100−(敵の防御力)×(0.5〜0.6の範囲の乱数)
が、物理攻撃の通常攻撃時のダメージになると推定されます。

追試

攻撃力704〜1247、Lv71でサベッジスタブLv30(単発80%)を、
ファイアブルLv90、防御835に使って実験しました。
データの総数は7650程度でした。

理論値
最小ダメージ
{704×(100−19)÷100−835×0.6}×80%≒55
最大ダメージ
{1247×(100−19)÷100−835×0.5}×80%≒474
観測値
最小ダメージ
58
最大ダメージ
473

最小・最大値共に、理論値の範囲内で、かつかなり近い数値が確認できました。

通常攻撃力の小数点以下の処理

表示上の攻撃力が同じでも小数点以下の違いがある場合に、どのような違いが出てくるのかを調べてみました。

・装備は片手剣攻撃15で共通
・攻撃対象:デンデン・青デンデン(防御0)
STR7DEX35で攻撃力5〜9
・STR7 DEX35 …… 攻撃力5.628〜9.45
STR7DEX37で攻撃力5〜9
・STR7 DEX37 …… 攻撃力5.928〜9.75

それぞれ400個ずつデータをとりました。

通常攻撃ダメージ56789
STR5 DEX35回数461051129641400
割合11.5%26.25%28%24%10.25%100%
STR5 DEX37回数69811910374400
割合1.5%24.5%29.75%25.75%18.5%100%

明らかに両端の数値の出る割合が違うことが分かります。
図示してみると、
ダメージ分布
となります。

ここで、(1)5.628〜9.45、(2)5.928〜9.75の間にある数をそれぞれ適当に選びだすとき、
その得られた数の整数部分の確率分布は下表のようになります。

整数部分56789
(1)9.73%26.16%26.16%26.16%11.77%
(2)1.88%26.16%26.16%26.16%19.62%

図示すると、
確率分布
こうなります。
上のダメージの分布図とほぼ同じ構造になっているのが分かると思います。

したがって、
通常攻撃力算出時、小数点以下の数値も含めた確率で算出され、その後整数部分だけが使われる
ことが分かります。
したがって、例えば正確な攻撃力が100.50〜200.00でデンデンに通常攻撃をした場合、
101〜199までの数値は均等な割合で出ますが、
100が出る確率はその半分、200が出る確率は1/100以下(算出方法による)しかありません。

クルセイダー・パラディンのチャージ補正のかかり方

既にfunny days様にて防御補正にチャージ補正は乗算されないことは検証されていたのですが、
レベル補正のかかり方を調べてみることにしました。

まずは防御補正にチャージ補正が乗算されないことの追試を行いました。

攻撃力80〜146
・攻撃力:80〜146(80.864〜146.00)
・装備:古びたグラディウス(攻撃10)
・攻撃対象:ブロックパス(防御100)
・チャージスキル:アイスチャージLv1(補正95%)
通常攻撃最小最大
防御無視理論値76138
観測値1787
5951

仮にチャージ補正が防御補正にも乗算されるとすると、
防御による減算量は47.5〜57の範囲でないといけないので、実測値と矛盾します。
したがってチャージ補正は防御補正に乗算されないことが確認できました。

なお、最大攻撃力の小数点以下がぴったり0、最小攻撃力の小数点以下も大きいので、
1つ上の検証で示したように理論上最大値最小値が出る確率は非常に低いため、
本来は50〜60の差が出るはずですが、データを取るのを途中放棄しています。

次に、チャージ補正がレベル補正にかかるかどうかを調べました。

攻撃力571〜1015
・レベル:70
・攻撃力:571〜1015
・攻撃対象:デスマリオネット(Lv85:防御700)
・チャージスキル:アイスチャージLv1(補正95%)
通常攻撃最小最大
観測値44468
チャージ補正がレベル補正にかかる場合の理論値41469
チャージ補正がレベル補正にかからない場合の理論値37462

仮に(攻撃力)×(チャージ補正)−(攻撃力)×((敵レベル)−(自レベル))÷100とした場合、
観測最大値が理論値を超えているので不適です。
(攻撃力)×(チャージ補正)×(100−((敵レベル)−(自レベル))÷100)の方は
観測値が理論値内に収まっているので、こちらが正しいと推定されます。

属性相性補正の検証

まずは属性の相性による補正が防御補正に乗算されるかどうかを調べました。

攻撃力125〜226
・攻撃力:125〜226
・攻撃対象:ファイアストーンボール(防御275・氷弱点)
・チャージスキル:アイスチャージLv30(補正105%・属性弱点補正150%)
通常攻撃最小最大
観測値36215
((攻撃力)−(防御補正))×(弱点補正)の場合の理論値-34(※1)100
(攻撃力)×(弱点補正)−(防御補正)の場合の理論値31218

(※1:1以下の数値を1に繰り上げる処理は無視)

数百程度しかデータをとっていないので若干差は出ていますが、
属性の相性による補正は防御補正には乗算されないようです。

次に、レベル補正に乗算されるかを調べました。

攻撃力489〜875
・レベル:83
・攻撃力:489〜875
・攻撃対象:バーンケンタウロス(レベル88・防御800・氷弱点)
・チャージスキル:アイスチャージLv30(補正105%・属性弱点補正150%)
通常攻撃最小最大
観測値262898
レベル補正が防御補正に乗算される場合の理論値252909
レベル補正が防御補正に乗算されない場合の理論値265932

正確な最大・最小値を得られるまで攻撃を繰り返すととてつもなく時間がかかるので、
それぞれの式から得られる理論値から外れた数値が得られた時点で終了しました。

相性補正はレベル補正には乗算されるようです。

コンボ補正の検証

ソウルマスターコンボアタック・アドバンスドコンボ計算式の検証を参照してください

考察

端数の処理のタイミング

小数点以下の処理がどのタイミングで何度行われているのかによって、
数ポイントの誤差が生じる可能性があります。

これはあくまで推測にすぎませんが、

n = int(ステータスから算出された攻撃力の範囲内の乱数)
lv = (敵レベル)−(自レベル)
lv < 0ならlv = 0
D = int(n - int(n×lv÷100) - int((敵防御力)×(0.5〜0.6の範囲内の乱数)))
Ds = int(D × スキル倍率)

となっていると考えると上手くいくような気がします(intは端数切捨て処理)。

少なくとも、Dを一度計算してから、スキル倍率をかけてDsを出しているのはほぼ確定だと思われます。
検証3で通常攻撃のクリティカル時に、1500程度のデータ内に奇数の値が確認できませんでした。
シャープアイズがかかっていない状態でのストレイフLv30(100%)のクリティカル時にも、
奇数の値を観測したことがありません。
パワーストライク(200%)で攻撃してみたところ奇数の値を確認しました。
どうやらint((算出値)×(スキル倍率))+int((算出値)×(クリティカル倍率))になってるようです。

なお、ダメージが1未満になった場合、強制的に1になる現象に関しては、
どういう処理がなされているのか不明です。
ボムの初弾(修正前:50%)やスラブラEXの後方(少なくとも50%以下)ではmiss表示になり、
サベジ(80%)では1になるので、おそらくD < 1になった場合、
スキル倍率が一定値以下(多分50%?)だと0(=miss)に、
一定値以上だと強制的に1になるんじゃないかと思いますが、さすがに検証する気はありません。

計算処理の謎

以下の3枚のSSは、上記の追試にて撮影したものです。
MISS 298 345 MISS 298 345 262 247 MISS 262 247 MISS 259 180 MISS 259 180 MISS
見えづらいですが、1枚目の一番下のダメージは「345」です。
上3つと下3つの数値とMISSの並びが全く同じになっています。
7000回以上もデータを取ればそんなこともある、というわけではなく、
これは1体のファイアブルに対してサベジを使ったときのものなのです。
サベジ1発の平均ダメージは1274.4、命中率は65%程度なので、
1体のファイアブルには55発程度サベジを使っているのですが、
3/55の確率で上のような数値がでるわけがありません。

さらに、ちょっと形は違いますがこんなのもありました。
379 MISS 156 379 MISS MISS
最後がMISSになっていますが、形としてはかなり近いです。
これも同じファイアブルです。

これらの現象はたまたま1体のファイアブルの場合に集中して起こったわけではなく、
ほとんどのファイアブルで少なくとも1回は観測しました。
詳しくデータを取ったわけではないので不正確ですが、この現象は、
1回の攻撃中にMISSが2回以上出た場合にかなりの頻度で発生しました。
待ち構えていれば余裕でSSが取れるくらいの頻度です。
逆に6回とも命中した場合などには、数字が被るといったことは確認できませんでした。

乱数の関係なのかなんなのかよく分かりませんが……。
計算ツール作ってダメージ計算しても、完全に同じには作れないかもしれませんね。