Elin:解析/戦闘: Difference between revisions

From Ylvapedia
(→‎格闘: 計算式修正、および用語の表記ゆれをなくしました)
(敵軽減率について小数点以下切り捨てなことを明記、物理攻撃の計算式諸々についての記述の書き直し。)
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%…になります。


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

Revision as of 18:29, 21 January 2025


Evalueリスト

Value# Element 備考
(92) 貫通率
(108) 投擲
(132) 戦術
(133) 射撃
(305) 魔道具
(411) 魔法強化エンチャント
(482) 理力武器
(1400) 武器の知識フィート 1, 2
(1404) 射撃の名手フィート 1, 2


敵のレベルに応じたダメージ軽減

バージョン EA23.79: この記事は、Elin最新の安定版リリースに、少なくとも20のマイナーバージョンが遅れています。ページの更新をお願いします。

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

まず、レベル50以下の敵の軽減率は0%、レベル1074以上の敵は軽減率80%となります。

if (!this.IsPCFaction && this.LV > 50)
{
    dmg = dmg * (100 - (int)Mathf.Min(80f, Mathf.Sqrt((float)(this.LV - 50)) * 2.5f)) / 100;
}


プレイヤーのファクションに属するキャラで、敵のレベルがLv50より高い場合:

与えるダメージに、* (100 - [ 2.5 * √(敵のレベル - 50) か 80 かのうち小さいほう ][1]) / 100が掛けられます。

つまり、Lv1024以上の敵に対してはダメージが80%減少し、Lv51~Lv1073の敵に対しては[sqrt(敵Lv-50) * 2.5]%減少します。

レベル毎のダメージ軽減
敵のLv 軽減率(%)
51 2
100 17
150 25
200 30
250 35
300 39
350 43
400 46
450 50
500 53
550 55
600 58
650 61
700 63
750 66
800 68
850 70
900 72
950 75
1000 77
1050 79
1074 80
1100 80

命中率

バージョン EA23.46: この記事は、Elin最新の安定版リリースに、少なくとも20のマイナーバージョンが遅れています。ページの更新をお願いします。
バージョン EA23.46 のCURVE 関数の入力(オレンジ色)と出力(藍)です。Output = Curve(Input, 50, 25, 75)

「CURVE」とはElinにてどのようににスキル値の有効性を段階的に抑制する処理です。

CURVE( input, start, step, rate)
if input <= start
return input

repeat x10
{
 num = start + repeatindex * step
	if input <= num
	return input
else
	input = num + (input - num) * rate /100
}
return input

まず、システムは攻撃者の「命中力」とターゲットの「回避力」を評価します。

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

命中
武器の種類 計算式
投擲 CURVE([攻撃者の器用]/4 + [攻撃者の筋力]/2 + [攻撃者の武器スキル], 50, 25, 75) + 75(PCのファクション以外の場合250)
格闘 (盾なし) CURVE([攻撃者の器用]/3 + [攻撃者の武器の主能力]/3 + [攻撃者の武器スキル], 50, 25, 75) + 50
格闘 (盾あり) CURVE([攻撃者の器用]/3 + [攻撃者の武器の主能力]/3 + [攻撃者の武器スキル], 50, 25, 75) + 50 に0.75をかけたもの
ワンド CURVE([攻撃者の意志]/4 + [攻撃者の武器の主能力]/3 + [攻撃者の武器スキル], 50, 25, 75) + 100
その他すべての武器 CURVE([攻撃者の器用or意志]/4 + [攻撃者の武器の主能力]/3 + [攻撃者の武器スキル], 50, 25, 75) + 50

上記の式で算出した値に装備と武器による命中修正が足し算され、その後遠距離武器には距離による修正が適用されたものが「命中力」となります。


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


命中力・回避力に影響を与える以下の要素は、複合して作用しながら次の表の上から順で適用されます。[2]

