Elin:解析/戦闘: Difference between revisions

敵軽減率について小数点以下切り捨てなことを明記、物理攻撃の計算式諸々についての記述の書き直し。
(→‎格闘: 計算式修正、および用語の表記ゆれをなくしました)
(敵軽減率について小数点以下切り捨てなことを明記、物理攻撃の計算式諸々についての記述の書き直し。)
Line 50: Line 50:


==敵のレベルに応じたダメージ軽減==
==敵のレベルに応じたダメージ軽減==
{{バージョン|23.46}}
{{バージョン|23.79}}


レベル50を超えた敵が受けるダメージ軽減量は以下の通り:
レベル50を超えた敵が受けるダメージ軽減量は以下の通りです:


まず、レベル50以下の敵の軽減率は0%、レベル1024以上の敵は軽減率80%となります。
まず、レベル50以下の敵の軽減率は0%、レベル1074以上の敵は軽減率80%となります。
  if (!this.IsPCFaction && this.LV > 50)
  if (!this.IsPCFaction && this.LV > 50)
  {
  {
Line 66: Line 66:
与えるダメージに、* (100 - [  2.5 * √(敵のレベル - 50)  か 80 かのうち小さいほう ]<ref>正確には小さい方を四捨五入したもの</ref>) / 100が掛けられます。
与えるダメージに、* (100 - [  2.5 * √(敵のレベル - 50)  か 80 かのうち小さいほう ]<ref>正確には小さい方を四捨五入したもの</ref>) / 100が掛けられます。


つまり、Lv1024以上の敵に対してはダメージが80%減少し、Lv51~Lv1023の敵に対しては[sqrt(階数-50) * 2.5]%減少します。
つまり、Lv1024以上の敵に対してはダメージが80%減少し、Lv51~Lv1073の敵に対しては[sqrt(敵Lv-50) * 2.5]%減少します。
{| class="wikitable"
{| class="wikitable"
|+レベル毎のダメージ軽減
|+レベル毎のダメージ軽減
Line 73: Line 73:
|-
|-
|51  
|51  
|2.50
|2
|-
|-
|100
|100
|17.67
|17
|-
|-
|150
|150
|25.00
|25
|-
|-
|200
|200
|30.61
|30
|-
|-
|250
|250
|35.35
|35
|-
|-
|300
|300
|39.53
|39
|-
|-
|350
|350
|43.30
|43
|-
|-
|400
|400
|46.77
|46
|-
|-
|450
|450
|50.00
|50  
|-
|-
|500
|500
|53.03
|53
|-
|-
|550
|550
|55.90
|55
|-
|-
|600
|600
|58.63
|58
|-
|-
|650
|650
|61.24
|61
|-
|-
|700
|700
|63.74
|63
|-
|-
|750
|750
|66.14
|66
|-
|-
|800
|800
|68.47
|68
|-
|-
|850
|850
|70.71
|70
|-
|-
|900
|900
|72.89
|72
|-
|-
|950
|950
Line 130: Line 130:
|-
|-
|1000
|1000
|77.06
|77
|-
|1050
|79
|-
|1074
|80
|-
|1100
|80
|}
|}


Line 137: Line 146:
{{バージョン|23.46}}
{{バージョン|23.46}}
[[File:Function curve as of EA23.46.png|thumb|upright=3.0|バージョン EA23.46 のCURVE 関数の入力(オレンジ色)と出力(藍)です。Output = Curve(Input, 50, 25, 75) ]]
[[File:Function curve as of EA23.46.png|thumb|upright=3.0|バージョン EA23.46 のCURVE 関数の入力(オレンジ色)と出力(藍)です。Output = Curve(Input, 50, 25, 75) ]]
「CURVE」とはElinにてどのようににスキル値の有効性にスライドカーブがついているかの具体的な式です。
「CURVE」とはElinにてどのようににスキル値の有効性を段階的に抑制する処理です。
  CURVE( input, start, step, rate)
  CURVE( input, start, step, rate)
  if input <= start
  if input <= start
Line 151: Line 160:
  }
  }
  return input
  return input
まず、システムは攻撃者の「命中」とターゲットの「回避」を評価します。
まず、システムは攻撃者の「命中力」とターゲットの「回避力」を評価します。


命中の値は、使用する武器の種類(投擲、遠距離、近接、格闘)とスタイルによって異なる計算式で算出されます
命中力の値は、使用する武器の種類(投擲、遠距離、近接、格闘)とスタイルによって異なる計算式で算出されます


