Elin:解析/ダメージ計算

Revision as of 10:10, 5 October 2025 by びゃっこ (talk | contribs) (古き狐の血統補正を追加。ダメージオーバーフロー対策をコードに反映。)
バージョン 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 (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パーティーと全く関係のないダメージも増加する。