命中修正
条件 効果
攻撃者が災い状態 命中力 = 命中力 * 0.75
攻撃者が高所にいる 命中力 = 命中力 * 1.2
攻撃者が乗馬している 命中力 = 命中力 * 100 / (100 + 500 / (5 or 10 + [攻撃者の乗馬スキル] の高い方)) (同じく補正値を掛け算)
攻撃者がペットを寄生させている 命中力 = 命中力 * 100 / (100 + 1000 /(5 or 10 + [攻撃者の共存スキル] の高い方)) (同じく補正値を掛け算)
騎乗されているペットによる攻撃 命中力 = 命中力 * 100 / (100 + 1000 / (5 or 10 + [攻撃者の筋力] の高い方)) (同じく補正値を掛け算)
寄生しているペットによる攻撃 命中力 = 命中力 * 100 / (100 + 1000 / (5 または 10 + [攻撃者の器用] の高い方)) (同じく補正値を掛け算)
攻撃者が両手持ち 命中力 = 命中力 + 25 + sqrt([攻撃者の両手持ちスキル] * 2) 
攻撃者が二刀流 命中力 = 命中力 * 100 / (115 + 手の番号 * 15 + 手の番号 *(2000 / (20 + [攻撃者の二刀流スキル])[0-100でクランプ[3]])
攻撃者が盲目 命中力 = 命中力 * 0.333 (または、遠距離/投擲の場合は0.1)
対象が盲目 回避力 = 回避力 * 0.5
対象が混乱もしくは朦朧 回避力 = 回避力 * 0.5
対象が高所にいる 回避力 = 回避力 * 1.2

二刀流の補足説明:

ここでいう、「手の番号」は利き手・もう片方の手と、カオスシェイプなどが持つ2本目以降の手を表します。

1-100の間でクランプされるのは(2000 / (20 + [攻撃者の二刀流スキル])だけです。つまり、二刀流で最適化するには、二刀流スキルが1980必要です。


ここまでで最終的な命中力と回避力を計算しました。以下では攻撃が命中するか、外れるか、クリティカルになるかするまで、上から順に判定します。

苛立エンチャントの効果による攻撃の場合、確定クリティカル
対象が朦朧状態の場合、4分の1の確率でクリティカル
対象が死亡または睡眠状態の場合、確定でクリティカル
[対象の見切りスキル] * 10 > 命中の場合、見切り成否判定を行う。

見切り力 = 回避 * 100 / 命中 とし、以下3つの式を上から順に処理する。[4]
見切り力 > 300 かつ、 random 0 - ([対象の見切りスキル] + 250) > 100 のとき、攻撃は外れる
見切り力 > 200 かつ、 random 0 - ([対象の見切りスキル] + 250) > 150 のとき、攻撃は外れる
見切り力 > 150 かつ、 random 0 - ([対象の見切りスキル] + 250) > 200 のとき、攻撃は外れる
[対象の完全回避] > random 0 - 99 のとき、攻撃は外れる (0から99までの値が等確率で選ばれて、それより完全回避が大きいか小さいかを判定に使う)
random 0 - 19 が 0 のとき、攻撃は命中 (5%で対象の回避を無視して命中する)[5]
random 0 - 19 が 0 のとき、攻撃は外れる (5%で攻撃者の命中を無視して外れる)
命中 < 1 のとき、攻撃は外れる
回避 < 1 のとき、攻撃は命中[5]
random 0 - 命中 < random 0 - (回避 * 125 (遠距離攻撃なら150) / 100) のとき、攻撃は外れる (random X-Yは等確率でXからYまでの乱数を生成する関数)
random 0 - 5000 < [攻撃者の感覚] + 50 のとき、攻撃はクリティカル
[攻撃者のクリティカルエンチャント合計] + sqrt([攻撃者の心眼スキル]) > random 0 - 200のとき、攻撃はクリティカル
攻撃者が[死の真髄]フィートを所持している場合、以下の判定を行う
   HP減少率 = 100 - [攻撃者の現在HP] * 100 / [攻撃者の最大HP]
   HP減少率 >= 50 & (HP減少率 ^ 4 / 3) > random 0 - 100000000 のとき、攻撃はクリティカル (HPが5割以上減っている状態で、減少率に応じて最小2%~最大33%の確率でクリティカル)
攻撃は命中

格闘

else if (IsMartial || IsMartialWeapon)
{
	weaponSkill = CC.elements.GetOrCreateElement(100);
	bool flag2 = weapon != null && weapon.Evalue(482) > 0;
	if (flag2)
	{
		weaponSkill = CC.elements.GetOrCreateElement(305);
	}
	attackType = ((!CC.race.meleeStyle.IsEmpty()) ? CC.race.meleeStyle.ToEnum<AttackType>() : ((EClass.rnd(2) == 0) ? AttackType.Kick : AttackType.Punch));
	dBonus = CC.DMG + CC.encLV + (int)Mathf.Sqrt(Mathf.Max(0, weaponSkill.GetParent(CC).Value / 5 + weaponSkill.Value / 4));
	dNum = 2 + Mathf.Min(weaponSkill.Value / 10, 4);
	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;
	dMulti += 0.05f * (float)CC.Evalue(1400);
	toHitBase = EClass.curve(CC.DEX / 3 + weaponSkill.GetParent(CC).Value / 3 + weaponSkill.Value, 50, 25) + 50;
	toHitFix = CC.HIT;
	if (attackStyle == AttackStyle.Shield)
			{
				toHitBase = toHitBase * 75 / 100;
			}
	penetration = Mathf.Clamp(weaponSkill.Value / 10 + 5, 5, 20) + CC.Evalue(92);
	if (IsMartialWeapon)
	{
		dBonus += weapon.DMG;
		dNum += weapon.source.offense[0];
		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>();
		}
	}
}

キャラクターは格闘スキルを使用して格闘攻撃を繰り出します。通常はパンチないしキックですが、武器の近接戦闘スタイルやキャラクターの特性に基づいて攻撃エフェクトは変わります。

武器に理力武器のエンチャントが付いている場合、格闘スキルの代わりに魔道具スキルを、戦術スキルの代わりに詠唱スキルを使用します。


素手及び通常の格闘武器の場合:

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

ダメージの基礎ダイス面は「5 + √(格闘 / 3)」です。

基礎ダメージ修正は「√((筋力 / 5) + (格闘 / 4)) + 防具のダメージ修正合計 + キャラ固有のダメージ修正[6]」です。

ダメージ倍率は「0.6 + ((筋力 / 2 + 格闘 / 2 + 戦術 / 2) / 50.0)」です

基礎貫通率は「(格闘 / 10) + 5」で、最低5%、最高で20%です。[7]

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


理力武器のエンチャントが付いた格闘武器の場合:

ダメージの基礎ダイス数は「2 + (魔道具 / 10)」で、最大で6です。

ダメージの基礎ダイス面は「5 + √(魔道具 / 3)」です。

基礎ダメージ修正は「√((魔力 / 5) + (魔道具 / 4)) + 防具のダメージ修正合計 + キャラ固有のダメージ修正[6]」です。

ダメージ倍率は「0.6 + ((魔力 / 2 + 魔道具 / 2 + 詠唱 / 2) / 50.0)」です

基礎貫通率は「(魔道具 / 10) + 5」で、最低5%、最高で20%です。[7]

基礎命中力は「(器用[8] / 3) + (魔力 / 3) + 魔道具」を、スタート50、ステップ25、レート75%のCURVE関数で計算した後、50を足したものです。


プレイヤーが武器の知識フィートを持っている場合、ダメージ倍率に『0.05×(武器の知識フィートのランク)』だけ加算されます。(事実上、+0.05または+0.10)

プレイヤーが盾を装備している場合、基礎命中力は0.75倍に修正されます。


さらに、格闘武器を装備している場合は以下の修正を受けます。

最終的なダイス数は「基礎ダイス数 + 武器の基礎ダイス数」です。

最終的なダイス面は「(基礎ダイス面 / 2) + 武器の基礎ダイス数」です。

最終的なダメージ修正は「基礎ダメージ修正 + 武器のダメージ修正」です。

最終的な命中力は「基礎命中力 + 武器の命中修正」です。

最終的な貫通率は「基礎貫通率 + 武器の貫通率」です。

投擲

if (isThrow)
{
	bool flag = weapon.HasTag(CTAG.throwWeapon) || weapon.HasTag(CTAG.throwWeaponEnemy);
	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(weapon.material.hardness, flag ? 40 : 20, 200);
	weaponSkill = CC.elements.GetOrCreateElement(108);
	attackType = AttackType.Blunt;
	dBonus = CC.DMG + (CC.IsPCParty ? 3 : 7);
	dNum = 2;
	dDim = (((!CC.IsPCParty) ? CC.LV : 0) + CC.STR + CC.Evalue(108)) * num2 * num3 / 10000 / 2;
	dMulti = 1f;
	toHitBase = EClass.curve(CC.DEX / 4 + CC.STR / 2 + weaponSkill.Value, 50, 25) + (CC.IsPCFaction ? 75 : 250);
	toHitFix = CC.HIT + weapon.HIT;
	penetration = 25;
}

プレイヤーの投げたアイテムは投擲武器であってもそうでなくても投擲スキルを参照します。

攻撃エフェクトは常に鈍器です。

重量値は 25 + 投擲武器限定75[9] + 3*√ [アイテムの重量] ですが、下限10、上限400+ 50*√(筋力)があります。

ここでいうアイテムの重量はゲーム中の〇.〇sに1000をかけたものです。

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


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

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

ダメージボーナスは「(プレイヤーパーティー内のキャラの場合:3、それ以外の場合:7) + 武器のダメージ修正 + 防具のダメージ修正合計 + キャラ固有のダメージ修正[6]」です。

ダメージ倍率は常に「1」です。

貫通力は常に25%です。

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

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

近接&遠隔武器

else
{
	if (IsRanged)
	{
		weaponSkill = CC.elements.GetOrCreateElement(toolRange.WeaponSkill);
	}
	else
	{
		weaponSkill = CC.elements.GetOrCreateElement(weapon.category.skill);
	}
	if (!weapon.source.attackType.IsEmpty())
	{
		attackType = weapon.source.attackType.ToEnum<AttackType>();
	}
	bool flag3 = IsCane || weapon.Evalue(482) > 0;
	if (flag3)
	{
		weaponSkill = CC.elements.GetOrCreateElement(305);
	}
	dBonus = CC.DMG + CC.encLV + weapon.DMG;
	dNum = weapon.source.offense[0];
	dDim = weapon.c_diceDim;
	dMulti = 0.6f + (float)(weaponSkill.GetParent(CC).Value + weaponSkill.Value / 2 + CC.Evalue(flag3 ? 304 : (IsRanged ? 133 : 132))) / 50f;
	dMulti += 0.05f * (float)CC.Evalue(IsRanged ? 1404 : 1400);
	toHitBase = EClass.curve((IsCane ? CC.WIL : CC.DEX) / 4 + weaponSkill.GetParent(CC).Value / 3 + weaponSkill.Value, 50, 25) + 50;
	toHitFix = CC.HIT + weapon.HIT;
	penetration = weapon.Penetration + CC.Evalue(92);
	if (IsCane)
	{
		toHitBase += 50;
	}
}
if (ammo != null && !(ammo.trait is TraitAmmoTalisman))
{
	dNumAmmo = ((ammo.source.offense.Length != 0) ? ammo.source.offense[0] : 0);
	dDimAmmo = ammo.c_diceDim;
	dBonusAmmo = ammo.DMG + ammo.encLV;
	if (dNumAmmo < 1)
	{
		dNumAmmo = 1;
	}
	if (dDimAmmo < 1)
	{
		dDimAmmo = 1;
	}
	toHitFix += ammo.HIT;
}
else
{
	dNumAmmo = 0;
	dDimAmmo = 0;
}

プレイヤーは、戦術スキルを使用して近接武器を振るうか、または射撃スキルを使用して遠距離武器を撃ちます。

武器がワンド、または理力武器のエンチャントが付いている場合、戦術スキルまたは射撃スキルの代わりに詠唱スキルを、武器スキル(長剣、短剣、斧など)の代わりに魔道具スキルを使用します。


ダメージのダイス数及びダイス面は武器に表記されているものを使用します。

基礎ダメージ修正は「攻撃中の武器のダメージ修正 + 防具のダメージ修正合計 + キャラ固有のダメージ修正[6]」です。

ダメージ倍率は「0.6 + (武器スキルに対応する主能力 + 武器スキル / 2 + (近接武器は戦術、遠距離武器は射撃、ワンドまたは理力武器の場合魔道具)) / 50.0)」です

