Elin:解析/ダメージ計算: Difference between revisions

(新規作成。スタブページでの作業内容を移動。)
 
(ダメージ上限処理を追加。)
 
(8 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{解析}}
{{解析}}
{{バージョン|23.106}}
{{バージョン|23.212}}


DamageHP()を参照しています。
==処理順==
[[Elin:解析/物理戦闘|物理攻撃]]・[[Elin:解析/魔法|魔法攻撃]]・状態異常などで発生した'''補正前のダメージ'''は以下の順で処理され増減します。そののち、補正後のダメージをHP(とMP)に与えます。
[[Elin:解析/物理戦闘|物理攻撃]]・[[Elin:解析/魔法|魔法攻撃]]・状態異常などでのダメージ発生
古き狐の血統補正
反魔法無属性補正
属性耐性補正
魔法耐性補正
反魔法属性補正
濡れ補正
制圧補正
敵Lv補正
狂戦士補正
摂理補正
射撃防御補正
物理軽減(PDR)補正
属性軽減(EDR)補正
発見済み弱点補正
盾軽減補正
ダメージ耐性補正
大地の加護補正
狐守補正
オートコンバット補正
メタル補正
致命傷防御補正
暴力禁止による与ダメージ消滅
フェイルセーフ的符号確認
ダメージ上限処理
マナの体補正


==Evalue==
== ダメージ計算 ==
{| class="wikitable"
|+
|-
!値
!意味
|-
|(93)
|反魔法
|-
|(961)
|魔法耐性
|-
|55
|物理軽減
|-
|56
|属性軽減
|}


==PV==
=== 古き狐の血統補正 ===
<syntaxhighlight lang="c#">
if (origin != null && origin.HasElement(1208))
{
switch (attackSource)
{
case AttackSource.MagicHand:
dmg = dmg * 130 / 100;
eleP = eleP * 150 / 100;
break;
case AttackSource.MagicSword:
dmg = dmg * 120 / 100;
eleP = eleP * 150 / 100;
break;
}
}
</syntaxhighlight>攻撃者が古き狐の血統フィートを持つ場合、手魔法のダメージを'''「1.3」'''倍、剣魔法のダメージを'''「1.2」'''倍にします。


=== 反魔法無属性補正===
<syntaxhighlight lang="c#">
if (ele == 0 || ele == 926)
{
e = Element.Void;
if (origin != null)
{
dmg = dmg * Mathf.Max(100 + origin.Evalue(93) / 2, 10) / 100;
}
}
</syntaxhighlight>反魔法エンチャントの値に応じて、無属性の攻撃のダメージを増減させます。


ApplyProtection(int dmg, int mod = 100)
ダメージ倍率は以下の通りです。<ref>反魔法エンチャントは生成時に呪われた装備が負の値を取りえるため、0.1倍を下限としてダメージが減少することがあります。</ref>
    {
        int armorSkill = GetArmorSkill();
        Element orCreateElement = elements.GetOrCreateElement(armorSkill);
        int num = PV + orCreateElement.Value + DEX / 10;
        int num2 = 1;
        int sides = 1;
        int bonus = 0;
        if (num > 0)
        {
            int num3 = num / 4;
            num2 = num3 / 10 + 1;
            sides = num3 / num2 + 1;
            bonus = 0;
            dmg = dmg * 100 / (100 + num);
        }
        int num4 = Dice.Roll(num2, sides, bonus, this);
        dmg -= num4 * mod / 100;
        if (dmg < 0)
        {
            dmg = 0;
        }
        return dmg;
    }
軽装備か重装備かを取得します。


PV + 軽or重装備のスキル + 器用/10として変数numを定めて、
ダメージ = ダメージ × MAX(1 + 反魔法エンチャント強度 × 0.005, 0.1)


