250
edits
(→メタルフィートによるダメージ軽減: アプデに依る仕様変更に対応。) |
(狂戦士補正、摂理補正などを追加。不明瞭なままだった記述を削除。不要な記述を削除。(スタブページからの内容移行です。)) |
||
| Line 1: | Line 1: | ||
{{解析}} | {{解析}} | ||
{{バージョン|23. | {{バージョン|23.187}} | ||
==処理順== | |||
[[Elin:解析/物理戦闘|物理攻撃]]・[[Elin:解析/魔法|魔法攻撃]]などで発生した'''補正前のダメージ'''は以下の順で処理され増減します。そののち、補正後のダメージをHP(とMP)に与えます。 | |||
[[Elin:解析/物理戦闘|物理攻撃]]・[[Elin:解析/魔法|魔法攻撃]]などでのダメージ発生 | |||
↓ | |||
反魔法無属性補正 | |||
↓ | |||
属性耐性補正 | |||
↓ | |||
魔法耐性補正 | |||
↓ | |||
反魔法属性補正 | |||
↓ | |||
濡れ補正 | |||
↓ | |||
制圧補正 | |||
↓ | |||
敵Lv補正 | |||
↓ | |||
狂戦士補正 | |||
↓ | |||
摂理補正 | |||
↓ | |||
物理軽減(PDR)補正 | |||
↓ | |||
属性軽減(EDR)補正 | |||
↓ | |||
発見済み弱点補正 | |||
↓ | |||
盾軽減補正 | |||
↓ | |||
ダメージ耐性補正 | |||
↓ | |||
大地の加護補正 | |||
↓ | |||
狐守補正 | |||
↓ | |||
オートコンバット補正 | |||
↓ | |||
メタル補正 | |||
↓ | |||
致命傷防御補正 | |||
↓ | |||
暴力禁止による与ダメージ消滅 | |||
↓ | |||
フェイルセーフ的符号確認 | |||
↓ | |||
マナの体補正 | |||
==Evalue== | == ダメージ計算 == | ||
=== 反魔法無属性補正=== | |||
<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>反魔法エンチャントの値に応じて、無属性の攻撃のダメージを増減させます。 | |||
ダメージ倍率は以下の通りです。<ref>反魔法エンチャントは生成時に呪われた装備が負の値を取りえるため、0.1倍を下限としてダメージが減少することがあります。</ref> | |||
ダメージ = ダメージ × MAX(1 + 反魔法エンチャント強度 × 0.005, 0.1) | |||
===属性耐性補正=== | |||
<syntaxhighlight lang="c#"> | |||
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; | |||
} | |||
</syntaxhighlight> | |||
無属性以外で、マナの反動によるダメージでないものは属性耐性によるダメージ増減が行われます。 | |||
まず、攻撃対象の属性耐性評価を算出します。 | |||
属性耐性評価 = CLAMP<ref name=":0">値を一定範囲内に制限する関数です。 | |||
関数内の1つめの引数の値は、「2つめの引数の値」~「3つめの引数の値」の範囲内になるよう補正されます。</ref>(該当する属性耐性 / 5, -2, 4) | |||
※ゲーム内では耐性25以上は「免疫+」と評価されますが、現状特に意味はありません。 | |||
次に、攻撃者の属性貫通力を算出します。 | |||
属性貫通力 = 古代種フィートLv + (0、剣魔法のみ2) | |||
属性耐性評価と属性貫通力が共に1以上であれば、最終的な属性耐性評価を減らします。ただし、これによって属性耐性評価が0未満になることはありません。 | |||
属性耐性評価 = MAX(属性耐性評価 - 属性貫通力, 0) | |||
最終的な属性耐性評価の値に応じて、ダメージを増減させます。ダメージ倍率は以下の通りです。 | |||
{| class="wikitable" | {| class="wikitable" | ||
|+ | |+ | ||
!-2 (致命的な弱点) | |||
! -1 (弱点) | |||
!0 (なし) | |||
!1 (耐性) | |||
!2 (強い耐性) | |||
!3 (素晴らしい耐性) | |||
! 4 (免疫) | |||
|- | |- | ||
| ×2 | |||
|×1.5 | |||
|×1 | |||
|×0.5 | |||
| ×0.333 | |||
|×0.25 | |||
| ×0 | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
|} | |} | ||
== | === 魔法耐性補正 === | ||
<syntaxhighlight> | |||
if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire) | |||
{ | |||
... | |||
dmg = dmg * 100 / (100 + Mathf.Clamp(Evalue(961) * 5, -50, 200)); | |||
... | |||
</syntaxhighlight>無属性以外で、マナの反動によるダメージでないものは'''属性耐性と重複して魔法属性耐性によるダメージ増減が行われます。''' | |||
ダメージ倍率は以下の通りです。 | |||
ダメージ = ダメージ / (1 + CLAMP<ref name=":0" />(魔法属性耐性 × 0.05, -0.5, 2)) | |||
最大でダメージ'''「2倍」'''(魔法属性耐性-10)、最小でダメージ'''「0.333倍」'''(魔法属性耐性40)となります。 | |||
=== 反魔法属性補正=== | |||
<syntaxhighlight lang="c#"> | |||
if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire) | |||
{ | |||
... | |||
dmg = dmg * Mathf.Max(100 - Evalue(93), 10) / 100; | |||
... | |||
</syntaxhighlight>無属性以外で、マナの反動によるダメージでないものは属性耐性と重複して反魔法エンチャントによるダメージ増減が行われます。 | |||
ダメージ倍率は以下の通りです。<ref>反魔法エンチャントは生成時に呪われた装備が負の値を取りえるため、ダメージが増加することがあります。この場合の上限はありません。</ref> | |||
ダメージ = ダメージ × MAX(1 - 反魔法エンチャント強度 × 0.01, 0.1) | |||
ダメージ減少の上限は'''「0.1」'''倍で、上限となるエンチャント強度は'''「90」'''です。 | |||
===濡れ補正=== | ===濡れ補正=== | ||
<syntaxhighlight lang="c#"> | |||
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; | |||
} | |||
} | |||
</syntaxhighlight>攻撃対象が濡れ状態の場合、火炎属性はダメージが'''「0.333」'''倍、電撃属性はダメージ'''「1.5」'''倍になります。 | |||
===制圧補正=== | |||
<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勢力以外の攻撃対象が受けるあらゆるダメージは軽減されます。 | |||
ダメージ倍率は以下の通りです。 | |||
ダメージ = ダメージ × (1 - Min(0.025 × √(攻撃対象Lv - 50), 0.8)) | |||
この軽減は攻撃対象が'''Lv1074の時最大'''となり、ダメージ倍率は'''「0.2」'''倍となります。以下は敵Lvごとのダメージ倍率の簡易表です。 | |||
{| class="wikitable" | {| class="wikitable" | ||
|+レベル毎のダメージ軽減 | |+レベル毎のダメージ軽減 | ||
!敵のLv | !敵のLv | ||
! | !ダメージ倍率 | ||
|- | |- | ||
|51 | |51 | ||
| | |×0.98 | ||
|- | |- | ||
|100 | |100 | ||
| | |×0.83 | ||
|- | |- | ||
|150 | |150 | ||
| | |×0.75 | ||
|- | |- | ||
|200 | |200 | ||
| | |×0.70 | ||
|- | |- | ||
|250 | |250 | ||
| | |×0.65 | ||
|- | |- | ||
|300 | |300 | ||
| | |×0.61 | ||
|- | |- | ||
|350 | |350 | ||
| | |×0.57 | ||
|- | |- | ||
|400 | |400 | ||
| | |×0.54 | ||
|- | |- | ||
|450 | |450 | ||
|50 | |×0.50 | ||
|- | |- | ||
|500 | |500 | ||
| | | ×0.47 | ||
|- | |- | ||
|550 | |550 | ||
| | |×0.45 | ||
|- | |- | ||
|600 | |600 | ||
| | |×0.42 | ||
|- | |- | ||
|650 | |650 | ||
| | |×0.39 | ||
|- | |- | ||
|700 | |700 | ||
| | |×0.37 | ||
|- | |- | ||
|750 | |750 | ||
| | |×0.34 | ||
|- | |- | ||
|800 | |800 | ||
| | |×0.32 | ||
|- | |- | ||
|850 | |850 | ||
| | |×0.30 | ||
|- | |- | ||
|900 | |900 | ||
| | |×0.28 | ||
|- | |- | ||
|950 | |950 | ||
| | |×0.25 | ||
|- | |- | ||
|1000 | | 1000 | ||
| | |×0.23 | ||
|- | |- | ||
|1050 | |1050 | ||
| | |×0.21 | ||
|- | |- | ||
|1074 | |1074 | ||
| | |×0.20 | ||
|- | |- | ||
|1100 | |1100 | ||
| | |×0.20 | ||
|} | |} | ||
===狂戦士補正=== | |||
<syntaxhighlight lang="c#"> | |||
if (origin != null && origin.HasCondition<ConBerserk>()) | |||
{ | |||
dmg = dmg * 3 / 2; | |||
} | |||
</syntaxhighlight>狂戦士化状態の攻撃者による、状態異常や瘴気など<ref name=":1">暴力禁止エンチャント有効下でダメージを与えられるもの、つまり攻撃者の認識ができないもの。</ref>以外のあらゆるダメージを'''「1.5」'''倍にします。 | |||
===摂理補正=== | |||
<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)) | |||
また危険度51階以上のフロアでは、状態異常や瘴気など<ref name=":1" />によるダメージをフロアの危険度に応じてダメージを軽減します。 | |||
ダメージ倍率は以下の通りです。 | |||
ダメージ = ダメージ × (1 - MIN(0.01 × √('''フロア危険度''' - 50), 0.95)) | |||
=== | ===物理軽減(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%上昇させる」エンチャントによるもの)を用いて軽減します。 | |||
= | ダメージ倍率は以下の通りです。 | ||
ダメージ = ダメージ × MAX((1 - MIN(物理軽減強度 × 0.01, 1) × (1、肉の壁フィートによるダメージのみ0.5)), 0) | |||
物理軽減が'''100以上'''の場合、無属性ダメージは0ダメージになります。('''肉の壁フィートによるダメージを除く。''') | |||
肉の壁フィートによるダメージの場合は物理軽減の効果が'''半減'''し、'''物理軽減「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」倍が上限となります。''' | |||
=== 発見済み弱点補正 === | |||
<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」'''倍になります。 | |||
=== | === ダメージ耐性補正 === | ||
<syntaxhighlight lang="c#"> | |||
if (Evalue(971) > 0) | |||
{ | |||
dmg = dmg * 100 / Mathf.Clamp(100 + Evalue(971), 25, 1000); | |||
} | |||
</syntaxhighlight>ダメージ耐性の値に応じてあらゆるダメージを軽減します。 | |||
ダメージ倍率は以下の通りです。 | |||
ダメージ = ダメージ / CLAMP<ref name=":0" />((1 + ダメージ耐性強度 × 0.01), 0.25, 10)) | |||
'''主要属性が魔法属性'''のキャラクターのみダメージ耐性'''「-10」'''をもち、それ以外では使われていません。(事実上、主要属性が魔法属性のキャラクターに'''「1.11」'''倍) | |||
===大地の加護補正 === | |||
<syntaxhighlight lang="c#"> | |||
if (HasElement(1305)) | |||
{ | |||
dmg = dmg * 90 / 100; | |||
} | |||
</syntaxhighlight>攻撃対象がオパートス信仰による大地の加護を持つ場合、ダメージを'''「0.9」'''倍します。 | |||
=== | ===狐守補正=== | ||
<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>がデバフ数に応じて増加します。 | |||
与ダメージ倍率は以下の通りです。 | |||
ダメージ = ダメージ × MIN(1 + 攻撃対象デバフ数 × 0.05, 1.2) | |||
被ダメージ倍率は以下の通りです。 | |||
ダメージ = ダメージ / MIN(1 + 攻撃対象バフ数 × 0.05, 1.2) | |||
バフ・デバフ数が'''「5」個以上'''の時効果が最大となり、与ダメージは'''「1.2」'''倍、被ダメージは'''「0.83」'''倍となります。 | |||
=== オートコンバット補正=== | |||
<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パーティ内にいるキャラクターが受けるあらゆるダメージを軽減します。 | |||
ダメージ倍率は以下の通りです。 | |||
ダメージ = ダメージ / CLAMP(1.05 + PCの戦略スキル × 0.001, 0.1, 1.1) | |||
戦略スキルが'''「50」'''の時効果が最大となり、'''「0.91」'''倍となります。 | |||
呪われた装備で戦略スキルがマイナスの場合は逆にダメージが増加します。('''「10」'''倍まで) | |||
===メタル補正=== | |||
<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 - MIN(メタルフィートLv × 0.001, 1) × (1、肉の壁フィートによるダメージの場合0.5)) | |||
種族メタルのメタルフィートLvは999で、ダメージは'''「0.001」'''倍になります。 | |||
遺伝子合成でメタルフィートを1付与した場合、ダメージは'''「0.999」'''倍になります。 | |||
肉の壁フィートによるダメージの場合、効果が'''半減'''します。 | |||
また、'''元々の攻撃力やこれまでのダメージ増減を全て含めて'''メタル補正による軽減後のダメージが0だった場合、'''「25%」'''の確率でダメージが'''「1」'''になります。 | |||
これはメタルにダメージを与えられない時でも、時々1ダメージが入る現象を起こしています。 | |||
また、メタル補正前のダメージが0だったとしても、時々1ダメージが入る現象を起こします。 | |||
=== | === 致命傷防御補正 === | ||
<syntaxhighlight lang="c#"> | |||
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)) | |||
=== 暴力禁止による与ダメージ消滅=== | |||
<syntaxhighlight lang="c#"> | |||
if (origin != null && origin.IsPC && EClass.pc.Evalue(654) > 0) | |||
{ | |||
dmg = 0; | |||
} | |||
</syntaxhighlight>暴力禁止エンチャントがPCに付与されている場合、プレイヤーに由来するダメージを0にします。 | |||
===フェイルセーフ的符号確認=== | ===フェイルセーフ的符号確認=== | ||
<syntaxhighlight lang="c#"> | |||
if (dmg < 0) | |||
{ | |||
dmg = 0; | |||
} | |||
</syntaxhighlight>ダメージがマイナスなら、0にします。 | |||
===マナの体補正=== | |||
<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」'''倍にします。 | |||
<references /> | <references /> | ||
edits