User:びゃっこ/すたぶ/解析だめけいさん: Difference between revisions

From Ylvapedia
(曖昧なとことか不要な情報とかをてなおし)
(処理順を記述)
 
(6 intermediate revisions by the same user not shown)
Line 1: Line 1:
==PV==
ApplyProtection(int dmg, int mod = 100)
    {
        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を定めて、
その値が正である場合、4で割った値を変数num3に保管し、num2=num3/10 +1とし、
更にそこから sides = num3/num2 + 1を定義し、bonus=0とします。
そののち、ダメージを100/(100+num)倍にします。
さらに、Dice.cs中のRoll関数を用いて、運は被ダメージ者のもの、ダイス数はnum2、面数はsides、ボーナスは0で[[Elin:解析/共通処理|ダイスロール]]をします。
ダメージからnum4 * 100<ref>この100は冒頭で出てきたmodであり、バランス調整用に変数になっているものの、ただの定数値だと考えられます。。</ref> / 100 を引き算します。
最後に、ダメージが負になっていたら0に変更します。
==処理順==
==処理順==
物理攻撃・魔法攻撃などで発生した補正前のダメージは以下の順で処理され増減します。そののち、補正後のダメージをHP(とMP)に与えます。
物理攻撃・魔法攻撃などでのダメージ発生
反魔法無属性補正
属性耐性補正
魔法耐性補正
反魔法属性補正
濡れ補正
制圧補正
敵Lv補正
狂戦士補正
摂理補正
物理軽減(PDR)補正
属性軽減(EDR)補正
発見済み弱点補正
盾軽減補正
ダメージ耐性補正
大地の加護補正
狐守補正
オートコンバット補正
メタル補正
致命傷防御補正
暴力禁止による与ダメージ消滅
フェイルセーフ的符号確認
マナの体補正


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


===属性耐性===
===属性耐性補正===
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
Line 113: Line 116:
まず、攻撃対象の属性耐性評価を算出します。
まず、攻撃対象の属性耐性評価を算出します。
  属性耐性評価 = CLAMP<ref name=":0">値を一定範囲内に制限する関数です。
  属性耐性評価 = CLAMP<ref name=":0">値を一定範囲内に制限する関数です。
       
関数内の1つめの引数の値は、「2つめの引数の値」~「3つめの引数の値」の範囲内になるよう補正されます。</ref>(該当する属性耐性 / 5, -2, 4)
        関数内の1つめの引数の値は、「2つめの引数の値」~「3つめの引数の値」の範囲内になるよう補正されます。</ref>(該当する属性耐性 / 5, -2, 4)
  ※ゲーム内では耐性25以上は「免疫+」と評価されますが、現状特に意味はありません。
  ※ゲーム内では耐性25以上は「免疫+」と評価されますが、現状特に意味はありません。
次に、攻撃者の属性貫通力を算出します。
次に、攻撃者の属性貫通力を算出します。
Line 151: Line 154:
ダメージ倍率は以下の通りです。
ダメージ倍率は以下の通りです。
  ダメージ = ダメージ / (1 + CLAMP<ref name=":0" />(魔法属性耐性 × 0.05, -0.5, 2))
  ダメージ = ダメージ / (1 + CLAMP<ref name=":0" />(魔法属性耐性 × 0.05, -0.5, 2))
最低でダメージ'''「2倍」'''(魔法属性耐性-10)、最大でダメージ'''「0.333倍」'''(魔法属性耐性40)となります。
最大でダメージ'''「2倍」'''(魔法属性耐性-10)、最小でダメージ'''「0.333倍」'''(魔法属性耐性40)となります。


=== 反魔法属性補正 ===
=== 反魔法属性補正 ===
Line 160: Line 163:
dmg = dmg * Mathf.Max(100 - Evalue(93), 10) / 100;
dmg = dmg * Mathf.Max(100 - Evalue(93), 10) / 100;
...
...
</syntaxhighlight>無属性以外で、マナの反動によるダメージでないものは属性耐性と重複して反魔法エンチャントによるダメージ減少が行われます。
</syntaxhighlight>無属性以外で、マナの反動によるダメージでないものは属性耐性と重複して反魔法エンチャントによるダメージ増減が行われます。


ダメージ倍率は以下の通りです。<ref>反魔法エンチャントは生成時に呪われた装備が負の値を取りえるため、ダメージが増加することがあります。この場合の上限はありません。</ref>
ダメージ倍率は以下の通りです。<ref>反魔法エンチャントは生成時に呪われた装備が負の値を取りえるため、ダメージが増加することがあります。この場合の上限はありません。</ref>
  ダメージ = ダメージ × MAX(1 - , 0.1)
  ダメージ = ダメージ × MAX(1 - 反魔法エンチャント強度 × 0.01, 0.1)
ダメージ減少の上限は'''「0.1」'''倍で、上限となるエンチャント強度は'''「90」'''です。
ダメージ減少の上限は'''「0.1」'''倍で、上限となるエンチャント強度は'''「90」'''です。


Line 191: Line 194:
</syntaxhighlight>攻撃対象が濡れ状態の場合、火炎属性はダメージが'''「0.333」'''倍、電撃属性はダメージ'''「1.5」'''倍になります。
</syntaxhighlight>攻撃対象が濡れ状態の場合、火炎属性はダメージが'''「0.333」'''倍、電撃属性はダメージ'''「1.5」'''倍になります。


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


ダメージが、2/3倍になります。
===敵Lv補正===
 
<syntaxhighlight lang="c#">
※ここからはしばらく、AttackTypeがFinishでないときの計算です。
if (!IsPCFaction && LV > 50)
===敵のレベルに応じたダメージ軽減===
{
 
dmg = dmg * (100 - (int)Mathf.Min(80f, Mathf.Sqrt(LV - 50) * 2.5f)) / 100;
 
}
レベル50を超えた敵が受けるダメージ軽減量は以下の通りです:
</syntaxhighlight>
 
レベル50を超えるPC勢力以外の攻撃対象が受けるあらゆるダメージは軽減されます。
まず、レベル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;
}


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


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