プレイヤーが武器の知識フィートを持っている場合、ダメージ倍率に『0.05×(武器の知識フィートのランク)』だけ加算されます。(事実上、+0.05または+0.10)


貫通率は武器に表記されているものを使用します。[7]

基礎命中力は「(器用、ワンドか理力武器なら意志) / 4 + 武器スキルに対応する主能力 / 3 + 武器スキル 」を、スタート50、ステップ25、レート75%のCURVE関数で計算した後、50を足したものです。

命中力は「基礎命中力 + 攻撃中の武器の命中修正 + 防具の命中修正合計 + (ワンドのみ:50、それ以外は0)です。


さらに、弾薬を消費して攻撃した場合:

ダメージ修正に「弾薬のダメージダイスを振った結果 + 弾薬のダメージ修正」を加算します。

命中力に「弾薬の命中修正」を加算します。

遠隔武器の命中率&ダメージと距離

distMod = 100;

if (!isThrow)
{
	if (!IsRanged)
	{
		attackStyle = CC.body.GetAttackStyle();
	}
	else if (TP != null)
	{
		int num = CC.pos.Distance(TP);
		distMod = Mathf.Max(115 - 10 * Mathf.Abs(num - toolRange.BestDist) * 100 / (100 + weapon.Evalue(605) * 10), 80);
	}
}

