Elin:解析/状態異常

バージョン EA23.106: この記事は、Elin最新の安定版リリースに遅れをとっていますが、信頼できる範囲にあるかもしれません。
910 eleFire 火炎
911 eleCold 冷気
912 eleLightning 電撃
913 eleDarkness 暗黒
914 eleMind 幻惑
915 elePoison
916 eleNether 地獄
917 eleSound 轟音
918 eleNerve 神経
919 eleHoly 神聖
920 eleChaos 混沌
921 eleMagic 魔法
922 eleEther エーテル
923 eleAcid
924 eleCut 出血
925 eleImpact 衝撃
926 eleVoid
950 resFire 火炎耐性
951 resCold 冷気耐性
952 resLightning 電撃耐性
953 resDarkness 暗黒耐性
954 resMind 幻惑耐性
955 resPoison 毒耐性
956 resNether 地獄耐性
957 resSound 音耐性
958 resNerve 神経耐性
959 resChaos 混沌耐性
960 resHoly 神聖耐性
961 resMagic 魔法耐性
962 resEther エーテル耐性
963 resAcid 酸耐性
964 resCut 出血耐性
965 resImpact 衝撃耐性
412 slowCorruption エーテル鈍化


DamageHP

チャンス関数;ダメージが正という条件

bool Chance(int a, int max)

       {
           if (dmg > 0 || (origin != null && origin.HasElement(1345)))
           {
               return Mathf.Min(a, max) > EClass.rnd(100);
           }
           return false;
       }

入力a、上限maxを参照する関数です。状態異常付与の成功判定に用いられます

ダメージが正、もしくはキズアミ信仰の加護を持っているなら、

aが乱数0~99より大きいか比べます。大きいなら付与判定は成功です。

ただし、aがmaxを上回る場合は、aではなくmaxで判定します。