プレイヤーのファクションに属さないキャラで、レベルがLv50より高い場合:
この軽減は攻撃対象が'''Lv1074の時最大'''となり、ダメージ倍率は'''「0.2」'''倍となります。以下は敵Lvごとのダメージ倍率の簡易表です。
 
与えるダメージに、* (100 - [  2.5 * √(敵のレベル - 50)  か 80 かのうち小さいほう ]<ref>正確には小さい方を四捨五入したもの</ref>) / 100が掛けられます。
 
つまり、Lv1074以上の敵に対してはダメージが80%減少し、Lv51~Lv1073の敵に対しては[sqrt(敵Lv-50) * 2.5]%減少します。
{| 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;
=== 狂戦士補正 ===
<syntaxhighlight lang="c#">
if (origin != null && origin.HasCondition<ConBerserk>())
{
dmg = dmg * 3 / 2;
}
</syntaxhighlight>狂戦士化状態の攻撃者による、状態異常や瘴気など<ref name=":1">暴力禁止エンチャント有効下でダメージを与えられるもの、つまり攻撃者の認識ができないもの。</ref>以外のあらゆるダメージを'''「1.5」'''倍にします。


属性が無いなら物理軽減、あるなら属性軽減を用いて、ダメージを(100-その値)/100内にします。
===摂理補正===
<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以上のキャラクターから受けるあらゆるダメージを軽減します。


100-その値の下限は0となっており、ダメージがマイナスになるのを防いでいます。
ダメージ倍率は以下の通りです。
ダメージ = ダメージ × (1 - MIN(0.01 × √('''攻撃者Lv''' - 50), 0.95))


これらの軽減は基本的には種族特性ですが、信仰AFの一部にはこれらを上昇させるものが存在します。


===弱点の知識による与ダメージ減少===
また危険度51階以上のフロアでは、状態異常や瘴気など<ref name=":1" />によるダメージをフロアの危険度に応じてダメージを軽減します。


  if (origin != null && origin.IsPC && EClass.player.codex.Has(id))
ダメージ倍率は以下の通りです。
            {
  ダメージ = ダメージ × (1 - MIN(0.01 × √('''フロア危険度''' - 50), 0.95))
                dmg = dmg * (100 + Mathf.Min(10, EClass.player.codex.GetOrCreate(id).weakspot)) / 100;
            }
危ない本かカード収集によるそのモンスターへの与ダメージ増加を示しています。


(100+収集数<ref>未確認</ref>)%増加します。
===物理軽減(PDR)補正===
<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%上昇させる」エンチャントによるもの)を用いて軽減します。


