ページ

2014年3月26日水曜日

計算式再考、属性強化の適用位置

 [[ 攻撃力/100 ×弾物理          ×速射補正] ×距離補正] ×武器補正 ×弾肉質  =物理ダメージ
  [((攻撃力/100 ×弾属性) ×乗算 +加算) ×速射補正]              ×属性肉質 =属性ダメージ
 [[物理ダメージ +属性ダメージ] ×全体防御] =合計ダメージ


※[ ]は少数切り捨て


(ボウガンの)属性ダメージの計算式のコア部分は、

 攻撃力 ×弾属性 ×属性肉質 =属性ダメージ

となります。
実際には攻撃力または弾の威力を百分率にする必要があるため、

 A:攻撃力/100 ×弾属性 ×属性肉質 =属性ダメージ

または

 B:攻撃力 ×弾属性/100 ×属性肉質 =属性ダメージ

となります。

細かい理由は忘れてしまったのですが、3Gの計算をしている際に後者(B)の計算の方が(式の記述に)都合の良かった事があり、それ以来このブログでも後者を多用していました。

それとは別件で、MH4の属性強化スキルは仕様が変更され下記の様になりました。

 属性強化  :属性値×1.10倍
 ○属性強化+1:属性値×1.05倍+40
 ○属性強化+2:属性値×1.10倍+60
 ○属性強化+3:属性値×1.15倍+90

 W属性強化+1:属性値×1.05×1.10倍+40
 W属性強化+2:属性値×1.10×1.10倍+60
 W属性強化+3:属性値×1.10×1.10倍+90

これはあくまで近接武器の表示属性値に一致するように逆算した値の為、実際に単純な加算処理なのか、複雑な計算をした結果がたまたま加算値と一致しているのかは不明です。

仮にこの属強スキルによる補正値が正しかったとして、これを前述の属性ダメージ計算式に入れる場合、とくにBの場合は弾の属性値が1項目として独立しているように見えるため、これまでは以下の様な式であると想定していました。

 B':攻撃力 ×(弾属性 ×乗算 +加算) ×属性肉質 =属性ダメージ

しかし某所による再検証の結果を要約すると、どうも次の式の方が一致する様です。

 A':(攻撃力 ×弾属性) ×乗算 +加算 ×属性肉質 =属性ダメージ

B'の式を展開・抜粋すると、

 攻撃力×弾属性×乗算 +攻撃力×加算

となりますが、A'の式は

 攻撃力×弾属性×乗算 +加算

となり、加算補正値に攻撃力が乗らなくなるため、A'の方が従来想定のB'よりもダメージが低くなります。
(※厳密には攻撃力が100未満だと1.0未満を掛けるため、ごく序盤の攻撃力の低い武器の場合はB'の方が小さくなる場合もあります)

これは属性強化スキルの補正処理を剣士・ガンナーで共通化するために、属性値を予め算出しておくと考えるとあり得るとかと思います。以下は仮想コードですが、処理順序のイメージです。

 // attr:Attribute=属性
 if (isGunner()) {
  attr = getWeaponAttack() *getBulletAttr();
 } else {
  attr = getWeaponAttr();
 }

 // 乗算適用
 attr *= ...
 // 加算処理
 attr += ...


念のため、百分率化の位置を3パターン想定し、どれが一致するかを確認します。

 A:攻撃力/100 ×弾属性
 B:攻撃力 ×弾属性/100
 C:(攻撃力 ×弾属性)/100

このA〜C3パターンに前述の属性強化スキルの適用パターンA'〜B'を合せると、計6パターンになりますが、結果の重複する組み合わせを除外すると、以下の3パターンになります。

 A':(攻撃力/100 ×弾属性) ×乗算 +加算
 B':攻撃力 ×(弾属性 ×乗算 +加算)/100
 C':((攻撃力 ×弾属性) ×乗算 +加算)/100

加算補正が入らないA〜Cに差はありませんが、加算が入る場合のA'〜C'は展開・抜粋すると

 A':加算
 B':攻撃力×加算/100
 C':加算/100

という差が出てきます。

このA'〜C'の3パターンについて試算し、どれが実測と一致するか検証します。

 100(表示攻撃力130)
 NBシェルバレット(100)、水属強+3
 村☆4ズワロ(HP92、全体防御100)@胴(弾70、水30)

 ・試算
  A':24 ○一致
  B':24 ○一致
  C':21 ×不一致

 ・実測
  水冷 =24

 220(表示攻撃力286)
 NB烈日(220)、火属強+3
 集☆4ズワロ(HP179、全体防御95)@頭(弾75、火35)

 ・試算
  A':54 ○一致
  B':57 ×不一致
  C':51 ×不一致

 ・実測
  火炎 =54

という結果から、A'式がもっとも一致します。

基本攻撃力100のシェルバレットは分岐点と一致するため、A'式とB'式に差が出ません。基本攻撃力220の烈日は2.2が乗算されるため、B'式では実測値を上回ります。定数の加算値が/100されてしまうC'はどちらの場合でも実測値を下回ります。

以上の結果を踏まえて、これまでの検証を全て反映した計算式は前掲の通りです。