{| class="wikitable wikitable」"
{| class="wikitable wikitable」"
Line 164: Line 173:
|-
|-
|格闘 (盾なし)
|格闘 (盾なし)
|CURVE([攻撃者の器用]/3 + [攻撃者の筋力]/3 + [攻撃者の武器スキル], 50, 25, 75) + 50
|CURVE([攻撃者の器用]/3 + [攻撃者の武器の主能力]/3 + [攻撃者の武器スキル], 50, 25, 75) + 50
|-
|-
|格闘 (盾あり)
|格闘 (盾あり)
|CURVE([攻撃者の器用]/3 + [攻撃者の筋力]/3 + [攻撃者の武器スキル], 50, 25, 75)の75% + 50
|CURVE([攻撃者の器用]/3 + [攻撃者の武器の主能力]/3 + [攻撃者の武器スキル], 50, 25, 75) + 50 に0.75をかけたもの
|-
|-
|ワンド
|ワンド
|CURVE([攻撃者の意志]/4 + [攻撃者の武器の主能力]/3 + [攻撃者の武器スキル], 50, 25, 75) + 100
|CURVE([攻撃者の意志]/4 + [攻撃者の武器の主能力]/3 + [攻撃者の武器スキル], 50, 25, 75) + 100
|-
|-
|その他すべての武器
|その他すべての武器
|CURVE([攻撃者の器用]/4 + [攻撃者の武器の主能力]/3 + [攻撃者の武器スキル], 50, 25, 75) + 50
|CURVE([攻撃者の器用or意志]/4 + [攻撃者の武器の主能力]/3 + [攻撃者の武器スキル], 50, 25, 75) + 50
|}
|}
上記の式で算出した値に装備と武器による命中修正が足し算され、その後遠距離武器には距離による修正が適用されたものが「命中」となります。
上記の式で算出した値に装備と武器による命中修正が足し算され、その後遠距離武器には距離による修正が適用されたものが「命中力」となります。




「回避」はこちらの式で計算されます。:CURVE ([対象の感覚] / 3 + [対象の回避スキル], 50, 10, 75) + [対象のDV] + 25


「回避力」はこちらの式で計算されます。:CURVE ([対象の感覚] / 3 + [対象の回避スキル], 50, 10, 75) + [対象のDV] + 25


命中率に影響を与える以下の要素は、複合して作用しながら次の表の上から順で適用されます。<ref>プログラムでは、X=X+1のように、同じ文字が一つの式に複数回登場して右辺にあるものが調整前の数字、左辺にあるものが調整後の数字になる記法があります。</ref>
 
命中力・回避力に影響を与える以下の要素は、複合して作用しながら次の表の上から順で適用されます。<ref>プログラムでは、X=X+1のように、同じ文字が一つの式に複数回登場して右辺にあるものが調整前の数字、左辺にあるものが調整後の数字になる記法があります。</ref>