ただし、上限は110%です。
ダメージ倍率は以下の通りです。
ダメージ = ダメージ × MAX((1 - MIN(物理軽減強度 × 0.01, 1) × (1、肉の壁フィートによるダメージのみ0.5)), 0)
物理軽減が'''100以上'''の場合、無属性ダメージは0ダメージになります。('''肉の壁フィートによるダメージを除く。''')


===盾による軽減===
肉の壁フィートによるダメージの場合は物理軽減の効果が'''半減'''し、'''物理軽減「100」の「0.5」倍が上限となります。'''
            if (isChara && Chara.body.GetAttackStyle() == AttackStyle.Shield && elements.ValueWithoutLink(123) >= 5 && (e == Element.Void || e.id == 926))
            {
                dmg = dmg * 90 / 100;
            }
スタイルが盾持ちのキャラには物理ダメージが0.9倍になります。


===ダメージ耐性===
=== 属性軽減(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%上昇させる」エンチャントによるもの)を用いて軽減します。


  if (Evalue(971) > 0)
ダメージ倍率は以下の通りです。
            {
  ダメージ = ダメージ × MAX((1 - MIN(属性軽減強度 × 0.01, 1) × (1、肉の壁フィートによるダメージのみ0.5)), 0)
                dmg = dmg * 100 / Mathf.Clamp(100 + Evalue(971), 25, 1000);
属性軽減が'''100以上'''の場合、属性ダメージは0ダメージになります。('''肉の壁フィートによるダメージを除く'''。)
            }


ダメージ耐性を持つなら、被ダメージが100/(100+その値)倍になります。
肉の壁フィートによるダメージの場合は属性軽減の効果が'''半減'''し、'''属性軽減「100」の「0.5」倍が上限となります。'''


ただし、(100+その値)は下限25、上限1000に押し込められます。
===発見済み弱点補正===
<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" />以外のあらゆるダメージが増加します。


ダメージ耐性は詳細は不明ですが、内部的には物理という属性への耐性であり、物理属性は通常の属性軽減の式では計算が除外されていることから、
ダメージ倍率は以下の通りです。
ダメージ = ダメージ × (1 + MIN(対応する発見済み弱点数 × 0.01, 0.1))
発見済み弱点数x'''10'''の'''「1.1」'''倍が上限です。