elePはDamageHPの冒頭で100として定義されているように見えますが、これでは魔法種ごとの状態異常誘発能力に違いが出なくなる矛盾が解消できていません。

    switch (e.id)
       {
       case 910:
           if (Chance(30 + eleP / 5, 100))
           {
               Chara.AddCondition<ConBurning>(eleP);
           }
           break;

  火炎で炎上が付与されます。条件は(Chance(30 + eleP / 5, 100)

       case 911:
           if (Chara.isWet)
           {
               if (Chance(30 + eleP / 10, 100))
               {
                   Chara.AddCondition<ConFreeze>(eleP);
               }
           }
           else if (Chance(50 + eleP / 10, 100))
           {
               Chara.AddCondition<ConWet>(eleP);
           }
           break;
           

冷気で濡れ・凍結が付与されます。

濡れでないなら濡れの判定のみ、濡れているなら凍結の判定のみ行われます。

凍結の条件は(Chance(30 + eleP / 10, 100)

濡れの条件は(Chance(50 + eleP / 10, 100)

       case 912:
           if (Chance(75 + eleP / 20, 100) && EClass.rnd(3) == 0)
           {
               Chara.AddCondition<ConParalyze>(1, force: true);
           }
           break;

電撃で麻痺が付与されます。条件は(Chance(75 + eleP / 20, 100)かつ確率1/3を当てることです。

forceは麻痺無効貫通のための仕様です。


       case 915:
           if (Chance(30 + eleP / 5, 100))
           {
               Chara.AddCondition<ConPoison>(eleP);
           }
           break;

毒で毒状態が付与されます。

条件は、(Chance(30 + eleP / 5, 100)


       case 913:
           if (Chance(30 + eleP / 5, 100))
           {
               Chara.AddCondition<ConBlind>(eleP);
           }
           break;

暗黒で盲目が付与されます。

条件は、Chance(30 + eleP / 5, 100)


       case 918:
           flag2 = false;
           if (Chance(30 + eleP / 5, 100))
           {
               Chara.AddCondition<ConParalyze>(eleP);
           }
           break;

神経で麻痺が付与されます。

条件は、(Chance(30 + eleP / 5, 100))


       case 914:
           flag2 = false;
           if (EClass.rnd(3) != 0)
           {
               if (Chance(30 + eleP / 5, 100))
               {
                   Chara.AddCondition<ConConfuse>(eleP);
               }
           }
           else if (Chance(30 + eleP / 5, 100))
           {
               Chara.AddCondition<ConSleep>(eleP);
           }
           break;

幻惑で混乱と睡眠が付与されます。

確率2/3で混乱の判定のみ、残りの1/3の確率で睡眠の判定のみが起こります。

混乱も睡眠も条件は(Chance(30 + eleP / 5, 100))。


       case 917:
           if (Chance(50 + eleP / 10, 100))
           {
               Chara.AddCondition<ConDim>(eleP);
           }
           break;

轟音で朦朧が付与されます。

条件は(Chance(50 + eleP / 10, 100))。

混濁にどう移行するかは不明。

       case 925:
           if (EClass.rnd(3) == 0)
           {
               if (Chance(30 + eleP / 5, 100))
               {
                   Chara.AddCondition<ConDim>(eleP);
               }
           }
           else if (EClass.rnd(2) == 0)
           {
               if (EClass.rnd(3) == 0)
               {
                   Chara.AddCondition<ConParalyze>(1, force: true);
               }
           }
           else if (EClass.rnd(2) == 0)
           {
               Chara.AddCondition<ConConfuse>(1 + EClass.rnd(3), force: true);
           }
           break;

衝撃で朦朧、麻痺、混乱が付与されます。

判定は、1/3で朦朧、1/9で麻痺、1/3で混乱。残る2/9は判定発生なしです。

朦朧は条件(Chance(30 + eleP / 5, 100))

麻痺、混乱はchanceによる条件なしで、forceが付いています。


       case 920:
           flag2 = false;
           if (Chance(5 + eleP / 25, 40))
           {
               Chara.AddCondition<ConBlind>(eleP / 2);
           }
           if (Chance(5 + eleP / 25, 40))
           {
               Chara.AddCondition<ConParalyze>(eleP / 2);
           }
           if (Chance(5 + eleP / 25, 40))
           {
               Chara.AddCondition<ConConfuse>(eleP / 2);
           }
           if (Chance(5 + eleP / 25, 40))
           {
               Chara.AddCondition<ConPoison>(eleP / 2);
           }
           if (Chance(5 + eleP / 25, 40))
           {
               Chara.AddCondition<ConSleep>(eleP / 2);
           }
           if (Chance(5 + eleP / 25, 40))
           {
               Chara.AddCondition<ConDim>(eleP / 2);
           }
           if (Chance(30 + eleP / 10, 100))
           {
               Chara.SAN.Mod(EClass.rnd(2));
           }
           break;

混沌で、盲目、麻痺、混乱、毒、睡眠、朦朧が付与されます。またSANが上昇する効果も持っています。

条件はブロックコードから確認してください。

朦朧以外は同じです。


       case 924:
           if (Chance(50 + eleP / 10, 100))
           {
               Chara.AddCondition<ConBleed>(eleP);
           }
           break;        

出血なら出血状態が付与されます。


       case 923:
           if (Chance(50 + eleP / 10, 100) && EClass.rnd(4) == 0)
           {
               ActEffect.Proc(EffectId.Acid, Chara);
           }
           break;
           

酸で、劣化判定が起きます。

Chance(50 + eleP / 10, 100)と確率1/4が条件です。


       case 922:
           Chara.ModCorruption(EClass.rnd(eleP / 50 + 10));
           break;

エーテルでエーテル病が進行します。


Condition.cs

条件

   public Condition AddCondition<T>(int p = 100, bool force = false) where T : Condition
   {
       return AddCondition(typeof(T).Name, p, force);
   }

   public Condition AddCondition(string id, int p = 100, bool force = false)
   {
       return AddCondition(Condition.Create(id, p), force);
   }

   public Condition AddCondition(Condition c, bool force = false)
   {
       c.owner = this;
       if (!(c is ConBurning))
       {
           if (c is ConBleed && ResistLv(964) >= 3)
           {
               return null;
           }
       }
       else if (ResistLv(950) >= 3)
       {
           return null;
       }

付与する状態異常が炎上ではなく[1]、付与する状態異常が出血であり、出血耐性評価が素晴らしい以上の時、出血付与は失敗します。

付与する状態異常が炎上の時は、炎上耐性が素晴らしい以上なら、付与が失敗します。

古代種持ちの火炎攻撃でも、炎上耐性が素晴らしい以上なら炎上はしません。


           if (c.GainResistFactor > 0 && CanGainConResist)
       {
           if (c.GainResistFactor >= 400)
           {
               c.power /= 2;
           }
           ResistCon(c);
           if (c.power <= 0)
           {
               return null;
           }
       }




       if (!force)
       {
           if (c.source.negate.Length != 0)
           {
               string[] negate = c.source.negate;
               foreach (string text in negate)
               {
                   if (HasElement(text))
                   {
                       return null;
                   }
               }
           }
           Element defenseAttribute = c.GetDefenseAttribute(this);
           if (defenseAttribute != null)
           {
               c.power = 100 * c.power / (100 + defenseAttribute.Value);
           }
           if (c.source.resistance.Length != 0)
           {
               int num = ResistLv(EClass.sources.elements.alias[c.source.resistance[0]].id);
               if (num > 0)
               {
                   c.power /= num * num + 1;
                   if (c.power <= 40)
                   {
                       return null;
                   }
               }
           }
           c.power = c.EvaluatePower(c.power);
           if (c.power <= 0)
           {
               return null;
           }
       }

状態異常への抵抗を判断する処理です。

forceがあるものはこれらの軽減処理を無視します。forceを持つのは電撃の麻痺、衝撃の混乱と麻痺です。

衝撃の混乱と麻痺に至っては、chance関数なく判定されるため、衝撃耐性でダメージを0にしても付与が成功すると考えられます。

上記の特例を除き、無効エンチャントや種族特性などで状態異常は無効化されます。

次に、状態異常ごとの対応主能力で減衰がかかります。powerの値が 100 / (100 + 対応主能力)倍になります。

かける状態異常に対応した属性耐性を持っているなら、属性評価2乗 + 1 でpowerを割ります。割った後に、powerの値が40以下なら、0にします。

対応関係
状態異常 対応する属性耐性 特筆事項
恐怖 幻惑
混乱 幻惑
睡眠 神経
麻痺 神経
盲目
朦朧
結露 冷気
       for (int j = 0; j < conditions.Count; j++)
       {
           if (conditions[j].id != c.id)
           {
               continue;
           }
           if (c.Type == ConditionType.Stance || c.IsToggle)
           {
               conditions[j].Kill();
               return null;
           }
           if (conditions[j].CanStack(c))
           {
               if (conditions[j].WillOverride)
               {
                   conditions[j].Kill(silent: true);
                   continue;
               }
               if (CanGainConResist)
               {
                   AddResistCon(c);
               }
               conditions[j].OnStacked(c.power);
               conditions[j].OnStartOrStack();
               conditions[j].PlayEffect();
           }
           if (!conditions[j].AllowMultipleInstance)
           {
               return null;
           }
       }
       foreach (Condition condition in conditions)
       {
           if (condition.TryNullify(c))
           {
               return null;
           }
       }
       int num2 = c.EvaluateTurn(c.power);
       if (num2 == 0)
       {
           return null;
       }
       c.value = num2;
       conditions.Add(c);
       if (CanGainConResist)
       {
           AddResistCon(c);
       }
       c.SetOwner(this);
       c.Start();
       SetDirtySpeed();
       if (c.ShouldRefresh)
       {
           Refresh();
       }
       if (IsPC && c.ConsumeTurn && !EClass.pc.isRestrained)
       {
           EClass.player.EndTurn();
       }
       if (c.SyncRide && (ride != null || parasite != null))
       {
           if (ride != null)
           {
               ride.AddCondition(Condition.Create(c.source.alias, c.power));
           }
           if (parasite != null)
           {
               parasite.AddCondition(Condition.Create(c.source.alias, c.power));
           }
       }
       return c;
   }

Chara.cs

エーテル病進行度

   public void ModCorruption(int a)
   {
       if (a > 0)
       {
           if (ResistLv(962) > 0 && EClass.rnd(ResistLv(962) + 1) != 0)
           {
               return;
           }
           int num = Evalue(412);
           if (num != 0)
           {
               float num2 = (float)a * 100f / (float)Mathf.Max(100 + num * 2, 10);
               a = (int)num2 + ((EClass.rndf(1f) > num2 % 1f) ? 1 : 0);
           }
       }

エーテル病が進行する攻撃に被弾したときに呼び出される処理です。

エーテル耐性があるならば、

  • 蓄積が発生する確率が1/(エーテル耐性評価値+1)にまで下がります。
  • 次にエーテル鈍化による減衰を計算します。
    • 蓄積量aが、100/(100 + 鈍化*2)倍になります。 ただし、(100 + 鈍化*2)には下限10があります。
    • 最後に計算後の蓄積量aを整数にするための処理をします。


       if (a == 0)
       {
           return;
       }
       int num3 = (corruption + a) / 100 - corruption / 100;
       for (int i = 0; i < Mathf.Abs(num3); i++)
       {
           if (!MutateRandom((num3 > 0) ? 1 : (-1), 100, ether: true))
           {
               break;
           }
       }
       corruption += a;
       int num4 = 0;

aが0なら計算を終えます。


       foreach (Element value in elements.dict.Values)
       {
           if (value.source.category == "ether")
           {
               num4 += value.Value;
           }
       }
       if (num4 > 0 && IsPC)
       {
           Tutorial.Reserve("ether");
       }
       corruption = num4 * 100 + corruption % 100;
   }

まとめ

状態異常が付与される流れは、

  • 攻撃ならば、1ダメージ以上与える。もしくはキズアミを信仰しているのが必要。(chance関数の条件)
    • 免疫である属性でも古代種フィート持ちの攻撃でダメージをもらう場合は付与されうる。
    • 衝撃の混乱と麻痺はこの条件がなくても付与される。
  • 属性強度依存[2]の確率を潜り抜けるのが必要。(多くの状態異常はchance関数を判定に含む)
  • 炎上と出血は耐性評価15以上には通らない
    • 例え古代種やforceのついた攻撃でも不能。
  • ボスなどが獲得する抵抗でpowerを減らす処理が起きる。
  • forceがない状態異常は以下の軽減処理を受ける。forceを持つのは電撃の麻痺、衝撃の混乱と麻痺のみ
    • 1. 無効エンチャントや種族としての無効を持っている場合、無効化される。
    • 2. 主能力で一部の状態異常は減衰される。
    • 3. 属性耐性(評価)で対応する状態異常は減衰される。評価1段階ごとに大幅に通りにくくなる。
  1. この条件の必要性が不明
  2. 未確認