dMulti = dMulti * (float)distMod / 100f;
toHit = toHitBase + toHitFix;
toHit = toHit * distMod / 100;

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

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

適正攻撃距離から離れているほど、ペナルティも増えます。

精密射撃の改造道具のない場合、0(適正攻撃距離)の時は命中力、ダメージ共に115%になります、±1は105%、±2は95%、±3は85%、それ以降は80%になります。

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

魔法:魔法のパワー

これはAbility.csの44行目です

ここに、NPCの魔法のパワーを決定するためにどの式を使用するかを記述したコードが書かれています

public override int GetPower(Card c)
{
int num = base. Value * 8 + 50;
if (!c.IsPC)
{
num = Mathf.Max(num, c.LV * 6 + 30);
if (c.IsPCFactionOrMinion && !base.source.aliasParent.IsEmpty())
{
num = Mathf.Max(num, c.Evalue(base.source.aliasParent) * 4 + 30);
} }.
}
num = EClass.curve(num, 400, 100, 75);
if (this is Spell)
{
num = num * (100 + c.Evalue(411)) / 100;
}
return num;
}.

ここではカーブ関数を使用します:

public static int curve(int a, int start, int step, int rate = 75)
{
if (a <= start)
{
return a;
}
for (int i = 0; i < 10; i++)
{
int num = start + i * step;
if (a <= num)
{
return a;
}
a = num + (a - num) * rate / 100;
}
return a;
} }.