ここで計算している可能性があります。魔法属性のファンネルが無属性に弱点であり、この計算式に関連する可能性があります。
===盾軽減補正===
<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」'''倍になります。


===大地の加護===
===ダメージ耐性補正===
            if (HasElement(1305))
<syntaxhighlight lang="c#">
            {
if (Evalue(971) > 0)
                dmg = dmg * 90 / 100;
{
            }
dmg = dmg * 100 / Mathf.Clamp(100 + Evalue(971), 25, 1000);
}
</syntaxhighlight>ダメージ耐性の値に応じてあらゆるダメージを軽減します。


オパートス信仰による大地の加護を持つなら被ダメージが0.9倍。
ダメージ倍率は以下の通りです。
ダメージ = ダメージ / CLAMP<ref name=":0" />((1 + ダメージ耐性強度 × 0.01), 0.25, 10))
'''主要属性が魔法属性'''のキャラクターのみダメージ耐性'''「-10」'''をもち、それ以外では使われていません。(事実上、主要属性が魔法属性のキャラクターに'''「1.11」'''倍)


===狐守 ===
===大地の加護補正===
            if (EClass.pc.HasElement(1207) && isChara)
<syntaxhighlight lang="c#">
            {
if (HasElement(1305))  
                int num = 0;
{
                int num2 = 0;
    dmg = dmg * 90 / 100;  
                foreach (Condition condition2 in Chara.conditions)
}
                {
</syntaxhighlight>攻撃対象がオパートス信仰による大地の加護を持つ場合、ダメージを'''「0.9」'''倍します。
                    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 (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>


味方ミニオンへの配慮がないために、味方ミニオンが敵からデバフをもらうと、被ダメージが増加すると考えられます。
'''プレイヤーが狐守フィートを持っている場合'''<ref>PC以外が持っていても効果がない。</ref>、攻撃対象がPCパーティー内にいた場合のあらゆるダメージをバフ数に応じて軽減し、攻撃対象がPCパーティー外にいた場合のあらゆるダメージ<ref>状態異常や瘴気、PCパーティーと全く関係のないダメージも増加する。</ref>がデバフ数に応じて増加します。


===オートコンバット時の被ダメージ減少===
与ダメージ倍率は以下の通りです。
            if (IsPCParty && EClass.pc.ai is GoalAutoCombat)
ダメージ = ダメージ × MIN(1 + 攻撃対象デバフ数 × 0.05, 1.2)
            {
被ダメージ倍率は以下の通りです。
                dmg = dmg * 100 / Mathf.Clamp(105 + EClass.pc.Evalue(135) / 10, 10, 110);
ダメージ = ダメージ / MIN(1 + 攻撃対象バフ数 × 0.05, 1.2)
            }
バフ・デバフ数が'''「5」個以上'''の時効果が最大となり、与ダメージは'''「1.2」'''倍、被ダメージは'''「0.83」'''倍となります。


プレイヤーのパーティ内のキャラなら、オートコンバット中はダメージが100/(105+戦略スキル/10)倍になります。
===オートコンバット補正===
<syntaxhighlight lang="c#">
if (IsPCParty && EClass.pc.ai is GoalAutoCombat)
{
dmg = dmg * 100 / Mathf.Clamp(105 + EClass.pc.Evalue(135) / 10, 10, 110);
}
</syntaxhighlight>オートコンバット中、PCパーティ内にいるキャラクターが受けるあらゆるダメージを軽減します。


ただし、(105+戦略スキル/10)は下限10、上限110に押し込められます。
ダメージ倍率は以下の通りです。
ダメージ = ダメージ / CLAMP(1.05 + PCの戦略スキル × 0.001, 0.1, 1.1)
戦略スキルが'''「50」'''の時効果が最大となり、'''「0.91」'''倍となります。


つまり、戦略スキル50で軽減が上限に達します。
呪われた装備で戦略スキルがマイナスの場合は逆にダメージが増加します。('''「10」'''倍まで)


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


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


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


そして、ダメージが0以下かつ、0-3が均等に出る乱数で0が出たとき、
肉の壁フィートによるダメージの場合、効果が'''半減'''します。


ダメージが1増えます。


これはメタルにほとんどダメージを与えられない時でも、ときどきダメージが入る現象を起こしています。
また、'''元々の攻撃力やこれまでのダメージ増減を全て含めて'''メタル補正による軽減後のダメージが0だった場合、'''「25%」'''の確率でダメージが'''「1」'''になります。
===致命傷防御によるダメージ軽減===
            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%で、
これはメタルにダメージを与えられない時でも、時々1ダメージが入る現象を起こしています。


num4は元のダメージが最大HPの10%を超えた量に、100/(200 + 致命傷防御の値*10)をかけたものです。
また、メタル補正前のダメージが0だったとしても、時々1ダメージが入る現象を起こします。


現状、致命傷防御は黄金の騎士で100、防衛者で50です。
===致命傷防御補正===
 
<syntaxhighlight lang="c#">
※ここからはAttackTypeがFinishでも発生します。
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;
}
</syntaxhighlight>攻撃対象が致命傷防御を持っているとき、致命傷防御補正による軽減前のダメージが攻撃対象の最大HPの10%以上なら、ダメージが軽減されます。
軽減後ダメージは以下の通りです。
ダメージ = (攻撃対象最大HP / 10) + ((ダメージ - 攻撃対象最大HP / 10) / (2 + 致命傷防御強度 × 0.1))


===暴力禁止による与ダメージ消滅===
===暴力禁止による与ダメージ消滅===
        if (origin != null && origin.IsPC && EClass.pc.Evalue(654) > 0)
<syntaxhighlight lang="c#">
        {
if (origin != null && origin.IsPC && EClass.pc.Evalue(654) > 0)
            dmg = 0;
{
        }
    dmg = 0;
子狐丸の、暴力禁止エンチャントの効果です。
}
 
</syntaxhighlight>暴力禁止エンチャントがPCに付与されている場合、プレイヤーに由来するダメージを0にします。
ダメージがプレイヤーに由来するなら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);
<syntaxhighlight lang="c#">
if (Evalue(1421) > 0)
しばらく後に使われるnum5を計算します。
{
 
int num9 = 0;
num5は攻撃の手痛さを示すと考えられます。
int num10 = dmg;
 
...
まず、ダメージの6倍を最大HPで割ったものを上限4、下限0に押し込めます。
    if (hp <= 0)
 
{
次に、ダメージが正の数なら、それに1を足し、そうでないなら0を足したものがnum5です。
if (Evalue(1421) >= 2)
 
{
===マナの体の仕様===
num10 /= 2;
 
}
[[Elin:解析/フィート#featManameat (マナの体)|こちらのページで説明されています]]。
dmg = num10;
 
if (Chara.mana.value > 0)
===ダメージを受ける===
{
 
num10 -= Chara.mana.value;
  else
Chara.mana.value -= dmg;
        {
num9 += dmg;
            hp -= dmg;
}
        }
...
 
</syntaxhighlight>攻撃対象がマナの体フィートLv2以上を持ち、ダメージをMPで受ける場合、MPへのダメージを'''「0.5」'''倍にします。
マナの体を持たない場合はただダメージを受けます。
 
==被ダメージ時の処理==
 
===出血アニメーション===
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();
                    }
                }
 
もし、運命の誓約モードかつ、スタミナが最大値の半分以上残っているなら、
 
スタミナを最大値の半分減らし、死を回避します。
 
== 状態異常付与==
 
飛んで、4213行目から状態異常に関する記述がみられます。


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

Latest revision as of 09:17, 13 September 2025

処理順

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

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

ダメージ計算

反魔法無属性補正

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)
	{
		num2 += 2;
	}
	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)

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

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

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

-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;
...

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

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

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

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

濡れ補正

switch (e.id)
{
    case 910:
	{
		Chara chara2 = Chara;
		if (chara2 != null && chara2.isWet)
		{
			dmg /= 3;
		}
		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;
}

狂戦士化状態の攻撃者による、状態異常や瘴気など[4]以外のあらゆるダメージを「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階以上のフロアでは、状態異常や瘴気など[4]によるダメージをフロアの危険度に応じてダメージを軽減します。

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

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

物理軽減(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による攻撃のみ、状態異常や瘴気など[4]以外のあらゆるダメージが増加します。

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

ダメージ = ダメージ × (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;
	}
}

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

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

ダメージ = ダメージ × 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 (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. 反魔法エンチャントは生成時に呪われた装備が負の値を取りえるため、ダメージが増加することがあります。この場合の上限はありません。
  4. 4.0 4.1 4.2 暴力禁止エンチャント有効下でダメージを与えられるもの、つまり攻撃者の認識ができないもの。
  5. PC以外が持っていても効果がない。
  6. 状態異常や瘴気、PCパーティーと全く関係のないダメージも増加する。