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

曖昧なとことか不要な情報とかをてなおし
(大規模編集用にスタブページへ内容コピー)
(曖昧なとことか不要な情報とかをてなおし)
Line 1: Line 1:
DamageHP()を参照しています。
==Evalue==
{| class="wikitable"
|+
|-
!値
!意味
|-
|55
|物理軽減
|-
|56
|属性軽減
|-
|93
|反魔法
|-
|961
|魔法耐性
|-
|1218
|メタル
|-
|1238
|古代種
|-
|1421
|マナの体
|}
==PV==
==PV==


Line 72: Line 41:


最後に、ダメージが負になっていたら0に変更します。
最後に、ダメージが負になっていたら0に変更します。
==処理順==


==ダメージ計算==
==ダメージ計算==
===反魔法無属性補正===
<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)
===反魔法による物理ダメージ増加===
  Element e;
        if (ele == 0 || ele == 926)
        {
            e = Element.Void;
            if (origin != null)
            {
                dmg = dmg * Mathf.Max(100 + origin.Evalue(93) / 2, 10) / 100;
            }
        }
       
この箇所は攻撃属性ごとの処理をしていて、Voidが物理に相当し、物理は攻撃者の反魔法によって強化されます。
強度を2で割ったあまり%だけ上昇します。ただし、下限10により、反魔法が負の大きい強度であっても最低限のダメージが出ます。


  else
===属性耐性===
        {
<syntaxhighlight lang="c#">
            e = Element.Create(ele);
if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
            if (attackSource != AttackSource.Condition && showEffect)
{
            {
int num2 = ((origin != null) ? origin.Evalue(1238) : 0);
                ActEffect.TryDelay(delegate
if (attackSource == AttackSource.MagicSword)
                {
{
                    PlayEffect(e.id, useRenderPos: true, 0.25f);
num2 += 2;
                    EClass.Sound.Play("atk_" + e.source.alias);
}
                });
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>
無属性以外で、マナの反動によるダメージでないものは属性耐性によるダメージ増減が行われます。


=== 属性耐性による軽減 ===
まず、攻撃対象の属性耐性評価を算出します。
まずElement.cs中のGetResistLvを見ると、
属性耐性評価 = CLAMP<ref name=":0">値を一定範囲内に制限する関数です。
  {
        int num = v / 5;
関数内の1つめの引数の値は、「2つめの引数の値」~「3つめの引数の値」の範囲内になるよう補正されます。</ref>(該当する属性耐性 / 5, -2, 4)
        if (num < -2)
※ゲーム内では耐性25以上は「免疫+」と評価されますが、現状特に意味はありません。
        {
次に、攻撃者の属性貫通力を算出します。
            num = -2;
属性貫通力 = 古代種フィートLv + (0、剣魔法のみ2)
        }
属性耐性評価と属性貫通力が共に1以上であれば、最終的な属性耐性評価を減らします。ただし、これによって属性耐性評価が0未満になることはありません。
        if (num > 4)
属性耐性評価 = MAX(属性耐性評価 - 属性貫通力, 0)
        {
最終的な属性耐性評価の値に応じて、ダメージを増減させます。ダメージ倍率は以下の通りです。
            num = 4;
{| class="wikitable"
        }
|+
        return num;
!-2 (致命的な弱点)
    }
! -1 (弱点)
耐性値を5で割った商を求め、それを必要であれば下限-2、上限4に押し込めます。この値はゲーム内で見られる"免疫"などの耐性評価と一致します。
! 0 (なし)
! 1 (耐性)
!2 (強い耐性)
! 3 (素晴らしい耐性)
! 4 (免疫)  
|-
| ×2
|×1.5
|×1
|×0.5
| ×0.333
|×0.25
| ×0
|}


次に同じくElement.cs中のGetResisistDamageを見ると、
=== 魔法耐性補正 ===
  {
<syntaxhighlight>
        int resistLv = GetResistLv(v);
if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
        resistLv -= power;
{
        if (resistLv >= 4)
...
        {
dmg = dmg * 100 / (100 + Mathf.Clamp(Evalue(961) * 5, -50, 200));
            return 0;
...
        }
</syntaxhighlight>無属性以外で、マナの反動によるダメージでないものは'''属性耐性と重複して魔法属性耐性によるダメージ増減が行われます。'''
        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)
ダメージ = ダメージ / (1 + CLAMP<ref name=":0" />(魔法属性耐性 × 0.05, -0.5, 2))
            {
最低でダメージ'''「2倍」'''(魔法属性耐性-10)、最大でダメージ'''「0.333倍」'''(魔法属性耐性40)となります。
                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#">
            {
if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
            case 910:
{
            {
...
                Chara chara2 = Chara;
dmg = dmg * Mathf.Max(100 - Evalue(93), 10) / 100;
                if (chara2 != null && chara2.isWet)
...
                {
</syntaxhighlight>無属性以外で、マナの反動によるダメージでないものは属性耐性と重複して反魔法エンチャントによるダメージ減少が行われます。
                    dmg /= 3;
                }
                break;
            }
            case 912:
            {
                Chara chara = Chara;
                if (chara != null && chara.isWet)
                {
                    dmg = dmg * 150 / 100;
                }
                break;
            }
濡れ状態でダメージが増減する処理です。


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


電撃はダメージ1.5倍。
===濡れ補正===
<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」'''倍になります。


===制圧による与ダメージ減少===
=== 制圧による与ダメージ減少 ===
  if (origin != null && origin.isChara && origin.Chara.HasCondition<ConSupress>())
  if (origin != null && origin.isChara && origin.Chara.HasCondition<ConSupress>())
         {
         {
Line 238: Line 246:
|43
|43
|-
|-
|400
| 400  
|46
|46
|-
|-
Line 245: Line 253:
|-
|-
|500
|500
|53
| 53
|-
|-
|550
|550
Line 338: Line 346:
オパートス信仰による大地の加護を持つなら被ダメージが0.9倍。
オパートス信仰による大地の加護を持つなら被ダメージが0.9倍。


===狐守===
===狐守 ===
             if (EClass.pc.HasElement(1207) && isChara)
             if (EClass.pc.HasElement(1207) && isChara)
             {
             {
Line 432: Line 440:
ダメージがプレイヤーに由来するなら0にします。
ダメージがプレイヤーに由来するなら0にします。


===フェイルセーフ的符号確認===
===フェイルセーフ的符号確認 ===
   if (dmg < 0)
   if (dmg < 0)
         {
         {
Line 439: Line 447:
もしダメージがマイナスなら、0にします。
もしダメージがマイナスなら、0にします。


=== 攻撃の手痛さ ===
===攻撃の手痛さ===
  int num5 = Mathf.Clamp(dmg * 6 / MaxHP, 0, 4) + ((dmg > 0) ? 1 : 0);
  int num5 = Mathf.Clamp(dmg * 6 / MaxHP, 0, 4) + ((dmg > 0) ? 1 : 0);
   
   
Line 463: Line 471:
マナの体を持たない場合はただダメージを受けます。
マナの体を持たない場合はただダメージを受けます。


== 被ダメージ時の処理==
==被ダメージ時の処理==


===出血アニメーション===
===出血アニメーション===
Line 531: Line 539:




===運命の誓約による即死回避===
=== 運命の誓約による即死回避 ===


                              
                              
Line 546: Line 554:
スタミナを最大値の半分減らし、死を回避します。
スタミナを最大値の半分減らし、死を回避します。


==状態異常付与==
== 状態異常付与==


飛んで、4213行目から状態異常に関する記述がみられます。
飛んで、4213行目から状態異常に関する記述がみられます。
250

edits