プレイヤーの場合、魔法のパワーはcurve( (魔法レベル x 8 + 50), 400, 100, 75 ) x (100 + 魔法強化エンチャント) / 100 です

プレイヤー以外の場合、魔法のパワーは魔法レベル x 8 + 50 か、キャラレベル x 6 + 30 か、主能力×4 + 30の中の最も大きいものです


curve 関数について: curve(a, start, step, rate)

簡単に言うと、この関数は数値を圧縮するために使われます。

i = 0 をセットします。計算 num = start + i * step. anum を超えたら、超えた部分に rate / 100 を掛けます。その後、i を 1 ずつ増やします。上記のステップを 10 回繰り返します。

関数の曲線の傾きは徐々に小さくなり、(rate / 100)^10 となります。

魔法:攻撃魔法

ダイス数、ダイス面、ダメージボーナスは切り捨て。

標準偏差を含むEA23.71時点での各種魔法のダメージ。パラメータは魔力=100固定、x軸は魔法レベル、y軸は平均ダメージ
魔法 ダイス数 ダイス面 ダメージボーナス 備考
1+魔法のパワー/100+対応主能力/10 3+魔法のパワー/50 近接範囲
1+魔法のパワー/160+対応主能力/30 8+魔法のパワー/12 魔法のパワー/25 単体攻撃
光線 1+魔法のパワー/120+対応主能力/20 4+魔法のパワー/20 10マスにわたる直線上のすべてのターゲットにダメージを与える
1+魔法のパワー/70+対応主能力/20 2+魔法のパワー/35 発動者から5マスの範囲のボール内のすべてのターゲットにダメージを与える