{| class="wikitable"
{| class="wikitable"
Line 189: Line 199:
|-
|-
|攻撃者が災い状態
|攻撃者が災い状態
|命中 = 75% (0.75をかける)
|命中力 = 命中力 * 0.75
|-
|-
|攻撃者が高所にいる
|攻撃者が高所にいる
|命中 +20%    (1.2をかける)
|命中力 = 命中力 * 1.2
|-
|-
|攻撃者が乗馬している
|攻撃者が乗馬している
|命中 = 命中 * 100 / (100 + 500 / ('''5''' or '''10 + [攻撃者の乗馬スキル]''' の高い方))  (同じく補正値を掛け算)
|命中力 = 命中力 * 100 / (100 + 500 / ('''5''' or '''10 + [攻撃者の乗馬スキル]''' の高い方))  (同じく補正値を掛け算)
|-
|-
|攻撃者がペットを寄生させている
|攻撃者がペットを寄生させている
|命中 = 命中 * 100 / (100 + 1000 /('''5''' or '''10 + [攻撃者の共存スキル]''' の高い方))  (同じく補正値を掛け算)
|命中力 = 命中力 * 100 / (100 + 1000 /('''5''' or '''10 + [攻撃者の共存スキル]''' の高い方))  (同じく補正値を掛け算)
|-
|-
|騎乗されているペットによる攻撃
|騎乗されているペットによる攻撃
|命中 = 命中 * 100 / (100 + 1000 / ('''5''' or '''10 + [攻撃者の筋力]''' の高い方))      (同じく補正値を掛け算)
|命中力 = 命中力 * 100 / (100 + 1000 / ('''5''' or '''10 + [攻撃者の筋力]''' の高い方))      (同じく補正値を掛け算)
|-
|-
|寄生しているペットによる攻撃
|寄生しているペットによる攻撃
|命中 =命中 * 100 / (100 + 1000 / ('''5''' または '''10 + [攻撃者の器用]''' の高い方))    (同じく補正値を掛け算)
|命中力 = 命中力 * 100 / (100 + 1000 / ('''5''' または '''10 + [攻撃者の器用]''' の高い方))    (同じく補正値を掛け算)
|-
|-
| 攻撃者が両手持ち
| 攻撃者が両手持ち
|命中 = 命中 + 25 + sqrt([攻撃者の両手持ちスキル] * 2) 
|命中力 = 命中力 + 25 + sqrt([攻撃者の両手持ちスキル] * 2) 
|-
|-
|攻撃者が二刀流
|攻撃者が二刀流
|命中 = 命中 * 100 / (115 + 手の番号 * 15 + 手の番号 *(2000 / (20 + [攻撃者の二刀流スキル])[0-100でクランプ<ref>クランプとは値に上限と下限を適用するという意味です。この場合、確率なので0から100%に設定されています</ref>])
|命中力 = 命中力 * 100 / (115 + 手の番号 * 15 + 手の番号 *(2000 / (20 + [攻撃者の二刀流スキル])[0-100でクランプ<ref>クランプとは値に上限と下限を適用するという意味です。この場合、確率なので0から100%に設定されています</ref>])
|-
|-
| 攻撃者が盲目
| 攻撃者が盲目
|命中 = 33.33% (または、遠距離/投擲の場合は10%)         (補正値を掛け算)
|命中力 = 命中力 * 0.333 (または、遠距離/投擲の場合は0.1)
|-
|-
|対象が盲目
|対象が盲目
|回避率 = 50% (0.5をかける)
|回避力 = 回避力 * 0.5
|-
|-
|対象が朦朧
|対象が混乱もしくは朦朧
|回避率 = 50% (0.5をかける)
|回避力 = 回避力 * 0.5
|-
|-
|対象が高所にいる
|対象が高所にいる
|回避率 + 20% (1.2をかける)
|回避力 = 回避力 * 1.2
|}
|}


Line 232: Line 242:




ここまでで最終的な命中率と回避率を計算しました。以下では攻撃が命中するか、外れるか、クリティカルになるかの順に、判定します。
ここまでで最終的な命中力と回避力を計算しました。以下では攻撃が命中するか、外れるか、クリティカルになるかするまで、上から順に判定します。
苛立エンチャントの効果による攻撃の場合、確定クリティカル
 
  対象が朦朧状態の場合、4分の1の確率でクリティカル
  対象が朦朧状態の場合、4分の1の確率でクリティカル


  対象が死亡または睡眠状態の場合、確定でクリティカル
  対象が死亡または睡眠状態の場合、確定でクリティカル


  [対象の見切りスキル] × 10 > 命中の場合、以下の式で見切り成功判定
  [対象の見切りスキル] * 10 > 命中の場合、見切り成否判定を行う。
  num = 回避 * 100 / 命中 (として変数numを定義)
  'num > 300 & random 0 to ([対象の見切りスキル]+250) > 100 のとき、攻撃は外れる (&というのは&の前後の判定が両立して初めて攻撃が外れるということ)
  見切り力 = 回避 * 100 / 命中 とし、以下3つの式を上から順に処理する。<ref>見切り力が301以上であれば、見切りによる回避判定は3回行われる</ref>
  'num > 200 & random 0 to ([対象の見切りスキル]+250) > 150 のとき、攻撃は外れる
  見切り力 > 300 かつ、 random 0 - ([対象の見切りスキル] + 250) > 100 のとき、攻撃は外れる
  'num > 150 & random 0 to ([対象の見切りスキル]+250) > 200 のとき、攻撃は外れる
  見切り力 > 200 かつ、 random 0 - ([対象の見切りスキル] + 250) > 150 のとき、攻撃は外れる
  見切り力 > 150 かつ、 random 0 - ([対象の見切りスキル] + 250) > 200 のとき、攻撃は外れる


  [対象の完全回避] > random 0 - 99 のとき、攻撃は外れる (0から99までの値が等確率で選ばれて、それより完全回避が大きいか小さいかを判定に使う)
  [対象の完全回避] > random 0 - 99 のとき、攻撃は外れる (0から99までの値が等確率で選ばれて、それより完全回避が大きいか小さいかを判定に使う)


  1 in 20 のとき、攻撃は命中 (おそらく5%で以降の判定を免除して命中することになる)
  random 0 - 19 が 0 のとき、攻撃は命中 (5%で対象の回避を無視して命中する)<ref name=":0">この場合、クリティカルにはならない。</ref>


  1 in 20 のとき、攻撃は外れる (おそらく5%で以降の判定を免除して外れることになる)
  random 0 - 19 が 0 のとき、攻撃は外れる (5%で攻撃者の命中を無視して外れる)


  命中 < 1 のとき、攻撃は外れる
  命中 < 1 のとき、攻撃は外れる


  回避 < 1 のとき、攻撃は命中
  回避 < 1 のとき、攻撃は命中<ref name=":0" />


  random 0 - 命中 < random 0 - (回避 * 125 (遠距離攻撃なら150) / 100) のとき、攻撃は外れる (random X-Yは等確率でXからYまでの乱数を生成する関数)
  random 0 - 命中 < random 0 - (回避 * 125 (遠距離攻撃なら150) / 100) のとき、攻撃は外れる (random X-Yは等確率でXからYまでの乱数を生成する関数)


  random 0 - 5000 < [攻撃者の感覚]のとき、攻撃はクリティカル
  random 0 - 5000 < [攻撃者の感覚] + 50 のとき、攻撃はクリティカル


  [攻撃者のCriticalスキル] + sqrt([攻撃者の心眼スキル]) > random 0 -200のとき、攻撃はクリティカル
  [攻撃者のクリティカルエンチャント合計] + sqrt([攻撃者の心眼スキル]) > random 0 - 200のとき、攻撃はクリティカル


  攻撃者が[死の真髄]フィートを所持している場合、以下の判定を行う
  攻撃者が[死の真髄]フィートを所持している場合、以下の判定を行う
     num = 100 - [攻撃者の現在HP] * 100 / [攻撃者の最大HP] (変数numをこのように定義)
     HP減少率 = 100 - [攻撃者の現在HP] * 100 / [攻撃者の最大HP]
     num >= 50 & (num^3 / 3) > random 0 - 100000000 のとき、攻撃はクリティカル 
     HP減少率 >= 50 & (HP減少率 ^ 4 / 3) > random 0 - 100000000 のとき、攻撃はクリティカル (HPが5割以上減っている状態で、減少率に応じて最小2%~最大33%の確率でクリティカル)


  攻撃は命中
  攻撃は命中
Line 267: Line 280:
==格闘==
==格闘==
<syntaxhighlight lang="c#" line="1">
<syntaxhighlight lang="c#" line="1">
else if (this.IsMartial || this.IsMartialWeapon)
else if (IsMartial || IsMartialWeapon)
{
{
    this.weaponSkill = this.CC.elements.GetOrCreateElement(100);
weaponSkill = CC.elements.GetOrCreateElement(100);
    this.attackType = (this.CC.race.meleeStyle.IsEmpty() ? ((EClass.rnd(2) == 0) ? AttackType.Kick : AttackType.Punch) : this.CC.race.meleeStyle.ToEnum(true));
bool flag2 = weapon != null && weapon.Evalue(482) > 0;
    this.dBonus = this.CC.DMG + this.CC.encLV + (int)Mathf.Sqrt((float)(this.CC.STR / 5 + this.weaponSkill.Value / 4));
if (flag2)
    this.dNum = 2 + Mathf.Min(this.weaponSkill.Value / 10, 4);
{
    this.dDim = 5 + (int)Mathf.Sqrt((float)(this.weaponSkill.Value / 3));
weaponSkill = CC.elements.GetOrCreateElement(305);
    this.dMulti = 0.6f + (float)(this.CC.STR / 2 + this.weaponSkill.Value / 2 + this.CC.Evalue(132) / 2) / 50f;
}
    this.dMulti += 0.05f * (float)this.CC.Evalue(1400);
attackType = ((!CC.race.meleeStyle.IsEmpty()) ? CC.race.meleeStyle.ToEnum<AttackType>() : ((EClass.rnd(2) == 0) ? AttackType.Kick : AttackType.Punch));
    this.toHitBase = EClass.curve(this.CC.DEX / 3 + this.CC.STR / 3 + this.weaponSkill.Value, 50, 25, 75) + 50;
dBonus = CC.DMG + CC.encLV + (int)Mathf.Sqrt(Mathf.Max(0, weaponSkill.GetParent(CC).Value / 5 + weaponSkill.Value / 4));
    this.toHitFix = this.CC.HIT;
dNum = 2 + Mathf.Min(weaponSkill.Value / 10, 4);
    if (this.attackStyle == AttackStyle.Shield)
dDim = 5 + (int)Mathf.Sqrt(Mathf.Max(0, weaponSkill.Value / 3));
    {
dMulti = 0.6f + (float)(weaponSkill.GetParent(CC).Value / 2 + weaponSkill.Value / 2 + CC.Evalue(flag2 ? 304 : 132) / 2) / 50f;
        this.toHitBase = this.toHitBase * 75 / 100;
dMulti += 0.05f * (float)CC.Evalue(1400);
    }
toHitBase = EClass.curve(CC.DEX / 3 + weaponSkill.GetParent(CC).Value / 3 + weaponSkill.Value, 50, 25) + 50;
    this.penetration = Mathf.Clamp(this.weaponSkill.Value / 10 + 5, 5, 20) + this.CC.Evalue(92);
toHitFix = CC.HIT;
    if (this.IsMartialWeapon)
if (attackStyle == AttackStyle.Shield)
    {
{
        this.dBonus += this.weapon.DMG;
toHitBase = toHitBase * 75 / 100;
        this.dNum += this.weapon.source.offense[0];
}
        this.dDim = Mathf.Max(this.dDim / 2 + this.weapon.c_diceDim, 1);
penetration = Mathf.Clamp(weaponSkill.Value / 10 + 5, 5, 20) + CC.Evalue(92);
        this.toHitFix += this.weapon.HIT;
if (IsMartialWeapon)
        this.penetration += this.weapon.Penetration;
{
        if (!this.weapon.source.attackType.IsEmpty())
dBonus += weapon.DMG;
        {
dNum += weapon.source.offense[0];
            this.attackType = this.weapon.source.attackType.ToEnum(true);
dDim = Mathf.Max(dDim / 2 + weapon.c_diceDim, 1);
        }
toHitFix += weapon.HIT;
    }
penetration += weapon.Penetration;
if (!weapon.source.attackType.IsEmpty())
{
attackType = weapon.source.attackType.ToEnum<AttackType>();
}
}
}
}
</syntaxhighlight>
</syntaxhighlight>
プレイヤーは格闘スキルを使用してキックまたはパンチを繰り出します。近接戦闘スタイルやキャラクターの特性に基づいて攻撃エフェクトは変わります。
キャラクターは格闘スキルを使用して格闘攻撃を繰り出します。通常はパンチないしキックですが、武器の近接戦闘スタイルやキャラクターの特性に基づいて攻撃エフェクトは変わります。


ダメージは「格闘、筋力、器用、エンチャント値」によって決定されます。
武器に'''理力武器'''のエンチャントが付いている場合、格闘スキルの代わりに'''魔道具'''スキルを、戦術スキルの代わりに'''詠唱'''スキルを使用します。


ダメージのダイスは「2+(格闘/10)」、最大で「d6」です。


ダイスのダメージ値は「5+√(格闘/3)」です。
素手及び通常の格闘武器の場合:


ダメージ倍率は『'''0.6 + ((筋力 / 2 + 格闘 / 2 + 戦術 / 2) / 50.0)』です。'''
ダメージの基礎ダイス数は「'''2 + (格闘 / 10)'''」で、最大で6です。


プレイヤーが武器の知識フィートを持っている場合、追加ダメージが『0.05×(''武器の知識フィートのランク)』の割合で与えられます。''(実用上、+0.05または+0.10)
ダメージの基礎ダイス面は「'''5 + √(格闘 / 3)'''」です。


命中は「(筋力/3 + 器用/3 + 格闘)」を、スタート50、ステップ25、レート75%のカーブ関数に通過させたあとに50を足したものであり、プレイヤーが「盾」を装備している場合、0.75倍に下方修正されます。
基礎ダメージ修正は「'''√((筋力 / 5) + (格闘 / 4)) + 防具のダメージ修正合計 + キャラ固有のダメージ修正'''<ref name=":1">エーテル病の殺戮への飢えが該当する。</ref>」です。


貫通は「(格闘/10)+5」で計算され、最低5%、最高「20% + 貫通率」です。
ダメージ倍率は「'''0.6 + ((筋力 / 2 + 格闘 / 2 + 戦術 / 2) / 50.0)'''」です'''。'''


格闘技武器を装備している場合:
基礎貫通率は「'''(格闘 / 10) + 5'''」で、最低5%、最高で20%です。<ref name=":2">固有の貫通率を持っているキャラクターであればその値も加算される。</ref>


ダメージボーナスは素手のダメージボーナス + '''武器のダメージボーナス'''
基礎命中力は「'''(器用 / 3 + 筋力 / 3 + 格闘)'''」を、スタート50、ステップ25、レート75%のCURVE関数で計算した後、50を足したものです。


ダイス数は、素手のダイス数 + '''武器のダイス数'''


ダイス面は、素手のダイス面 / 2 + '''武器のダイス面'''
理力武器のエンチャントが付いた格闘武器の場合:


命中ボーナスは素手の命中ボーナス + '''武器の命中ボーナス'''
ダメージの基礎ダイス数は「'''2 + (魔道具 / 10)'''」で、最大で6です。
 
ダメージの基礎ダイス面は「'''5 + √(魔道具 / 3)'''」です。
 
基礎ダメージ修正は「'''√((魔力 / 5) + (魔道具 / 4)) + 防具のダメージ修正合計 + キャラ固有のダメージ修正<ref name=":1" />'''」です。
 
ダメージ倍率は「'''0.6 + ((魔力 / 2 + 魔道具 / 2 + 詠唱 / 2) / 50.0)'''」です'''。'''
 
基礎貫通率は「'''(魔道具 / 10) + 5'''」で、最低5%、最高で20%です。<ref name=":2" />
 
基礎命中力は「'''(器用'''<ref>格闘以外の理力武器と違い、意志を使用しない</ref> '''/ 3) + (魔力 / 3) + 魔道具'''」を、スタート50、ステップ25、レート75%のCURVE関数で計算した後、'''50'''を足したものです。
 
 
プレイヤーが武器の知識フィートを持っている場合、ダメージ倍率に『0.05×(''武器の知識フィートのランク)』だけ加算されます。''<small>(事実上、+0.05または+0.10)</small>
 
プレイヤーが盾を装備している場合、基礎命中力は0.75倍に修正されます。
 
 
さらに、格闘武器を装備している場合は以下の修正を受けます。
 
最終的なダイス数は「'''基礎ダイス数 + 武器の基礎ダイス数'''」です。
 
最終的なダイス面は「('''基礎ダイス面 / 2) + 武器の基礎ダイス数'''」です。
 
最終的なダメージ修正は「'''基礎ダメージ修正 + 武器のダメージ修正'''」です。
 
最終的な命中力は「'''基礎命中力 + 武器の命中修正'''」です。
 
最終的な貫通率は「'''基礎貫通率 + 武器の貫通率'''」です。


貫通率は素手の貫通率 + '''武器の貫通率'''
==投擲==
==投擲==
<syntaxhighlight lang="c#" line="1">
<syntaxhighlight lang="c#" line="1">
if (this.isThrow)
if (isThrow)
{
{
    bool flag = this.weapon.HasTag(CTAG.throwWeapon) || this.weapon.HasTag(CTAG.throwWeaponEnemy);
bool flag = weapon.HasTag(CTAG.throwWeapon) || weapon.HasTag(CTAG.throwWeaponEnemy);
    int num2 = (int)Mathf.Clamp(Mathf.Sqrt((float)(this.weapon.SelfWeight + this.weapon.ChildrenWeight)) * 3f + 25f + (float)(flag ? 75 : 0), 10f, 400f + Mathf.Sqrt((float)this.CC.STR) * 50f);
int num2 = (int)Mathf.Clamp(Mathf.Sqrt(weapon.SelfWeight + weapon.ChildrenWeight) * 3f + 25f + (float)(flag ? 75 : 0), 10f, 400f + Mathf.Sqrt(CC.STR) * 50f);
    int num3 = Mathf.Clamp(this.weapon.material.hardness, flag ? 40 : 20, 200);
int num3 = Mathf.Clamp(weapon.material.hardness, flag ? 40 : 20, 200);
    this.weaponSkill = this.CC.elements.GetOrCreateElement(108);
weaponSkill = CC.elements.GetOrCreateElement(108);
    this.attackType = AttackType.Blunt;
attackType = AttackType.Blunt;
    this.dBonus = (this.CC.IsPCParty ? 3 : 7);
dBonus = CC.DMG + (CC.IsPCParty ? 3 : 7);
    this.dNum = 2;
dNum = 2;
    this.dDim = ((this.CC.IsPCParty ? 0 : this.CC.LV) + this.CC.STR + this.CC.Evalue(108)) * num2 * num3 / 10000 / 2;
dDim = (((!CC.IsPCParty) ? CC.LV : 0) + CC.STR + CC.Evalue(108)) * num2 * num3 / 10000 / 2;
    this.dMulti = 1f;
dMulti = 1f;
    this.toHitBase = EClass.curve(this.CC.DEX / 4 + this.CC.STR / 2 + this.weaponSkill.Value, 50, 25, 75) + (this.CC.IsPC ? 75 : 250);
toHitBase = EClass.curve(CC.DEX / 4 + CC.STR / 2 + weaponSkill.Value, 50, 25) + (CC.IsPCFaction ? 75 : 250);
    this.toHitFix = this.CC.HIT + this.weapon.HIT;
toHitFix = CC.HIT + weapon.HIT;
    this.penetration = 25;
penetration = 25;
}
}
</syntaxhighlight>プレイヤーの投げたアイテムは投擲武器であってもそうでなくても投擲スキルを参照します。
</syntaxhighlight>プレイヤーの投げたアイテムは投擲武器であってもそうでなくても投擲スキルを参照します。
Line 347: Line 390:
重量値は 25 + '''投擲武器限定75<ref>投擲武器でないときは0</ref>''' + 3*'''√ [アイテムの重量]''' ですが、下限10、上限400+ 50*√(筋力)があります。
重量値は 25 + '''投擲武器限定75<ref>投擲武器でないときは0</ref>''' + 3*'''√ [アイテムの重量]''' ですが、下限10、上限400+ 50*√(筋力)があります。


ここでいうアイテムの重量はおそらくゲーム中の??sに1000をかけたものだと考えられます。
ここでいうアイテムの重量はゲーム中の〇.〇sに1000をかけたものです。
 
武器の材質値は'''素材の硬度'''です。上限は200で、これはダークマターの硬度と等しく、下限は'''投擲武器を投げている場合'''で'''40'''、それ以外では'''20'''として設定されています。


武器の材質値は'''素材の硬度'''です。上限は200で、これはダークマターの硬度と等しく、下限は'''武器を投げている場合'''で'''40'''、それ以外では20として設定されています


ダイスの数は常に'''2'''です
ダイスの数は常に'''「2」'''です。


ダイスの目は ('''(非プレイヤーキャラ限定でキャラクターレベル)''' + '''筋力''' + '''投擲''' ) x '''重量値''' x '''武器の材質値 / 10000 / 2'''
ダイスの面は「'''('''(プレイヤーパーティー外のキャラのみLv) + '''筋力''' + '''投擲''' ) x '''重量値''' x '''武器の材質値 / 10000 / 2」'''です。


正確さは、'''器用'''/4 + '''筋力'''/2 + '''投擲'''で、最低値は'''25+50'''、最高値は'''75+50 +''' ('''プレイヤーキャラクターの場合:75'''、それ以外の場合:'''250''')
ダメージボーナスは「(プレイヤーパーティー内のキャラの場合''':3'''、それ以外の場合:7) '''+''' '''武器のダメージ修正 + 防具のダメージ修正合計 + キャラ固有のダメージ修正<ref name=":1" />'''」です。


命中ボーナスは、'''キャラクターの命中ボーナス''' + '''武器の命中ボーナス'''
ダメージ倍率は常に「'''1'''」です。


ダメージボーナスは、'''プレイヤーキャラクターの場合:3'''、それ以外の場合:7
貫通力は常に'''25%'''です。


ダメージ倍率は常に'''1'''
基礎命中力は「'''器用 / 4 +''' '''筋力 / 2 +''' '''投擲'''」を、スタート50、ステップ25、レート75%のCURVE関数で計算した後、プレイヤーキャラクターの場合''':75'''、それ以外の場合:'''250''' を足したもので、


貫通力は常に'''25'''です。
最終的な命中力は「'''基礎命中力 +''' '''武器の命中修正 + 防具の命中修正合計」'''です。


==近接&遠隔武器 ==
==近接&遠隔武器 ==
Line 369: Line 413:
else
else
{
{
    if (this.IsRanged)
if (IsRanged)
    {
{
        this.weaponSkill = this.CC.elements.GetOrCreateElement(this.toolRange.WeaponSkill);
weaponSkill = CC.elements.GetOrCreateElement(toolRange.WeaponSkill);
    }
}
    else
else
    {
{
        this.weaponSkill = this.CC.elements.GetOrCreateElement(this.weapon.category.skill);
weaponSkill = CC.elements.GetOrCreateElement(weapon.category.skill);
    }
}
    if (!this.weapon.source.attackType.IsEmpty())
if (!weapon.source.attackType.IsEmpty())
    {
{
        this.attackType = this.weapon.source.attackType.ToEnum(true);
attackType = weapon.source.attackType.ToEnum<AttackType>();
    }
}
    bool flag2 = this.IsCane || this.weapon.Evalue(482) > 0;
bool flag3 = IsCane || weapon.Evalue(482) > 0;
    if (flag2)
if (flag3)
    {
{
        this.weaponSkill = this.CC.elements.GetOrCreateElement(305);
weaponSkill = CC.elements.GetOrCreateElement(305);
    }
}
    this.dBonus = this.CC.DMG + this.CC.encLV + this.weapon.DMG;
dBonus = CC.DMG + CC.encLV + weapon.DMG;
    this.dNum = this.weapon.source.offense[0];
dNum = weapon.source.offense[0];
    this.dDim = this.weapon.c_diceDim;
dDim = weapon.c_diceDim;
    this.dMulti = 0.6f + (float)(this.weaponSkill.GetParent(this.CC).Value + this.weaponSkill.Value / 2 + this.CC.Evalue(flag2 ? 304 : (this.IsRanged ? 133 : 132))) / 50f;
dMulti = 0.6f + (float)(weaponSkill.GetParent(CC).Value + weaponSkill.Value / 2 + CC.Evalue(flag3 ? 304 : (IsRanged ? 133 : 132))) / 50f;
    this.dMulti += 0.05f * (float)this.CC.Evalue(this.IsRanged ? 1404 : 1400);
dMulti += 0.05f * (float)CC.Evalue(IsRanged ? 1404 : 1400);
    this.toHitBase = EClass.curve((this.IsCane ? this.CC.WIL : this.CC.DEX) / 4 + this.weaponSkill.GetParent(this.CC).Value / 3 + this.weaponSkill.Value, 50, 25, 75) + 50;
toHitBase = EClass.curve((IsCane ? CC.WIL : CC.DEX) / 4 + weaponSkill.GetParent(CC).Value / 3 + weaponSkill.Value, 50, 25) + 50;
    this.toHitFix = this.CC.HIT + this.weapon.HIT;
toHitFix = CC.HIT + weapon.HIT;
    this.penetration = this.weapon.Penetration + this.CC.Evalue(92);
penetration = weapon.Penetration + CC.Evalue(92);
    if (this.IsCane)
if (IsCane)
    {
{
        this.toHitBase += 50;
toHitBase += 50;
    }
}
}
}
if (this.ammo != null)
if (ammo != null && !(ammo.trait is TraitAmmoTalisman))
{
{
    this.dNumAmmo = ((this.ammo.source.offense.Length != 0) ? this.ammo.source.offense[0] : 0);
dNumAmmo = ((ammo.source.offense.Length != 0) ? ammo.source.offense[0] : 0);
    this.dDimAmmo = this.ammo.c_diceDim;
dDimAmmo = ammo.c_diceDim;
    this.dBonusAmmo = this.ammo.DMG;
dBonusAmmo = ammo.DMG + ammo.encLV;
    if (this.dNumAmmo < 1)
if (dNumAmmo < 1)
    {
{
        this.dNumAmmo = 1;
dNumAmmo = 1;
    }
}
    if (this.dDimAmmo < 1)
if (dDimAmmo < 1)
    {
{
        this.dDimAmmo = 1;
dDimAmmo = 1;
    }
}
    this.dBonus += this.ammo.DMG;
toHitFix += ammo.HIT;
    this.toHitFix += this.ammo.HIT;
}
}
else
else
{
{
    this.dNumAmmo = 0;
dNumAmmo = 0;
    this.dDimAmmo = 0;
dDimAmmo = 0;
}
}
</syntaxhighlight>プレイヤーは、戦術スキルを使用して近接武器を振るうか、または射撃スキルを使用して遠距離武器を撃ちます。
</syntaxhighlight>プレイヤーは、戦術スキルを使用して近接武器を振るうか、または射撃スキルを使用して遠距離武器を撃ちます。


武器が'''ワンド'''、または'''理力武器'''のエンチャントが付いている場合、戦術スキルまたは射撃スキルの代わりに'''詠唱'''スキルを、武器スキル(長剣、短剣、斧など)の代わりに'''魔道具'''スキルを使用します
武器が'''ワンド'''、または'''理力武器'''のエンチャントが付いている場合、戦術スキルまたは射撃スキルの代わりに'''詠唱'''スキルを、武器スキル(長剣、短剣、斧など)の代わりに'''魔道具'''スキルを使用します。
 
 
ダメージのダイス数及びダイス面は武器に表記されているものを使用します。
 
基礎ダメージ修正は「'''攻撃中の武器のダメージ修正 + 防具のダメージ修正合計 + キャラ固有のダメージ修正<ref name=":1" />'''」です。
 
ダメージ倍率は「'''0.6 + (武器スキルに対応する主能力 + 武器スキル / 2 + ('''近接武器は'''戦術'''、遠距離武器は'''射撃'''、ワンドまたは理力武器の場合'''魔道具)) / 50.0)'''」です'''。'''
 
プレイヤーが武器の知識フィートを持っている場合、ダメージ倍率に『0.05×(''武器の知識フィートのランク)』だけ加算されます。''<small>(事実上、+0.05または+0.10)</small>


ダメージボーナスは、'''プレイヤーのダメージボーナス''' + '''武器の改造道具によるダメージボーナス''' + '''武器のダメージボーナス'''です


ダメージ倍率は0.6 + ('''武器に対応する主能力''' + '''武器スキル / 2''' + (近接武器は'''戦術'''、遠距離武器は'''射撃'''、ワンドまたは理力武器の場合'''魔道具''')) / 50
貫通率は武器に表記されているものを使用します。<ref name=":2" />


プレイヤーが武器の知識/射撃の名手のフィートを持っている場合、割合追加ダメージが'''0.05 x (フィートランク)'''与えられます。''<sub>(事実上、+0.05または+0.10)</sub>''
基礎命中力は「'''(器用'''、ワンドか理力武器なら'''意志) / 4 + 武器スキルに対応する主能力 / 3 + 武器スキル''' 」を、スタート50、ステップ25、レート75%のCURVE関数で計算した後、'''50'''を足したものです。


命中率は('''器用'''、ワンドや理力武器なら'''意志''') / 4 + '''武器スキル''' / 3 + ['''戦術'''(近接武器の場合) or '''射撃'''(遠距離武器の場合) or '''魔道具'''(ワンドまたは理力武器の場合)''']''' で、最小値は'''25+50'''、最大値は'''75+50'''です。
命中力は「'''基礎命中力 +''' '''攻撃中の武器の命中修正 + 防具の命中修正合計 +''' (ワンドのみ:'''50'''、それ以外は'''0''')''''''です。


'''ワンド'''の命中率には、さらに+50が加わります


命中ボーナスは、'''キャラクターの命中ボーナス''' + '''武器の命中ボーナス''' + '''弾薬の命中ボーナス'''(弾薬を装填している場合)
さらに、弾薬を消費して攻撃した場合:


ダメージボーナスは、'''キャラクターのダメージボーナス''' + '''武器のダメージボーナス''' + '''弾薬の改造道具のダメージボーナス'''(弾薬を装填している場合)
ダメージ修正に「'''弾薬のダメージダイスを振った結果 + 弾薬のダメージ修正'''」を加算します。


貫通力は、'''キャラクターの貫通率''' + '''武器の貫通率'''
命中力に「'''弾薬の命中修正'''」を加算します。


==遠隔武器の命中率&ダメージと距離==
==遠隔武器の命中率&ダメージと距離==
Line 445: Line 495:
if (!isThrow)
if (!isThrow)
{
{
if (!IsRanged)
if (!IsRanged)
{
{
attackStyle = CC.body.GetAttackStyle();
attackStyle = CC.body.GetAttackStyle();
}
}
else if (TP != null)
else if (TP != null)
{
{
int num = CC.pos.Distance(TP);
int num = CC.pos.Distance(TP);
distMod = Mathf.Max(115 - 10 * Mathf.Abs(num - toolRange.BestDist) * 100 / (100 + weapon.Evalue(605) * 10), 80);
distMod = Mathf.Max(115 - 10 * Mathf.Abs(num - toolRange.BestDist) * 100 / (100 + weapon.Evalue(605) * 10), 80);
}
}
}
}
dMulti = dMulti * (float)distMod / 100f;
dMulti = dMulti * (float)distMod / 100f;
toHit = toHitBase + toHitFix;
toHit = toHitBase + toHitFix;
toHit = toHit * distMod / 100;
toHit = toHit * distMod / 100;
</syntaxhighlight>
</syntaxhighlight>


遠隔武器には、適正の攻撃距離があり、それによって命中率(toHit)とダメージ(dMulti)は修正されます。
遠隔武器には、適正の攻撃距離があり、それによって命中力とダメージ倍率が増減します。


Evalue(605)はmod_precisionであり、遠隔武器の改造道具の精密射撃レベルにあたります。
Evalue(605)はmod_precisionであり、遠隔武器の改造道具の精密射撃レベルにあたります。


適正攻撃距離に離れるほど、ペナルティも増えます。
適正攻撃距離から離れているほど、ペナルティも増えます。
 
精密射撃の改造道具のない場合、0(適正攻撃距離)の時は命中率、ダメージ共に115%になります、±1は105%、±2は95%、±3は85%、それ以降は80%になります。


[[Elin:武器#距離修正]]を参照すると、それが今(EA23.46)でも正しいことが分かります。
精密射撃の改造道具のない場合、0(適正攻撃距離)の時は命中力、ダメージ共に115%になります、±1は105%、±2は95%、±3は85%、それ以降は80%になります。


精密射撃MODは更に攻撃距離の影響を減少します。例えば精密射撃MODレベル10の場合、±1は110%、±2は105%…になります。
精密射撃MODは更に攻撃距離の影響を減少します。例えば精密射撃MODレベル10の場合、±1は110%、±2は105%…になります。


==魔法:魔法のパワー==
==魔法:魔法のパワー==
250

edits