その値が正である場合、4で割った値を変数num3に保管し、num2=num3/10 +1とし、
===属性耐性補正===
<syntaxhighlight lang="c#">
if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
{
int num2 = ((origin != null) ? origin.Evalue(1238) : 0);
if (attackSource == AttackSource.MagicSword)
{
num3 += 2;
if (origin.HasElement(1247))
{
num3++;
}
}
if (attackSource == AttackSource.MagicArrow && origin != null && origin.HasElement(1244))
{
num3++;
}
if (attackSource == AttackSource.MagicHand && origin != null && origin.HasElement(1246))
{
num3++;
}
dmg = Element.GetResistDamage(dmg, Evalue(e.source.aliasRef), num2);
...
public static int GetResistDamage(int dmg, int v, int power = 0)
{
int num = GetResistLv(v);
if (power > 0 && num > 0)
{
num = Mathf.Max(num - power, 0);
}
if (num >= 4)
{
return 0;
}
return num switch
{
3 => dmg / 4,
2 => dmg / 3,
1 => dmg / 2,
0 => dmg,
-1 => dmg * 3 / 2,
-2 => dmg * 2,
_ => dmg * 2,
};
}
...
public static int GetResistLv(int v)
{
int num = v / 5;
if (num < -2)
{
num = -2;
}
if (num > 4)
{
num = 4;
}
return num;
}
</syntaxhighlight>
無属性以外で、マナの反動によるダメージでないものは属性耐性によるダメージ増減が行われます。


更にそこから sides = num3/num2 + 1を定義し、bonus=0とします。
まず、攻撃対象の属性耐性評価を算出します。
属性耐性評価 = CLAMP<ref name=":0">値を一定範囲内に制限する関数です。
           
            関数内の1つめの引数の値は、「2つめの引数の値」~「3つめの引数の値」の範囲内になるよう補正されます。</ref>(該当する属性耐性 / 5, -2, 4)
※ゲーム内では耐性25以上は「免疫+」と評価されますが、現状特に意味はありません。
次に、攻撃者の属性貫通力を算出します。
属性貫通力 = 古代種フィートLv + (0、剣魔法のみ2) + (0、天秤座フィートを持つキャラクターの剣魔法の場合1) + (0、射手座フィートを持つキャラクターの矢魔法のみ1) + (0、ペガサス座フィートを持つキャラクターの手魔法の場合1)
属性耐性評価と属性貫通力が共に1以上であれば、最終的な属性耐性評価を減らします。ただし、これによって属性耐性評価が0未満になることはありません。
属性耐性評価 = MAX(属性耐性評価 - 属性貫通力, 0)
最終的な属性耐性評価の値に応じて、ダメージを増減させます。ダメージ倍率は以下の通りです。<ref>EA23.212にてダメージオーバーフローの対策が行われたが、


そののち、ダメージを100/(100+num)倍にします。
属性耐性補正の計算時にはint32型が用いられるためオーバーフローする可能性がある。</ref>
 
{| class="wikitable"
さらに、Dice.cs中のRoll関数を用いて、運は被ダメージ者のもの、ダイス数はnum2、面数はsides、ボーナスは0で[[Elin:解析/共通処理|ダイスロール]]をします。
|+
 
!-2 (致命的な弱点)
ダメージからnum4 * 100<ref>この100は冒頭で出てきたmodであり、バランス調整用に変数になっているものの、ただの定数値だと考えられます。。</ref> / 100 を引き算します。
! -1 (弱点)
 
!0 (なし)
最後に、ダメージが負になっていたら0に変更します。
!1 (耐性)
 
!2 (強い耐性)
==ダメージ計算==
!3 (素晴らしい耐性)
! 4 (免疫)  
|-
| ×2
|×1.5
|×1
|×0.5
| ×0.333
|×0.25
| ×0
|}


上から見ていくので、計算の順序もこの通りになります。
=== 魔法耐性補正 ===
===反魔法による物理ダメージ増加===
<syntaxhighlight>
Element e;
if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
        if (ele == 0 || ele == 926)
{
        {
...
            e = Element.Void;
dmg = dmg * 100 / (100 + Mathf.Clamp(Evalue(961) * 5, -50, 200));
            if (origin != null)
...
            {
</syntaxhighlight>無属性以外で、マナの反動によるダメージでないものは'''属性耐性と重複して魔法属性耐性によるダメージ増減が行われます。'''
                dmg = dmg * Mathf.Max(100 + origin.Evalue(93) / 2, 10) / 100;
            }
        }
       
この箇所は攻撃属性ごとの処理をしていて、Voidが物理に相当し、物理は攻撃者の反魔法によって強化されます。
強度を2で割ったあまり%だけ上昇します。ただし、下限10により、反魔法が負の大きい強度であっても最低限のダメージが出ます。


  else
ダメージ倍率は以下の通りです。
        {
ダメージ = ダメージ / (1 + CLAMP<ref name=":0" />(魔法属性耐性 × 0.05, -0.5, 2))
            e = Element.Create(ele);
最大でダメージ'''「2倍」'''(魔法属性耐性-10)、最小でダメージ'''「0.333倍」'''(魔法属性耐性40)となります。
            if (attackSource != AttackSource.Condition && showEffect)
            {
                ActEffect.TryDelay(delegate
                {
                    PlayEffect(e.id, useRenderPos: true, 0.25f);
                    EClass.Sound.Play("atk_" + e.source.alias);
                });
不明。演出関連か?


=== 属性耐性による軽減 ===
=== 反魔法属性補正===
まずElement.cs中のGetResistLvを見ると、
<syntaxhighlight lang="c#">
  {
if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
        int num = v / 5;
{
        if (num < -2)
...
        {
dmg = dmg * Mathf.Max(100 - Evalue(93), 10) / 100;
            num = -2;
...
        }
</syntaxhighlight>無属性以外で、マナの反動によるダメージでないものは属性耐性と重複して攻撃対象の反魔法エンチャントによるダメージ増減が行われます。
        if (num > 4)
        {
            num = 4;
        }
        return num;
    }
耐性値を5で割った商を求め、それを必要であれば下限-2、上限4に押し込めます。この値はゲーム内で見られる"免疫"などの耐性評価と一致します。


次に同じくElement.cs中のGetResisistDamageを見ると、
ダメージ倍率は以下の通りです。<ref>反魔法エンチャントは生成時に呪われた装備が負の値を取りえるため、ダメージが増加することがあります。この場合の上限はありません。</ref>
  {
ダメージ = ダメージ × MAX(1 - 反魔法エンチャント強度 × 0.01, 0.1)
        int resistLv = GetResistLv(v);
ダメージ減少の上限は'''「0.1」'''倍で、上限となるエンチャント強度は'''「90」'''です。
        resistLv -= power;
        if (resistLv >= 4)
        {
            return 0;
        }
        return resistLv switch
        {
            3 => dmg / 4,
            2 => dmg / 3,
            1 => dmg / 2,
            0 => dmg,
            -1 => dmg * 3 / 2,
            -2 => dmg * 2,
            _ => dmg * 2,
        };
    }
耐性評価を計算した後、そこからpowerの数値分減らしています。これは古代種フィートの耐性貫通だと考えられます。
その後、4以上ならダメージ0倍、3なら0.25倍と、よく知られている属性軽減が起きます。
 
実際に計算に組み込まれているのはDamageHP中の以下の箇所です。
    if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
            {
                dmg = Element.GetResistDamage(dmg, Evalue(e.source.aliasRef), (origin != null) ? origin.Evalue(1238) : 0);
                dmg = dmg * 100 / (100 + Mathf.Clamp(Evalue(961) * 5, -50, 200));
                dmg = dmg * Mathf.Max(100 - Evalue(93), 10) / 100;
            }
属性が無でなく、ダメージ源がマナの反動ではないとき、
属性耐性に応じたダメージ軽減が起き、(Evalue.1238は不明)。
次の行で、魔法耐性の、属性全般軽減が起きます。
これは100/(100+魔法耐性*5)をかけるというものです。
ただし、魔法耐性*5は下限-50、上限200に押し込められます。
最後に、反魔法による属性軽減があり、
これは(100-強度)/100 をかけるというものです。
ただし、100-強度には下限100があります。


===濡れ補正===
===濡れ補正===
switch (e.id)
<syntaxhighlight lang="c#">
            {
switch (e.id)
            case 910:
{
            {
    case 910:
                Chara chara2 = Chara;
{
                if (chara2 != null && chara2.isWet)
Chara chara2 = Chara;
                {
if (chara2 != null && chara2.isWet)
                    dmg /= 3;
{
                }
dmg /= 3L;
                break;
}
            }
break;
            case 912:
}
            {
case 912:
                Chara chara = Chara;
{
                if (chara != null && chara.isWet)
Chara chara = Chara;
                {
if (chara != null && chara.isWet)
                    dmg = dmg * 150 / 100;
{
                }
dmg = dmg * 150 / 100;
                break;
}
            }
break;
濡れ状態でダメージが増減する処理です。
}
 
}
火炎は濡れ状態でダメージ三分の一。
</syntaxhighlight>攻撃対象が濡れ状態の場合、火炎属性はダメージが'''「0.333」'''倍、電撃属性はダメージ'''「1.5」'''倍になります。
 
電撃はダメージ1.5倍。
 
===制圧による与ダメージ減少===
if (origin != null && origin.isChara && origin.Chara.HasCondition<ConSupress>())
        {
            dmg = dmg * 2 / 3;
        }
制圧状態のキャラの与ダメージが減る処理です。
 
ダメージが、2/3倍になります。
 
※ここからはしばらく、AttackTypeがFinishでないときの計算です。
===敵のレベルに応じたダメージ軽減===
 
 
レベル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;
}


===制圧補正===
<syntaxhighlight lang="c#">
if (origin != null && origin.isChara && origin.Chara.HasCondition<ConSupress>())
{
dmg = dmg * 2 / 3;
}
</syntaxhighlight>攻撃者が制圧状態場合、ダメージが、'''「0.667」'''倍になります。


===敵Lv補正===
<syntaxhighlight lang="c#">
if (!IsPCFaction && LV > 50)
{
dmg = dmg * (100 - (int)Mathf.Min(80f, Mathf.Sqrt(LV - 50) * 2.5f)) / 100;
}
</syntaxhighlight>
レベル50を超えるPC勢力以外の攻撃対象が受けるあらゆるダメージは軽減されます。


プレイヤーのファクションに属さないキャラで、レベルがLv50より高い場合:
ダメージ倍率は以下の通りです。


与えるダメージに、* (100 - [  2.5 * √(敵のレベル - 50) か 80 かのうち小さいほう ]<ref>正確には小さい方を四捨五入したもの</ref>) / 100が掛けられます。
ダメージ = ダメージ × (1 - Min(0.025 × √(攻撃対象Lv - 50), 0.8))


つまり、Lv1074以上の敵に対してはダメージが80%減少し、Lv51~Lv1073の敵に対しては[sqrt(敵Lv-50) * 2.5]%減少します。
この軽減は攻撃対象が'''Lv1074の時最大'''となり、ダメージ倍率は'''「0.2」'''倍となります。以下は敵Lvごとのダメージ倍率の簡易表です。
{| class="wikitable"
{| class="wikitable"
|+レベル毎のダメージ軽減
|+レベル毎のダメージ軽減
!敵のLv
!敵のLv
!軽減率(%)
!ダメージ倍率
|-
|-
|51
|51
|2
|×0.98
|-
|-
|100
|100  
|17
|×0.83
|-
|-
|150
|150
|25
|×0.75
|-
|-
|200
|200
|30
|×0.70
|-
|-
|250
|250
|35
|×0.65
|-
|-
|300
|300
|39
|×0.61
|-
|-
|350
|350
|43
|×0.57
|-
|-
|400
|400
|46
|×0.54
|-
|-
|450
|450
|50
|×0.50
|-
|-
|500
|500
|53
| ×0.47
|-
|-
|550
|550
|55
|×0.45
|-
|-
|600
|600
|58
|×0.42
|-
|-
|650
|650
|61
|×0.39
|-
|-
|700
|700
|63
|×0.37
|-
|-
|750
|750
|66
|×0.34
|-
|-
|800
|800
|68
|×0.32
|-
|-
|850
|850
|70
|×0.30
|-
|-
|900
|900
|72
|×0.28
|-
|-
|950
|950
|75
|×0.25
|-
|-
|1000
| 1000
|77
|×0.23
|-
|-
|1050
|1050
|79
|×0.21
|-
|-
|1074
|1074
|80
|×0.20
|-
|-
|1100
|1100
|80
|×0.20
|}
|}
===物理軽減と属性軽減によるダメージ減少===
dmg = dmg * Mathf.Max(0, 100 - Evalue((e == Element.Void || e.id == 926) ? 55 : 56)) / 100;
属性が無いなら物理軽減、あるなら属性軽減を用いて、ダメージを(100-その値)/100内にします。


100-その値の下限は0となっており、ダメージがマイナスになるのを防いでいます。
===狂戦士補正===
<syntaxhighlight lang="c#">
if (origin != null && origin.HasCondition<ConBerserk>())
{
dmg = dmg * 3 / 2;
}
</syntaxhighlight>狂戦士化状態の攻撃者による、状態異常や瘴気など<ref name=":1">暴力禁止エンチャント有効下でダメージを与えられるもの、つまり攻撃者の認識ができないもの。</ref>以外のあらゆるダメージを'''「1.5」'''倍にします。


これらの軽減は基本的には種族特性ですが、信仰AFの一部にはこれらを上昇させるものが存在します。
===摂理補正===
<syntaxhighlight>
if (EClass.game.principal.enableDamageReduction && IsPCFaction)
{
int num3 = ((origin != null) ? origin.LV : EClass._zone.DangerLv);
if (num3 > 50)
{
dmg = dmg * (100 - (int)Mathf.Min(95f, Mathf.Sqrt(num3 - 50))) / 100;
}
}
</syntaxhighlight>「高レベル帯での敵の与えるダメージを減衰する」摂理が有効のとき、PC勢力がLv51以上のキャラクターから受けるあらゆるダメージを軽減します。


===弱点の知識による与ダメージ減少===
ダメージ倍率は以下の通りです。
ダメージ = ダメージ × (1 - MIN(0.01 × √('''攻撃者Lv''' - 50), 0.95))


if (origin != null && origin.IsPC && EClass.player.codex.Has(id))
            {
                dmg = dmg * (100 + Mathf.Min(10, EClass.player.codex.GetOrCreate(id).weakspot)) / 100;
            }
危ない本かカード収集によるそのモンスターへの与ダメージ増加を示しています。


(100+収集数<ref>未確認</ref>)%増加します。
また危険度51階以上のフロアでは、状態異常や瘴気など<ref name=":1" />によるダメージをフロアの危険度に応じてダメージを軽減します。


ただし、上限は110%です。
ダメージ倍率は以下の通りです。
ダメージ = ダメージ × (1 - MIN(0.01 × √('''フロア危険度''' - 50), 0.95))


===盾による軽減===
=== 射撃防御補正 ===
            if (isChara && Chara.body.GetAttackStyle() == AttackStyle.Shield && elements.ValueWithoutLink(123) >= 5 && (e == Element.Void || e.id == 926))
<syntaxhighlight lang="c#">
            {
if (attackSource == AttackSource.Throw || attackSource == AttackSource.Range)
                dmg = dmg * 90 / 100;
{
            }
dmg = dmg * 100 / (100 + Evalue(435) * 2);
スタイルが盾持ちのキャラにはダメージが0.9倍になります。
}
</syntaxhighlight>射撃防御を持つキャラクターが受ける投擲・遠隔武器によるダメージを軽減します。


===ダメージ耐性===
ダメージ倍率は以下の通りです。
ダメージ = ダメージ / (1 + 射撃防御強度 × 0.02)


if (Evalue(971) > 0)
===物理軽減(PDR)補正===
            {
<syntaxhighlight lang="c#">
                dmg = dmg * 100 / Mathf.Clamp(100 + Evalue(971), 25, 1000);
bool flag = originalTarget != null;
            }
...
dmg = dmg * Mathf.Max(0, 100 - Mathf.Min(Evalue((e == Element.Void || e.id == 926) ? 55 : 56), 100) / ((!flag) ? 1 : 2)) / 100;
</syntaxhighlight>あらゆる無属性ダメージを、物理軽減(種族特性や「それは物理軽減をXX%上昇させる」エンチャントによるもの)を用いて軽減します。


ダメージ耐性を持つなら、被ダメージが100/(100+その値)倍になります。
ダメージ倍率は以下の通りです。
ダメージ = ダメージ × MAX((1 - MIN(物理軽減強度 × 0.01, 1) × (1、肉の壁フィートによるダメージのみ0.5)), 0)
物理軽減が'''100以上'''の場合、無属性ダメージは0ダメージになります。('''肉の壁フィートによるダメージを除く。''')


ただし、(100+その値)は下限25、上限1000に押し込められます。
肉の壁フィートによるダメージの場合は物理軽減の効果が'''半減'''し、'''物理軽減「100」の「0.5」倍が上限となります。'''


ダメージ耐性は詳細は不明ですが、内部的には物理という属性への耐性であり、物理属性は通常の属性軽減の式では計算が除外されていることから、
===属性軽減(EDR)補正===
<syntaxhighlight lang="c#">
bool flag = originalTarget != null;
...
dmg = dmg * Mathf.Max(0, 100 - Mathf.Min(Evalue((e == Element.Void || e.id == 926) ? 55 : 56), 100) / ((!flag) ? 1 : 2)) / 100;
</syntaxhighlight>あらゆる属性ダメージを、属性軽減(種族特性や「それは属性軽減をXX%上昇させる」エンチャントによるもの)を用いて軽減します。


ここで計算している可能性があります。魔法属性のファンネルが無属性に弱点であり、この計算式に関連する可能性があります。
ダメージ倍率は以下の通りです。
ダメージ = ダメージ × MAX((1 - MIN(属性軽減強度 × 0.01, 1) × (1、肉の壁フィートによるダメージのみ0.5)), 0)
属性軽減が'''100以上'''の場合、属性ダメージは0ダメージになります。('''肉の壁フィートによるダメージを除く'''。)


===大地の加護===
肉の壁フィートによるダメージの場合は属性軽減の効果が'''半減'''し、'''属性軽減「100」の「0.5」倍が上限となります。'''
            if (HasElement(1305))
            {
                dmg = dmg * 90 / 100;
            }


オパートス信仰による大地の加護を持つなら被ダメージが0.9倍。
=== 発見済み弱点補正 ===
<syntaxhighlight lang="c#">
if (origin != null && origin.IsPC && EClass.player.codex.Has(id))
{
dmg = dmg * (100 + Mathf.Min(10, EClass.player.codex.GetOrCreate(id).weakspot)) / 100;
}
</syntaxhighlight>攻撃対象の弱点を発見している場合、'''PCによる攻撃のみ'''、状態異常や瘴気など<ref name=":1" />以外のあらゆるダメージが増加します。


===狐守===
ダメージ倍率は以下の通りです。
            if (EClass.pc.HasElement(1207) && isChara)
ダメージ = ダメージ × (1 + MIN(対応する発見済み弱点数 × 0.01, 0.1))
            {
発見済み弱点数x'''10'''の'''「1.1」'''倍が上限です。
                int num = 0;
                int num2 = 0;
                foreach (Condition condition2 in Chara.conditions)
                {
                    if (condition2.Type == ConditionType.Buff)
                    {
                        num++;
                    }
                    else if (condition2.Type == ConditionType.Debuff)
                    {
                        num2++;
                    }
                }
                if (IsPCParty)
                {
                    dmg = dmg * 100 / Mathf.Min(100 + num * 5, 120);
                }
                else
                {
                    dmg = dmg * Mathf.Min(100 + num2 * 5, 120) / 100;
                }
            }
プレイヤーが狐守フィートを持っていると、
まず、バフの数をnum、デバフの数をnum2として、
プレイヤーのパーティ内のキャラなら、被ダメージが100/(100+num*5)倍になります。ただし、(100+num*5)は上限120を持ちます。
そうでないとき、被ダメージが(100+num*5)/100倍になります。ただし、(100+num*5)は上限120を持ちます。


フィートの説明文に反して、だれがつけたバフ・デバフであろうと、狐守持ちのプレイヤーがいれば発動する効果のようです。
===盾軽減補正===
<syntaxhighlight lang="c#">
if (isChara && Chara.body.GetAttackStyle() == AttackStyle.Shield && elements.ValueWithoutLink(123) >= 5 && (e == Element.Void || e.id == 926))
{
dmg = dmg * 90 / 100;
}
</syntaxhighlight>攻撃対象のスタイルが盾持ち且つ盾スキルが5以上の場合、無属性ダメージが'''「0.9」'''倍になります。


味方ミニオンへの配慮がないために、味方ミニオンが敵からデバフをもらうと、被ダメージが増加すると考えられます。
=== ダメージ耐性補正 ===
<syntaxhighlight lang="c#">
if (Evalue(971) > 0)
{
dmg = dmg * 100 / Mathf.Clamp(100 + Evalue(971), 25, 1000);
}
</syntaxhighlight>ダメージ耐性の値に応じてあらゆるダメージを軽減します。


===オートコンバット時の被ダメージ減少===
ダメージ倍率は以下の通りです。
            if (IsPCParty && EClass.pc.ai is GoalAutoCombat)
ダメージ = ダメージ / CLAMP<ref name=":0" />((1 + ダメージ耐性強度 × 0.01), 0.25, 10))
            {
'''主要属性が魔法属性'''のキャラクターのみダメージ耐性'''「-10」'''をもち、それ以外では使われていません。(事実上、主要属性が魔法属性のキャラクターに'''「1.11」'''倍)
                dmg = dmg * 100 / Mathf.Clamp(105 + EClass.pc.Evalue(135) / 10, 10, 110);
===大地の加護補正 ===
            }
<syntaxhighlight lang="c#">
if (HasElement(1305))  
{
    dmg = dmg * 90 / 100;  
}
</syntaxhighlight>攻撃対象がオパートス信仰による大地の加護を持つ場合、ダメージを'''「0.9」'''倍します。


プレイヤーのパーティ内のキャラなら、オートコンバット中はダメージが100/(105+戦略スキル/10)倍になります。
===狐守補正===
<syntaxhighlight lang="c#">
if (EClass.pc.HasElement(1207) && isChara)
{
int num4 = 0;
int num5 = 0;
foreach (Condition condition2 in Chara.conditions)
{
if (condition2.Type == ConditionType.Buff)
{
num4++;
}
else if (condition2.Type == ConditionType.Debuff)
{
num5++;
}
}
if (IsPCParty)
{
dmg = dmg * 100 / Mathf.Min(100 + num4 * 5, 120);
}
else
{
dmg = dmg * Mathf.Min(100 + num5 * 5, 120) / 100;
}
}
</syntaxhighlight>


ただし、(105+戦略スキル/10)は下限10、上限110に押し込められます。
'''プレイヤーが狐守フィートを持っている場合'''<ref>PC以外が持っていても効果がない。</ref>、攻撃対象がPCパーティー内にいた場合のあらゆるダメージをバフ数に応じて軽減し、攻撃対象がPCパーティー外にいた場合のあらゆるダメージ<ref>状態異常や瘴気、PCパーティーと全く関係のないダメージも増加する。</ref>がデバフ数に応じて増加します。


つまり、戦略スキル50で軽減が上限に達します。
与ダメージ倍率は以下の通りです。
ダメージ = ダメージ × MIN(1 + 攻撃対象デバフ数 × 0.05, 1.2)
被ダメージ倍率は以下の通りです。
ダメージ = ダメージ / MIN(1 + 攻撃対象バフ数 × 0.05, 1.2)
バフ・デバフ数が'''「5」個以上'''の時効果が最大となり、与ダメージは'''「1.2」'''倍、被ダメージは'''「0.83」'''倍となります。


===メタルフィートによるダメージ軽減===
=== オートコンバット補正===
            if (HasElement(1218))
<syntaxhighlight lang="c#">
            {
if (IsPCParty && EClass.pc.ai is GoalAutoCombat)
                dmg = dmg * (1000 - Evalue(1218)) / 1000;
{
                if (dmg <= 0 && EClass.rnd(4) == 0)
dmg = dmg * 100 / Mathf.Clamp(105 + EClass.pc.Evalue(135) / 10, 10, 110);
                {
}
                    dmg++;
</syntaxhighlight>オートコンバット中、PCパーティ内にいるキャラクターが受けるあらゆるダメージを軽減します。
                }
            }
メタルによるダメージ軽減です。


まず、ダメージが(1000-メタルのフィートLv.)/1000倍になります。メタルのフィートLv.は基本的に999なので、
ダメージ倍率は以下の通りです。
ダメージ = ダメージ / CLAMP(1.05 + PCの戦略スキル × 0.001, 0.1, 1.1)
戦略スキルが'''「50」'''の時効果が最大となり、'''「0.91」'''倍となります。


ダメージは1000分の一になります。
呪われた装備で戦略スキルがマイナスの場合は逆にダメージが増加します。('''「10」'''倍まで)


そして、ダメージが0以下かつ、0-3が均等に出る乱数で0が出たとき、
===メタル補正===
<syntaxhighlight lang="c#">
if (HasElement(1218) && attackSource != AttackSource.ManaBackfire && (hp > 0 || Evalue(1421) <= 0))
{
dmg = dmg * (1000 - Mathf.Min(Evalue(1218), 1000) / ((!flag) ? 1 : 2)) / 1000;
if (dmg <= 0 && EClass.rnd(4) == 0)
{
dmg++;
}
}
</syntaxhighlight>攻撃対象がメタルフィートを持つ場合、あらゆるダメージを軽減します。ただし、マナの反動によるダメージやマナの体のフィートの効果でHP0に踏みとどまっている場合は軽減されません。


ダメージが1増えます。
ダメージ倍率は以下の通りです。
ダメージ = ダメージ × (1 - MIN(メタルフィートLv × 0.001, 1) × (1、肉の壁フィートによるダメージの場合0.5))
種族メタルのメタルフィートLvは999で、ダメージは'''「0.001」'''倍になります。


これはメタルにほとんどダメージを与えられない時でも、ときどきダメージが入る現象を起こしています。
遺伝子合成でメタルフィートを1付与した場合、ダメージは'''「0.999」'''倍になります。


===致命傷防御によるダメージ軽減===
肉の壁フィートによるダメージの場合、効果が'''半減'''します。
            if (dmg >= MaxHP / 10 && Evalue(68) > 0)
            {
                int num3 = MaxHP / 10;
                int num4 = dmg - num3;
                num4 = num4 * 100 / (200 + Evalue(68) * 10);
                dmg = num3 + num4;
            }
致命傷防御を持っているとき、被ダメージが最大HPの10%を超えるようであれば、ダメージは、num3 + num4になります。


num3は最大HPの10%で、


num4は元のダメージが最大HPの10%を超えた量に、100/(200 + 致命傷防御の値*10)をかけたものです。
また、'''元々の攻撃力やこれまでのダメージ増減を全て含めて'''メタル補正による軽減後のダメージが0だった場合、'''「25%」'''の確率でダメージが'''「1」'''になります。


現状、致命傷防御は黄金の騎士で100、防衛者で50です。
これはメタルにダメージを与えられない時でも、時々1ダメージが入る現象を起こしています。


※ここからはAttackTypeがFinishでも発生します。
また、メタル補正前のダメージが0だったとしても、時々1ダメージが入る現象を起こします。


===暴力禁止による与ダメージ消滅===
=== 致命傷防御補正 ===
        if (origin != null && origin.IsPC && EClass.pc.Evalue(654) > 0)
<syntaxhighlight lang="c#">
        {
if (dmg >= MaxHP / 10 && Evalue(68) > 0)
            dmg = 0;
{
        }
int num6 = MaxHP / 10;
子狐丸の、暴力禁止エンチャントの効果です。
    int num7 = dmg - num6;
num7 = num7 * 100 / (200 + Evalue(68) * 10);
dmg = num6 + num7;
}
</syntaxhighlight>攻撃対象が致命傷防御を持っているとき、致命傷防御補正による軽減前のダメージが攻撃対象の最大HPの10%以上なら、ダメージが軽減されます。
軽減後ダメージは以下の通りです。
ダメージ = (攻撃対象最大HP / 10) + ((ダメージ - 攻撃対象最大HP / 10) / (2 + 致命傷防御強度 × 0.1))


ダメージがプレイヤーに由来するなら0にします。
=== 暴力禁止による与ダメージ消滅===
<syntaxhighlight lang="c#">
if (origin != null && origin.IsPC && EClass.pc.Evalue(654) > 0)
{
    dmg = 0;
}
</syntaxhighlight>暴力禁止エンチャントがPCに付与されている場合、プレイヤーに由来するダメージを0にします。


===フェイルセーフ的符号確認===
===フェイルセーフ的符号確認===
  if (dmg < 0)
<syntaxhighlight lang="c#">
        {
if (dmg < 0)
            dmg = 0;
{
        }
dmg = 0;
もしダメージがマイナスなら、0にします。
}
 
</syntaxhighlight>ダメージがマイナスなら、0にします。
===攻撃の手痛さ===
int num5 = Mathf.Clamp(dmg * 6 / MaxHP, 0, 4) + ((dmg > 0) ? 1 : 0);
しばらく後に使われるnum5を計算します。
 
num5は攻撃の手痛さを示すと考えられます。
 
まず、ダメージの6倍を最大HPで割ったものを上限4、下限0に押し込めます。
 
次に、ダメージが正の数なら、それに1を足し、そうでないなら0を足したものがnum5です。
 
===マナの体の仕様===
 
[[Elin:解析/フィート#featManameat (マナの体)|こちらのページで説明されています]]。
 
===ダメージを受ける===
 
  else
        {
            hp -= dmg;
        }
 
マナの体を持たない場合はただダメージを受けます。
 
==被ダメージ時の処理==
 
===出血アニメーション===
if (isSynced && dmg != 0)
        {
            float ratio = (float)dmg / (float)MaxHP;
            Card c = ((parent is Chara) ? (parent as Chara) : this);
            ActEffect.TryDelay(delegate
            {
                c.PlayEffect("blood").SetParticleColor(EClass.Colors.matColors[material.alias].main).Emit(20 + (int)(30f * ratio));
                if (EClass.core.config.test.showNumbers || isThing)
                {
                    Popper popper = EClass.scene.popper.Pop(renderer.PositionCenter(), "DamageNum");
                    Color c2 = (c.IsPC ? EClass.Colors.textColors.damagePC : (c.IsPCFaction ? EClass.Colors.textColors.damagePCParty : EClass.Colors.textColors.damage));
                    if (e != Element.Void)
                    {
                        c2 = EClass.Colors.elementColors.TryGetValue(e.source.alias);
                        float num14 = (c2.r + c2.g + c2.b) / 3f;
                        num14 = ((num14 > 0.5f) ? 0f : (0.6f - num14));
                        c2 = new Color(c2.r + num14, c2.g + num14, c2.b + num14, 1f);
                    }
                    popper.SetText(dmg.ToString() ?? "", c2);
                }
            });
        }
被ダメージのエフェクト、例えば普通の生物なら血、機械なら金属クズなどを発生させる処理と、
 
ダメージを表示するオプションがONになっている際のダメージ表記を行っています。
 
===死を回避する===
 
        void EvadeDeath()
        {
            hp = 0;
            if (Evalue(1421) > 0 && isChara && Chara.mana.value < 0)
            {
                Chara.mana.value = 0;
            }
        }
 
HPを0にし(HPがマイナスにならないとキャラクターは死亡しない)、マナの体を持っているキャラならば、MPを0にします。
 
===スタミナ消費による===
 
                else
                {
                    if (attackSource != AttackSource.Finish && IsPCParty && Chara.host == null)
                    {
                        if (EClass.pc.ai is GoalAutoCombat && !EClass.player.invlunerable && (EClass.pc.ai as GoalAutoCombat).listHealthy.Contains(Chara))
                        {
                            EClass.core.actionsNextFrame.Add(delegate
                            {
                                Msg.Say(IsPC ? "abort_damage" : "abort_damgeAlly");
                            });
                            EClass.player.invlunerable = true;
                            EClass.player.TryAbortAutoCombat();
                            EClass.pc.stamina.Mod(-EClass.pc.stamina.max / 5);
                        }
                        if (EClass.player.invlunerable)
                        {
                            EvadeDeath();
                            goto IL_0a8f;
                        }
                    }
 
受けた攻撃がFinishでなく、かつPCに騎乗も寄生もしていないペットのとき、スタミナを消費して耐えます。
 
 
 
===運命の誓約による即死回避===
 
                           
                    if (IsPC && Evalue(1220) > 0 && Chara.stamina.value >= Chara.stamina.max / 2)
                    {
                        Chara.stamina.Mod(-Chara.stamina.max / 2);
                        Chara.AddCondition<ConInvulnerable>();
                        EvadeDeath();
                    }
                }
 
もし、運命の誓約モードかつ、スタミナが最大値の半分以上残っているなら、
 
スタミナを最大値の半分減らし、死を回避します。


==状態異常付与==
=== ダメージ上限処理 ===
<syntaxhighlight lang="c#">
if (dmg > 99999999)
{
dmg = 99999999L;
}
</syntaxhighlight>これまでの計算でダメージが'''「99999999」'''を超える場合'''、'''ダメージを「99999999」にします。


飛んで、4213行目から状態異常に関する記述がみられます。
===マナの体補正===
<syntaxhighlight lang="c#">
if (Evalue(1421) > 0)
{
int num9 = 0;
int num10 = dmg;
...
    if (hp <= 0)
{
if (Evalue(1421) >= 2)
{
num10 /= 2;
}
dmg = num10;
if (Chara.mana.value > 0)
{
num10 -= Chara.mana.value;
Chara.mana.value -= dmg;
num9 += dmg;
}
...
</syntaxhighlight>攻撃対象がマナの体フィートLv2以上を持ち、ダメージをMPで受ける場合、MPへのダメージを'''「0.5」'''倍にします。


詳細は、[[Elin:解析/状態異常|こちら]]でご覧ください。
<references />
<references />



Latest revision as of 10:58, 7 October 2025

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

処理順

物理攻撃魔法攻撃・状態異常などで発生した補正前のダメージは以下の順で処理され増減します。そののち、補正後のダメージをHP(とMP)に与えます。

物理攻撃魔法攻撃・状態異常などでのダメージ発生
↓
古き狐の血統補正
↓
反魔法無属性補正
↓
属性耐性補正
↓
魔法耐性補正
↓
反魔法属性補正
↓
濡れ補正
↓
制圧補正
↓
敵Lv補正
↓
狂戦士補正
↓
摂理補正
↓
射撃防御補正
↓
物理軽減(PDR)補正
↓
属性軽減(EDR)補正
↓
発見済み弱点補正
↓
盾軽減補正
↓
ダメージ耐性補正
↓
大地の加護補正
↓
狐守補正
↓
オートコンバット補正
↓
メタル補正
↓
致命傷防御補正
↓
暴力禁止による与ダメージ消滅
↓
フェイルセーフ的符号確認
↓
ダメージ上限処理
↓
マナの体補正

ダメージ計算

古き狐の血統補正

if (origin != null && origin.HasElement(1208))
{
	switch (attackSource)
	{
	case AttackSource.MagicHand:
		dmg = dmg * 130 / 100;
		eleP = eleP * 150 / 100;
		break;
	case AttackSource.MagicSword:
		dmg = dmg * 120 / 100;
		eleP = eleP * 150 / 100;
		break;
	}
}

攻撃者が古き狐の血統フィートを持つ場合、手魔法のダメージを「1.3」倍、剣魔法のダメージを「1.2」倍にします。

反魔法無属性補正

if (ele == 0 || ele == 926)
{
	e = Element.Void;
	if (origin != null)
	{
		dmg = dmg * Mathf.Max(100 + origin.Evalue(93) / 2, 10) / 100;
	}
}

反魔法エンチャントの値に応じて、無属性の攻撃のダメージを増減させます。

ダメージ倍率は以下の通りです。[1]

ダメージ = ダメージ × MAX(1 + 反魔法エンチャント強度 × 0.005, 0.1)

属性耐性補正

if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
{
	int num2 = ((origin != null) ? origin.Evalue(1238) : 0);
	if (attackSource == AttackSource.MagicSword)
	{
		num3 += 2;
		if (origin.HasElement(1247))
		{
			num3++;
		}
	}
	if (attackSource == AttackSource.MagicArrow && origin != null && origin.HasElement(1244))
	{
		num3++;
	}
	if (attackSource == AttackSource.MagicHand && origin != null && origin.HasElement(1246))
	{
		num3++;
	}
	dmg = Element.GetResistDamage(dmg, Evalue(e.source.aliasRef), num2);
...
public static int GetResistDamage(int dmg, int v, int power = 0)
{
	int num = GetResistLv(v);
	if (power > 0 && num > 0)
	{
		num = Mathf.Max(num - power, 0);
	}
	if (num >= 4)
	{
		return 0;
	}
	return num switch
	{
		3 => dmg / 4, 
		2 => dmg / 3, 
		1 => dmg / 2, 
		0 => dmg, 
		-1 => dmg * 3 / 2, 
		-2 => dmg * 2, 
		_ => dmg * 2, 
	};
}
...
public static int GetResistLv(int v)
{
	int num = v / 5;
	if (num < -2)
	{
		num = -2;
	}
	if (num > 4)
	{
		num = 4;
	}
	return num;
}

無属性以外で、マナの反動によるダメージでないものは属性耐性によるダメージ増減が行われます。

まず、攻撃対象の属性耐性評価を算出します。

属性耐性評価 = CLAMP[2](該当する属性耐性 / 5, -2, 4)
※ゲーム内では耐性25以上は「免疫+」と評価されますが、現状特に意味はありません。

次に、攻撃者の属性貫通力を算出します。

属性貫通力 = 古代種フィートLv + (0、剣魔法のみ2) + (0、天秤座フィートを持つキャラクターの剣魔法の場合1) + (0、射手座フィートを持つキャラクターの矢魔法のみ1) + (0、ペガサス座フィートを持つキャラクターの手魔法の場合1)

属性耐性評価と属性貫通力が共に1以上であれば、最終的な属性耐性評価を減らします。ただし、これによって属性耐性評価が0未満になることはありません。

属性耐性評価 = MAX(属性耐性評価 - 属性貫通力, 0)

最終的な属性耐性評価の値に応じて、ダメージを増減させます。ダメージ倍率は以下の通りです。[3]

-2 (致命的な弱点) -1 (弱点) 0 (なし) 1 (耐性) 2 (強い耐性) 3 (素晴らしい耐性) 4 (免疫)
×2 ×1.5 ×1 ×0.5 ×0.333 ×0.25 ×0

魔法耐性補正

if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
{
...
	dmg = dmg * 100 / (100 + Mathf.Clamp(Evalue(961) * 5, -50, 200));
...

無属性以外で、マナの反動によるダメージでないものは属性耐性と重複して魔法属性耐性によるダメージ増減が行われます。

ダメージ倍率は以下の通りです。

ダメージ = ダメージ / (1 + CLAMP[2](魔法属性耐性 × 0.05, -0.5, 2))

最大でダメージ「2倍」(魔法属性耐性-10)、最小でダメージ「0.333倍」(魔法属性耐性40)となります。

反魔法属性補正

if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
{
...
	dmg = dmg * Mathf.Max(100 - Evalue(93), 10) / 100;
...

無属性以外で、マナの反動によるダメージでないものは属性耐性と重複して攻撃対象の反魔法エンチャントによるダメージ増減が行われます。

ダメージ倍率は以下の通りです。[4]

ダメージ = ダメージ × MAX(1 - 反魔法エンチャント強度 × 0.01, 0.1)

ダメージ減少の上限は「0.1」倍で、上限となるエンチャント強度は「90」です。

濡れ補正

switch (e.id)
{
    case 910:
	{
		Chara chara2 = Chara;
		if (chara2 != null && chara2.isWet)
		{
			dmg /= 3L;
		}
		break;
	}
	case 912:
	{
		Chara chara = Chara;
		if (chara != null && chara.isWet)
		{
			dmg = dmg * 150 / 100;
		}
		break;
	}
}

攻撃対象が濡れ状態の場合、火炎属性はダメージが「0.333」倍、電撃属性はダメージ「1.5」倍になります。

制圧補正

if (origin != null && origin.isChara && origin.Chara.HasCondition<ConSupress>())
{
	dmg = dmg * 2 / 3;
}

攻撃者が制圧状態場合、ダメージが、「0.667」倍になります。

敵Lv補正

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

レベル50を超えるPC勢力以外の攻撃対象が受けるあらゆるダメージは軽減されます。

ダメージ倍率は以下の通りです。

ダメージ = ダメージ × (1 - Min(0.025 × √(攻撃対象Lv - 50), 0.8))

この軽減は攻撃対象がLv1074の時最大となり、ダメージ倍率は「0.2」倍となります。以下は敵Lvごとのダメージ倍率の簡易表です。

レベル毎のダメージ軽減
敵のLv ダメージ倍率
51 ×0.98
100 ×0.83
150 ×0.75
200 ×0.70
250 ×0.65
300 ×0.61
350 ×0.57
400 ×0.54
450 ×0.50
500 ×0.47
550 ×0.45
600 ×0.42
650 ×0.39
700 ×0.37
750 ×0.34
800 ×0.32
850 ×0.30
900 ×0.28
950 ×0.25
1000 ×0.23
1050 ×0.21
1074 ×0.20
1100 ×0.20

狂戦士補正

if (origin != null && origin.HasCondition<ConBerserk>())
{
	dmg = dmg * 3 / 2;
}

狂戦士化状態の攻撃者による、状態異常や瘴気など[5]以外のあらゆるダメージを「1.5」倍にします。

摂理補正

if (EClass.game.principal.enableDamageReduction && IsPCFaction)
{
	int num3 = ((origin != null) ? origin.LV : EClass._zone.DangerLv);
	if (num3 > 50)
	{
		dmg = dmg * (100 - (int)Mathf.Min(95f, Mathf.Sqrt(num3 - 50))) / 100;
	}
}

「高レベル帯での敵の与えるダメージを減衰する」摂理が有効のとき、PC勢力がLv51以上のキャラクターから受けるあらゆるダメージを軽減します。

ダメージ倍率は以下の通りです。

ダメージ = ダメージ × (1 - MIN(0.01 × √(攻撃者Lv - 50), 0.95))


また危険度51階以上のフロアでは、状態異常や瘴気など[5]によるダメージをフロアの危険度に応じてダメージを軽減します。

ダメージ倍率は以下の通りです。

ダメージ = ダメージ × (1 - MIN(0.01 × √(フロア危険度 - 50), 0.95))

射撃防御補正

if (attackSource == AttackSource.Throw || attackSource == AttackSource.Range)
{
	dmg = dmg * 100 / (100 + Evalue(435) * 2);
}

射撃防御を持つキャラクターが受ける投擲・遠隔武器によるダメージを軽減します。

ダメージ倍率は以下の通りです。

ダメージ = ダメージ / (1 + 射撃防御強度 × 0.02)

物理軽減(PDR)補正

bool flag = originalTarget != null;
...
dmg = dmg * Mathf.Max(0, 100 - Mathf.Min(Evalue((e == Element.Void || e.id == 926) ? 55 : 56), 100) / ((!flag) ? 1 : 2)) / 100;

あらゆる無属性ダメージを、物理軽減(種族特性や「それは物理軽減をXX%上昇させる」エンチャントによるもの)を用いて軽減します。

ダメージ倍率は以下の通りです。

ダメージ = ダメージ × MAX((1 - MIN(物理軽減強度 × 0.01, 1) × (1、肉の壁フィートによるダメージのみ0.5)), 0)

物理軽減が100以上の場合、無属性ダメージは0ダメージになります。(肉の壁フィートによるダメージを除く。)

肉の壁フィートによるダメージの場合は物理軽減の効果が半減し、物理軽減「100」の「0.5」倍が上限となります。

属性軽減(EDR)補正

bool flag = originalTarget != null;
...
dmg = dmg * Mathf.Max(0, 100 - Mathf.Min(Evalue((e == Element.Void || e.id == 926) ? 55 : 56), 100) / ((!flag) ? 1 : 2)) / 100;

あらゆる属性ダメージを、属性軽減(種族特性や「それは属性軽減をXX%上昇させる」エンチャントによるもの)を用いて軽減します。

ダメージ倍率は以下の通りです。

ダメージ = ダメージ × MAX((1 - MIN(属性軽減強度 × 0.01, 1) × (1、肉の壁フィートによるダメージのみ0.5)), 0)

属性軽減が100以上の場合、属性ダメージは0ダメージになります。(肉の壁フィートによるダメージを除く。)

肉の壁フィートによるダメージの場合は属性軽減の効果が半減し、属性軽減「100」の「0.5」倍が上限となります。

発見済み弱点補正

if (origin != null && origin.IsPC && EClass.player.codex.Has(id))
{
	dmg = dmg * (100 + Mathf.Min(10, EClass.player.codex.GetOrCreate(id).weakspot)) / 100;
}

攻撃対象の弱点を発見している場合、PCによる攻撃のみ、状態異常や瘴気など[5]以外のあらゆるダメージが増加します。

ダメージ倍率は以下の通りです。

ダメージ = ダメージ × (1 + MIN(対応する発見済み弱点数 × 0.01, 0.1))

発見済み弱点数x10「1.1」倍が上限です。

盾軽減補正

if (isChara && Chara.body.GetAttackStyle() == AttackStyle.Shield && elements.ValueWithoutLink(123) >= 5 && (e == Element.Void || e.id == 926))
{
	dmg = dmg * 90 / 100;
}

攻撃対象のスタイルが盾持ち且つ盾スキルが5以上の場合、無属性ダメージが「0.9」倍になります。

ダメージ耐性補正

if (Evalue(971) > 0)
{
	dmg = dmg * 100 / Mathf.Clamp(100 + Evalue(971), 25, 1000);
}

ダメージ耐性の値に応じてあらゆるダメージを軽減します。

ダメージ倍率は以下の通りです。

ダメージ = ダメージ / CLAMP[2]((1 + ダメージ耐性強度 × 0.01), 0.25, 10))

主要属性が魔法属性のキャラクターのみダメージ耐性「-10」をもち、それ以外では使われていません。(事実上、主要属性が魔法属性のキャラクターに「1.11」倍)

大地の加護補正

if (HasElement(1305)) 
{
    dmg = dmg * 90 / 100; 
}

攻撃対象がオパートス信仰による大地の加護を持つ場合、ダメージを「0.9」倍します。

狐守補正

if (EClass.pc.HasElement(1207) && isChara)
{
	int num4 = 0;
	int num5 = 0;
	foreach (Condition condition2 in Chara.conditions)
	{
		if (condition2.Type == ConditionType.Buff)
		{
			num4++;
		}
		else if (condition2.Type == ConditionType.Debuff)
		{
			num5++;
		}
	}
	if (IsPCParty)
	{
		dmg = dmg * 100 / Mathf.Min(100 + num4 * 5, 120);
	}
	else
	{
		dmg = dmg * Mathf.Min(100 + num5 * 5, 120) / 100;
	}
}

プレイヤーが狐守フィートを持っている場合[6]、攻撃対象がPCパーティー内にいた場合のあらゆるダメージをバフ数に応じて軽減し、攻撃対象がPCパーティー外にいた場合のあらゆるダメージ[7]がデバフ数に応じて増加します。

与ダメージ倍率は以下の通りです。

ダメージ = ダメージ × MIN(1 + 攻撃対象デバフ数 × 0.05, 1.2)

被ダメージ倍率は以下の通りです。

ダメージ = ダメージ / MIN(1 + 攻撃対象バフ数 × 0.05, 1.2)

バフ・デバフ数が「5」個以上の時効果が最大となり、与ダメージは「1.2」倍、被ダメージは「0.83」倍となります。

オートコンバット補正

if (IsPCParty && EClass.pc.ai is GoalAutoCombat)
{
	dmg = dmg * 100 / Mathf.Clamp(105 + EClass.pc.Evalue(135) / 10, 10, 110);
}

オートコンバット中、PCパーティ内にいるキャラクターが受けるあらゆるダメージを軽減します。

ダメージ倍率は以下の通りです。

ダメージ = ダメージ / CLAMP(1.05 + PCの戦略スキル × 0.001, 0.1, 1.1)

戦略スキルが「50」の時効果が最大となり、「0.91」倍となります。

呪われた装備で戦略スキルがマイナスの場合は逆にダメージが増加します。(「10」倍まで)

メタル補正

if (HasElement(1218) && attackSource != AttackSource.ManaBackfire && (hp > 0 || Evalue(1421) <= 0))
{
	dmg = dmg * (1000 - Mathf.Min(Evalue(1218), 1000) / ((!flag) ? 1 : 2)) / 1000;
	if (dmg <= 0 && EClass.rnd(4) == 0)
	{
		dmg++;
	}
}

攻撃対象がメタルフィートを持つ場合、あらゆるダメージを軽減します。ただし、マナの反動によるダメージやマナの体のフィートの効果でHP0に踏みとどまっている場合は軽減されません。

ダメージ倍率は以下の通りです。

ダメージ = ダメージ × (1 - MIN(メタルフィートLv × 0.001, 1) × (1、肉の壁フィートによるダメージの場合0.5))

種族メタルのメタルフィートLvは999で、ダメージは「0.001」倍になります。

遺伝子合成でメタルフィートを1付与した場合、ダメージは「0.999」倍になります。

肉の壁フィートによるダメージの場合、効果が半減します。


また、元々の攻撃力やこれまでのダメージ増減を全て含めてメタル補正による軽減後のダメージが0だった場合、「25%」の確率でダメージが「1」になります。

これはメタルにダメージを与えられない時でも、時々1ダメージが入る現象を起こしています。

また、メタル補正前のダメージが0だったとしても、時々1ダメージが入る現象を起こします。

致命傷防御補正

if (dmg >= MaxHP / 10 && Evalue(68) > 0)
{
	int num6 = MaxHP / 10;
    int num7 = dmg - num6;
	num7 = num7 * 100 / (200 + Evalue(68) * 10);
	dmg = num6 + num7;
}

攻撃対象が致命傷防御を持っているとき、致命傷防御補正による軽減前のダメージが攻撃対象の最大HPの10%以上なら、ダメージが軽減されます。

軽減後ダメージは以下の通りです。

ダメージ = (攻撃対象最大HP / 10) + ((ダメージ - 攻撃対象最大HP / 10) / (2 + 致命傷防御強度 × 0.1))

暴力禁止による与ダメージ消滅

if (origin != null && origin.IsPC && EClass.pc.Evalue(654) > 0)
{
    dmg = 0;
}

暴力禁止エンチャントがPCに付与されている場合、プレイヤーに由来するダメージを0にします。

フェイルセーフ的符号確認

if (dmg < 0)
{
	dmg = 0;
}

ダメージがマイナスなら、0にします。

ダメージ上限処理

if (dmg > 99999999)
{
	dmg = 99999999L;
}

これまでの計算でダメージが「99999999」を超える場合ダメージを「99999999」にします。

マナの体補正

if (Evalue(1421) > 0)
{
	int num9 = 0;
	int num10 = dmg;
...
    if (hp <= 0)
	{
		if (Evalue(1421) >= 2)
		{
			num10 /= 2;
		}
		dmg = num10;
		if (Chara.mana.value > 0)
		{
			num10 -= Chara.mana.value;
			Chara.mana.value -= dmg;
			num9 += dmg;
		}
...

攻撃対象がマナの体フィートLv2以上を持ち、ダメージをMPで受ける場合、MPへのダメージを「0.5」倍にします。

  1. 反魔法エンチャントは生成時に呪われた装備が負の値を取りえるため、0.1倍を下限としてダメージが減少することがあります。
  2. 2.0 2.1 2.2 値を一定範囲内に制限する関数です。 関数内の1つめの引数の値は、「2つめの引数の値」~「3つめの引数の値」の範囲内になるよう補正されます。
  3. EA23.212にてダメージオーバーフローの対策が行われたが、 属性耐性補正の計算時にはint32型が用いられるためオーバーフローする可能性がある。
  4. 反魔法エンチャントは生成時に呪われた装備が負の値を取りえるため、ダメージが増加することがあります。この場合の上限はありません。
  5. 5.0 5.1 5.2 暴力禁止エンチャント有効下でダメージを与えられるもの、つまり攻撃者の認識ができないもの。
  6. PC以外が持っていても効果がない。
  7. 状態異常や瘴気、PCパーティーと全く関係のないダメージも増加する。