ダメージ = ダメージ x 100 / (90 + 射程 x 10)

瘴気 2+魔法のパワー/150 5+魔法のパワー/80 ターンに1回ダメージを与える
ブレス 1+魔法のパワー/80+対応主能力/20 6+魔法のパワー/100 対応主能力/4 発動者から7マスにわたる35°の円錐内のすべてのターゲットにダメージを与える
メテオ 1+魔法のパワー/150 4+対応主能力*3 火炎属性固定

ダメージ 発動者から10マスの半径のボール内のすべてのターゲットにダメージを与えます。 壁でブロックされることがあります。 また、発動者にもダメージを与えます。

地震 1+魔法のパワー/30 2+対応主能力/3 衝撃属性固定

発動者から12マスの半径のボール内のすべてのターゲットにダメージを与えます。 重力デバフを持つ敵には、最大ダイスダメージの2倍のダメージを与えます。 浮遊効果を持つ敵には、ダメージの半分を与えます。

破呪 1+魔法のパワー/160+対応主能力/30 8+魔法のパワー/12 魔法のパワー/25 対象のすべてのデバフを除去し、周囲の敵にダメージを与えます。

対象に少なくとも1つのデバフがなければ効果はありません。

魔法:回復魔法

魔法 ダイス数 ダイス面 回復ボーナス 備考
軽傷治癒 1+魔法のパワー/50+Will/30 5+魔法のパワー/40 魔法のパワー/30
重傷治癒 2+魔法のパワー/40+Will/25 6+魔法のパワー/30 魔法のパワー/25
致命傷治癒 3+魔法のパワー/35+Will/20 7+魔法のパワー/25 魔法のパワー/20
Healing 4+魔法のパワー/30+Will/15 8+魔法のパワー/20 魔法のパワー/15
《エリス》の癒し 5+魔法のパワー/25+Will/10 9+魔法のパワー/15 魔法のパワー/10
《オディナ》の癒し 6+魔法のパワー/20+Will/5 10+魔法のパワー/10 魔法のパワー/5
《ジュア》の癒し 8+魔法のパワー/10+Will 15+魔法のパワー/5 魔法のパワー
自然の抱擁 1+魔法のパワー/125 4+魔法のパワー/75

魔法:バフ魔法

魔法 パワー 持続時間 備考
(属性)の唄 (魅力/40 + 1)*5 魔法のパワー/25 + 8 ここでいう「パワー」は、獲得できる属性耐性のこと
テレパシー 固定 魔法のパワー/5 + 15
透明化 魔法のパワー/30 + 5 魔法のパワー/12 + 6
透明可視 魔法のパワー/40 + 6 魔法のパワー/6 + 12
インコグニート 固定 魔法のパワー/2 + 20
猫の目 魔法のパワー/30 + 5 魔法のパワー*3
ホーリーヴェイル 固定 魔法のパワー/6 + 5
元素保護 魔法のパワー/200 + 5 魔法のパワー/15 + 8 ここでいう「パワー」は、獲得できる元素耐性のこと
英雄 筋力: 魔法のパワー/30 + 5

器用: 魔法のパワー/30 + 5

魔法のパワー/4 + 10
浮遊 固定 魔法のパワー/5 + 10
聖なる盾 魔法のパワー/15 + 15 魔法のパワー/3 + 10
知者 魔力: 魔法のパワー/40 + 6

学習: 魔法のパワー/40 + 6

読書: 魔法のパワー/40 + 3

魔法のパワー/4 + 10
ホウキ変容 固定 魔法のパワー + 30

魔法:デバフ魔法

魔法 パワー 持続時間 備考
瘴気 固定 魔法のパワー/100 + 5
グラビティ 固定 魔法のパワー/20 + 10
沈黙 固定 魔法のパワー/80 + 5
脆弱 固定 魔法のパワー/50 + 10
災い 魔法のパワー/30 + 50 魔法のパワー/50 + 10 ここでいう「パワー」は、運の低下量のこと
破門 固定 魔法のパワー/50 + 20
元素の傷跡 魔法のパワー/100 + 5 魔法のパワー/40 + 8 ここでいう「パワー」は、元素耐性の低下量のこと

魔法:召喚魔法

case EffectId.Funnel:
{
    if (EClass._zone.CountMinions(CC) > CC.MaxSummon || CC.c_uidMaster != 0)
    {
        CC.Say("summon_ally_fail", CC, null, null);
        return;
    }
    CC.Say("spell_funnel", CC, element.Name.ToLower(), null);
    CC.PlaySound("spell_funnel", 1f, true);
    Chara chara = CharaGen.Create("bit", -1);
    chara.SetMainElement(element.source.alias, element.Value, true);
    chara.SetSummon(20 + power / 20 + EClass.rnd(10));
    chara.SetLv(power / 15);
    EClass._zone.AddCard(chara, tp.GetNearestPoint(false, false, true, false));
    chara.PlayEffect("teleport", true, 0f, default(Vector3));
    chara.MakeMinion(CC, MinionType.Default);
    return;
}
魔法 持続時間 レベル 備考
具象 20 + rnd (10) + 魔法のパワー / 20 魔法のパワー / 15
動物召喚 死ぬまで 魔法レベル * (100 + 魔法のパワー / 10) / 100 + 魔法のパワー / 30
アンデッド妹召喚 死ぬまで 魔法レベル* (100 + 魔法のパワー / 10) / 100 + 魔法のパワー / 30
影召喚 死ぬまで 魔法のパワー / 10 + 1 自爆攻撃を行う
  1. 正確には小さい方を四捨五入したもの
  2. プログラムでは、X=X+1のように、同じ文字が一つの式に複数回登場して右辺にあるものが調整前の数字、左辺にあるものが調整後の数字になる記法があります。
  3. クランプとは値に上限と下限を適用するという意味です。この場合、確率なので0から100%に設定されています
  4. 見切り力が301以上であれば、見切りによる回避判定は3回行われる
  5. 5.0 5.1 この場合、クリティカルにはならない。
  6. 6.0 6.1 6.2 6.3 エーテル病の殺戮への飢えが該当する。
  7. 7.0 7.1 7.2 固有の貫通率を持っているキャラクターであればその値も加算される。
  8. 格闘以外の理力武器と違い、意志を使用しない
  9. 投擲武器でないときは0