User:びゃっこ/すたぶ/解析状態異常: Difference between revisions

From Ylvapedia
(概要を書く)
 
(3 intermediate revisions by the same user not shown)
Line 16: Line 16:
また、「朦朧->混濁」や「切り傷->出血->大出血」<ref>これらは名称・挙動こそ異なるものの、内部上では同一の状態異常として扱われている。</ref>のように一部の状態異常には深度がありますが、これは残りターン数によって段階が決定されています。
また、「朦朧->混濁」や「切り傷->出血->大出血」<ref>これらは名称・挙動こそ異なるものの、内部上では同一の状態異常として扱われている。</ref>のように一部の状態異常には深度がありますが、これは残りターン数によって段階が決定されています。


例えば朦朧は蓄積可能な状態異常なので、連続して付与することでターン数が伸び、一定の残りターン数になると深度が混濁になる、ということが起こっています。
例えば朦朧は蓄積可能な状態異常なので、連続して付与することでターン数が伸び、一定の残りターン数になると深度が混濁になる、ということが起こっています。<ref>病気などターン経過によって残りターン数が減少しないものもありますが、それらは「ターン経過による減少処理」を無効化して実現しています。</ref>


=== 状態異常の強制付与 ===
=== 状態異常の強制付与 ===
Line 23: Line 23:
特定の方法(電撃属性による麻痺や危ない本による恐怖など)で付与される状態異常は上記3つを無視することができます。
特定の方法(電撃属性による麻痺や危ない本による恐怖など)で付与される状態異常は上記3つを無視することができます。


特に電撃属性による麻痺付与は便宜上「スタン」と呼ばれることがありますが、強制付与される以外に違いは無く内部上は1ターンの麻痺と全く同一のものです。<ref>既に2ターン以上の麻痺が付与される状態で1ターンの麻痺に上書きされるのもこのため。</ref>
特に電撃属性による麻痺付与は便宜上「スタン」と呼ばれることがありますが、強制付与される以外に違いは無く内部上は1ターンの麻痺と全く同一のものです。<ref>既に2ターン以上の麻痺が付与されている状態で1ターンの麻痺に上書きされるのもこのため。</ref>


=== 状態異常の一時的耐性 ===
=== 状態異常の一時的耐性 ===
Line 33: Line 33:
一時的耐性を持っているキャラクターに対して状態異常を付与しようとする際には、一時的耐性の値に応じて強度の軽減、もしくは付与が無効化されます。
一時的耐性を持っているキャラクターに対して状態異常を付与しようとする際には、一時的耐性の値に応じて強度の軽減、もしくは付与が無効化されます。


'''一時的耐性による軽減・無効化は強制付与の場合も無視することはできません。'''
'''一時的耐性の獲得・軽減・無効化は強制付与の場合も無視することはできません。'''


== 一般的な状態異常付与 ==
== 一般的な状態異常付与 ==
魔法・アビリティによる付与やポーション・巻物・魔法杖の効果による付与、その他特殊処理による付与は状態異常の強度を直接指定することで付与しています。
魔法・アビリティによる付与はそのパワーを状態異常の強度に、ポーション・巻物・魔法杖の効果による付与はそのパワーが状態異常の強度として扱われていることが殆どです。
=== 一時的耐性による軽減・無効化 ===
<syntaxhighlight lang="c#">
if (c.GainResistFactor > 0 && CanGainConResist)
{
if (c.GainResistFactor >= 400)
{
c.power /= 2;
}
ResistCon(c);
if (c.power <= 0)
{
return null;
}
}
...
public void ResistCon(Condition con)
{
if (con.power > 0 && resistCon != null)
{
int a = ClassExtension.TryGetValue<int, int>((IDictionary<int, int>)resistCon, con.id, 0);
if (1000 < EClass.rnd(a))
{
con.power = 0;
}
else if (500 < EClass.rnd(a))
{
con.power /= 5;
}
else if (200 < EClass.rnd(a))
{
con.power /= 3;
}
else if (100 < EClass.rnd(a))
{
con.power /= 2;
}
}
}
</syntaxhighlight>付与される状態異常に一時的耐性を持っている場合、一時的耐性の値に応じた確率で状態異常強度を軽減もしくは付与の無効化をします。
以下4つの処理を、状態異常の付与が無効になるか状態異常強度を減少するかするまで順番に行います。どの条件も満たさない場合は軽減や無効化は行われません。
1: 0 ~ (一時的耐性 - 1)の範囲のランダムな値が1000より大きいなら、状態異常の付与を無効
2: 0 ~ (一時的耐性 - 1)の範囲のランダムな値が500より大きいなら、状態異常強度を'''「0.2倍」'''に軽減
3: 0 ~ (一時的耐性 - 1)の範囲のランダムな値が300より大きいなら、状態異常強度を'''「0.333倍」'''に軽減
4: 0 ~ (一時的耐性 - 1)の範囲のランダムな値が100より大きいなら、状態異常強度を'''「0.5倍」'''に軽減
また、'''一時的耐性が400以上'''の場合、上記の'''軽減・無効化と重複して'''状態異常強度を'''「0.5」'''倍にします。
=== 主能力による軽減 ===
<syntaxhighlight lang="c#">
if (defenseAttribute != null)
{
c.power = 100 * c.power / Mathf.Max(100 + defenseAttribute.Value, 1);
}
</syntaxhighlight>付与される状態異常に対応する主能力がある場合、付与するキャラクターの主能力に応じて状態異常強度は軽減されます。
軽減率は以下の式で算出されます。
状態異常強度 = 状態異常強度 / (1 + 対応主能力 × 0.01)
=== 属性耐性による軽減・無効化 ===
<syntaxhighlight lang="c#">
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;
}
}
}
</syntaxhighlight>付与される状態異常に対応する属性耐性が5以上ある場合、状態異常強度は軽減されます。(弱点の場合は何も行われません。)
軽減率は以下の式で算出されます。
状態異常強度 = 状態異常強度 / CLAMP(属性耐性 / 5, 1, 4) ^ 2 + 1
表に直すと軽減率は以下のようになります。<ref>免疫でも状態異常強度が残るため、古代種フィートやメタルフィートなどで免疫属性のダメージを受けた場合はその属性の状態異常も付与される。
免疫≠状態な事に注意。</ref>
{| class="wikitable"
|+
!1 (耐性)
!2 (強い耐性)
!3 (素晴らしい耐性)
!4 (免疫)
|-
|×0.5
|×0.2
|×0.1
|×0.06
|}
さらに、この軽減によって状態異常強度が40以下になった場合、付与は無効化されます。
また、'''状態異常が炎上で、付与するキャラクターの火炎属性耐性が15以上'''だった場合、状態異常強度に関わらず付与は無効化されます。
'''状態異常が出血で、付与するキャラクターの出血属性耐性が15以上'''だった場合、状態異常強度に関わらず付与は無効化されます。
=== ターン数算出・付与 ===
<syntaxhighlight lang="c#">
int num2 = c.EvaluateTurn(c.power);
if (num2 == 0)
{
return null;
}
c.value = num2;
conditions.Add(c);
...
public virtual int EvaluateTurn(int p)
{
return Mathf.Max(1, base.source.duration.Calc(p, 0, P2));
}
</syntaxhighlight>これまでの処理で無効化されておらず、状態異常強度が1未満になっていないなら付与する状態異常のターン数を算出します。(計算式については状態異常表を参照)
算出した結果1ターン未満になった場合、最低でも1ターンが保障されます。
その後、算出したターン数分の状態異常を付与します。
=== 一時的耐性の獲得 ===
<syntaxhighlight lang="c#">
if (CanGainConResist)
{
AddResistCon(c);
}
...
public void AddResistCon(Condition con)
{
if (con.power > 0 && con.GainResistFactor > 0)
{
int key = con.id;
if (resistCon == null)
{
resistCon = new Dictionary<int, int>();
}
if (resistCon.ContainsKey(key))
{
resistCon[key] += con.power * con.GainResistFactor / 100;
}
else
{
resistCon[key] = con.power * con.GainResistFactor / 100;
}
}
}
</syntaxhighlight>状態異常が付与されると、『』か《》付きのキャラクターは'''付与された際の強度に応じて'''一時的耐性が蓄積されます。
蓄積する一時耐性の値は以下の式で算出されます。(計算式については状態異常表を参照)
獲得一時耐性値 = 状態異常強度 × (一時的耐性係数 / 100)


==攻撃による状態異常付与==
==攻撃による状態異常付与==
Line 42: Line 197:
[[Elin:解析/物理戦闘|物理攻撃]]や[[Elin:解析/魔法|魔法攻撃]]で属性ダメージを受ける際には、属性強度に基づいて状態異常の付与確率と状態異常の強度が決定されます。
[[Elin:解析/物理戦闘|物理攻撃]]や[[Elin:解析/魔法|魔法攻撃]]で属性ダメージを受ける際には、属性強度に基づいて状態異常の付与確率と状態異常の強度が決定されます。


実際に付与される状態異常のターン数については一般的な付与と同じです。
実際に付与される状態異常のターン数や軽減・無効化については一般的な付与と同じです。


属性強度の実際の値と計算式については、各ページを参照してください。
属性強度の実際の値と計算式については、各ページを参照してください。
Line 357: Line 512:
付与される混乱の強度は'''「1 ~ 3の範囲内のランダムな値」'''で、耐性や無効化を無視します。
付与される混乱の強度は'''「1 ~ 3の範囲内のランダムな値」'''で、耐性や無効化を無視します。


 
== 状態異常表 ==
==Condition.cs==
ゲーム内の状態異常は全部で81種ありますが、ここではよく参照されるであろうもののみ掲載します。
===条件===
    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;
        }
 
付与する状態異常が炎上ではなく<ref>この条件の必要性が不明</ref>、付与する状態異常が出血であり、出血耐性評価が素晴らしい以上の時、出血付与は失敗します。
 
付与する状態異常が炎上の時は、炎上耐性が素晴らしい以上なら、付与が失敗します。
 
古代種持ちの火炎攻撃でも、炎上耐性が素晴らしい以上なら炎上はしません。
 
 
            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にします。
 
{| class="wikitable"
{| class="wikitable"
|+対応関係
|+
!名前
!種別
!ターン数
!無効化
!軽減主能力
!軽減属性耐性
!一時的耐性係数
!備考
|-
|毒
|悪性状態異常
|強度 / 4
|毒無効
|耐久
|毒属性耐性
|100
|ターン数30~: 猛毒
|-
|呼吸困難
|悪性状態異常
|強度
|水中呼吸
|耐久
|なし
|200
|ターン数0~9: 表記なし, ターン数10~19: 呼吸困難, ターン数20~: 窒息
|-
|炎上
|悪性状態異常
|強度 / 30
|火炎属性耐性(15)
|なし
|なし
|100
|
|-
|恐怖
|悪性状態異常
|強度 / 10
|恐怖無効
|意志
|幻惑属性耐性
|200
|
|-
|睡眠
|悪性状態異常
|強度 / 10
|睡眠無効
|意志
|神経属性耐性
|500
|
|-
|気絶
|悪性状態異常
|強度 / 10
|なし
|感覚
|なし
|600
|
|-
|拘束
|悪性状態異常
|強度 / 20
|なし
|器用
|なし
|200
|
|-
|麻痺
|悪性状態異常
|強度 / 20
|麻痺無効
|感覚
|神経属性耐性
|800
|
|-
|混乱
|悪性状態異常
|強度 / 7
|混乱無効
|意志
|幻惑属性耐性
|200
|
|-
|盲目
|悪性状態異常
|強度 / 8
|盲目無効
|感覚
|暗黒属性耐性
|100
|
|-
|狂気
|悪性状態異常
|強度 / 10
|なし
|学習
|なし
|100
|ターン数0~49: 不安定, ターン数50~89: 狂気, ターン数90~: 崩壊
|-
|出血
|悪性状態異常
|強度 / 10
|魔導生命体,出血属性耐性(15)
|耐久
|なし
|200
|ターン数0~49: 切り傷, ターン数50~89: 出血, ターン数90~: 大出血
|-
|朦朧
|悪性状態異常
|強度 / 10
|魔導生命体
|意志
|轟音属性耐性
|500
|ターン数0~49: 朦朧, ターン数50~: 混濁
|-
|幻覚
|悪性状態異常
|強度
|なし
|なし
|なし
|100
|
|-
|結露
|悪性状態異常
|強度 / 10
|なし
|なし
|冷気属性耐性
|100
|ターン数0~49: 結露, ターン数50~: 凍結
|-
|狂戦士化
|悪性状態異常
|5
|なし
|なし
|なし
|0
|
|-
|-
!状態異常!!対応する属性耐性!!特筆事項
|瘴気
|呪い
|強度  / 100 + 5
|なし
|なし
|なし
|0
|
|-
|-
|||||
|重力
|呪い
|強度 / 20 + 10
|なし
|なし
|なし
|0
|
|-
|-
|恐怖||幻惑||
|沈黙
|呪い
|強度 / 80 + 5
|なし
|意志
|なし
|500
|
|-
|-
|混乱||幻惑||
|脆弱
 
|呪い
|強度 / 50 + 10
|なし
|意志
|なし
|20
|
|-
|-
|睡眠||神経||
|災い
 
|呪い
|強度 / 50 + 10
|なし
|学習
|なし
|20
|
|-
|-
|麻痺||神経||
|破門
 
|呪い
|強度 / 50 + 20
|なし
|学習
|なし
|20
|
|-
|-
|盲目||||
|元素の傷跡
|呪い
|強度 / 40 + 8
|なし
|耐久
|なし
|20
|
|-
|-
|朦朧||||
|ナイトメア
|呪い
|強度 / 60 + 6
|なし
|学習
|なし
|50
|
|-
|-
|結露||冷気||
|妨害
|能力変化
|強度 / 20
|なし
|なし
|なし
|100
|
|}
|}
        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関数の条件)
**免疫である属性でも古代種フィート持ちの攻撃でダメージをもらう場合は付与されうる。
**衝撃の混乱と麻痺はこの条件がなくても付与される。
*属性強度依存<ref>未確認</ref>の確率を潜り抜けるのが必要。(多くの状態異常はchance関数を判定に含む)
*炎上と出血は耐性評価15以上には通らない
**例え古代種やforceのついた攻撃でも不能。
*ボスなどが獲得する抵抗でpowerを減らす処理が起きる。
*forceがない状態異常は以下の軽減処理を受ける。forceを持つのは電撃の麻痺、衝撃の混乱と麻痺のみ
**1. 無効エンチャントや種族としての無効を持っている場合、無効化される。
**2. 主能力で一部の状態異常は減衰される。
**3. 属性耐性(評価)で対応する状態異常は減衰される。評価1段階ごとに大幅に通りにくくなる。




<references />
<references />

Latest revision as of 14:10, 22 September 2025

主に属性強度(eleP、状態異常の通りやすさのあれ)と 状態異常にかかる際の軽減についての処理なんかを記載する予定。

DamageHPの一部とCondition.csとかを中心に見ていく。

状態異常の概要

状態異常の強度

全ての状態異常は、付与される際に「状態異常の強度」を必要とします。

状態異常の強度は実際に付与される状態異常のターン数と状態異常の効果量に影響します。

強度が蓄積可能な状態異常であれば、複数回付与することで強度が上昇し、結果的にターン数と効果量が増加することになります。

状態異常の深度

また、「朦朧->混濁」や「切り傷->出血->大出血」[1]のように一部の状態異常には深度がありますが、これは残りターン数によって段階が決定されています。

例えば朦朧は蓄積可能な状態異常なので、連続して付与することでターン数が伸び、一定の残りターン数になると深度が混濁になる、ということが起こっています。[2]

状態異常の強制付与

一部の状態異常は軽減に使用する能力や属性耐性、無効化方法が設定されています。

特定の方法(電撃属性による麻痺や危ない本による恐怖など)で付与される状態異常は上記3つを無視することができます。

特に電撃属性による麻痺付与は便宜上「スタン」と呼ばれることがありますが、強制付与される以外に違いは無く内部上は1ターンの麻痺と全く同一のものです。[3]

状態異常の一時的耐性

『』や《》付きのキャラクターは状態異常や呪いにかかると、それらに対しての一時的耐性を得ます。

状態異常の中には「一時的耐性係数」が設定されているものがあり、その状態異常が付与される度に一時的耐性係数の値分の一時的耐性を獲得します。


一時的耐性を持っているキャラクターに対して状態異常を付与しようとする際には、一時的耐性の値に応じて強度の軽減、もしくは付与が無効化されます。

一時的耐性の獲得・軽減・無効化は強制付与の場合も無視することはできません。

一般的な状態異常付与

魔法・アビリティによる付与やポーション・巻物・魔法杖の効果による付与、その他特殊処理による付与は状態異常の強度を直接指定することで付与しています。

魔法・アビリティによる付与はそのパワーを状態異常の強度に、ポーション・巻物・魔法杖の効果による付与はそのパワーが状態異常の強度として扱われていることが殆どです。

一時的耐性による軽減・無効化

if (c.GainResistFactor > 0 && CanGainConResist)
{
	if (c.GainResistFactor >= 400)
	{
		c.power /= 2;
	}
	ResistCon(c);
	if (c.power <= 0)
	{
		return null;
	}
}
...
public void ResistCon(Condition con)
{
	if (con.power > 0 && resistCon != null)
	{
		int a = ClassExtension.TryGetValue<int, int>((IDictionary<int, int>)resistCon, con.id, 0);
		if (1000 < EClass.rnd(a))
		{
			con.power = 0;
		}
		else if (500 < EClass.rnd(a))
		{
			con.power /= 5;
		}
		else if (200 < EClass.rnd(a))
		{
			con.power /= 3;
		}
		else if (100 < EClass.rnd(a))
		{
			con.power /= 2;
		}
	}
}

付与される状態異常に一時的耐性を持っている場合、一時的耐性の値に応じた確率で状態異常強度を軽減もしくは付与の無効化をします。

以下4つの処理を、状態異常の付与が無効になるか状態異常強度を減少するかするまで順番に行います。どの条件も満たさない場合は軽減や無効化は行われません。

1: 0 ~ (一時的耐性 - 1)の範囲のランダムな値が1000より大きいなら、状態異常の付与を無効
2: 0 ~ (一時的耐性 - 1)の範囲のランダムな値が500より大きいなら、状態異常強度を「0.2倍」に軽減
3: 0 ~ (一時的耐性 - 1)の範囲のランダムな値が300より大きいなら、状態異常強度を「0.333倍」に軽減
4: 0 ~ (一時的耐性 - 1)の範囲のランダムな値が100より大きいなら、状態異常強度を「0.5倍」に軽減

また、一時的耐性が400以上の場合、上記の軽減・無効化と重複して状態異常強度を「0.5」倍にします。

主能力による軽減

if (defenseAttribute != null)
{
	c.power = 100 * c.power / Mathf.Max(100 + defenseAttribute.Value, 1);
}

付与される状態異常に対応する主能力がある場合、付与するキャラクターの主能力に応じて状態異常強度は軽減されます。

軽減率は以下の式で算出されます。

状態異常強度 = 状態異常強度 / (1 + 対応主能力 × 0.01)

属性耐性による軽減・無効化

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

付与される状態異常に対応する属性耐性が5以上ある場合、状態異常強度は軽減されます。(弱点の場合は何も行われません。)

軽減率は以下の式で算出されます。

状態異常強度 = 状態異常強度 / CLAMP(属性耐性 / 5, 1, 4) ^ 2 + 1

表に直すと軽減率は以下のようになります。[4]

1 (耐性) 2 (強い耐性) 3 (素晴らしい耐性) 4 (免疫)
×0.5 ×0.2 ×0.1 ×0.06

さらに、この軽減によって状態異常強度が40以下になった場合、付与は無効化されます。


また、状態異常が炎上で、付与するキャラクターの火炎属性耐性が15以上だった場合、状態異常強度に関わらず付与は無効化されます。

状態異常が出血で、付与するキャラクターの出血属性耐性が15以上だった場合、状態異常強度に関わらず付与は無効化されます。

ターン数算出・付与

int num2 = c.EvaluateTurn(c.power);
if (num2 == 0)
{
	return null;
}
c.value = num2;
conditions.Add(c);
...
public virtual int EvaluateTurn(int p)
{
	return Mathf.Max(1, base.source.duration.Calc(p, 0, P2));
}

これまでの処理で無効化されておらず、状態異常強度が1未満になっていないなら付与する状態異常のターン数を算出します。(計算式については状態異常表を参照)

算出した結果1ターン未満になった場合、最低でも1ターンが保障されます。

その後、算出したターン数分の状態異常を付与します。

一時的耐性の獲得

if (CanGainConResist)
{
	AddResistCon(c);
}
...
public void AddResistCon(Condition con)
{
	if (con.power > 0 && con.GainResistFactor > 0)
	{
		int key = con.id;
		if (resistCon == null)
		{
			resistCon = new Dictionary<int, int>();
		}
		if (resistCon.ContainsKey(key))
		{
			resistCon[key] += con.power * con.GainResistFactor / 100;
		}
		else
		{
			resistCon[key] = con.power * con.GainResistFactor / 100;
		}
	}
}

状態異常が付与されると、『』か《》付きのキャラクターは付与された際の強度に応じて一時的耐性が蓄積されます。

蓄積する一時耐性の値は以下の式で算出されます。(計算式については状態異常表を参照)

獲得一時耐性値 = 状態異常強度 × (一時的耐性係数 / 100)

攻撃による状態異常付与

あらゆる攻撃は、そのダメージ量とは別に「属性強度」という値を持ちます。[5]

物理攻撃魔法攻撃で属性ダメージを受ける際には、属性強度に基づいて状態異常の付与確率と状態異常の強度が決定されます。

実際に付与される状態異常のターン数や軽減・無効化については一般的な付与と同じです。

属性強度の実際の値と計算式については、各ページを参照してください。

攻撃による状態異常付与の一般的な条件

if (dmg > 0 || (origin != null && origin.HasElement(1345)))
{
	ApplyElementEffect(e, eleP, origin);
}

攻撃による状態異常付与は、まず1ダメージ以上を与える必要があります。

キズアミを信仰しているキャラクターはこの条件を無視することができます。

火炎属性

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

火炎属性の攻撃で炎上が付与されます。

付与確率は「30 + 属性強度 / 5」%で、最低30%、最大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;

冷気属性の攻撃で濡れ・凍結が付与されます。

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

濡れの付与確率は「50 + 属性強度 / 10」%で、最低50%、最大100%です。

付与される濡れの強度は「属性強度」と等しいです。

凍結の付与確率は「30 + 属性強度 / 10」%で、最低30%、最大100%です。

付与される凍結の強度は「属性強度」と等しいです。

電撃属性

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

電撃属性の攻撃で麻痺が付与されます。

付与確率は「(75 + 属性強度 / 20) * 0.333」%で、最低約「25」%、最大「33.3」%です。

付与される麻痺は「1」ターンで、これは耐性や無効化を無視します。

暗黒属性

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

暗黒属性の攻撃で盲目が付与されます。

付与確率は「30 + 属性強度 / 5」%で、最低約30%、最大100%です。

付与される盲目の強度は「属性強度」と等しいです。

幻惑属性

case 914:
	flag = 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;
...
if (Chara.conSleep != null && flag)
{
	Chara.conSleep.Kill();
}

幻惑属性の攻撃で混乱か睡眠が付与されます。

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

混乱・麻痺ともに付与確率は「30 + 属性強度 / 5」%で、最低30%、最大100%です。

付与される状態異常の強度は「属性強度」と等しいです。

また、この属性の攻撃では睡眠が解除されません。

毒属性

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

毒属性の攻撃で毒が付与されます。

付与確率は「30 + 属性強度 / 5」%で、最低約30%、最大100%です。

付与される毒の強度は「属性強度」と等しいです。

轟音属性

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

轟音属性の攻撃で朦朧が付与されます。

混乱・麻痺ともに付与確率は「50 + 属性強度 / 10」%で、最低50%、最大100%です。

付与される状態異常の強度は「属性強度」と等しいです。

神経属性

case 918:
	flag = false;
	if (Chance(30 + eleP / 5, 100))
	{
		Chara.AddCondition<ConParalyze>(eleP);
	}
	break;
...
if (Chara.conSleep != null && flag)
{
	Chara.conSleep.Kill();
}

神経属性の攻撃で麻痺が付与されます。 付与確率は「30 + 属性強度 / 5」%で、最低30%、最大100%です。

付与される麻痺の強度は「属性強度」と等しいです。

また、この属性の攻撃では睡眠が解除されません。

混沌属性

case 920:
	flag = 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))
	{
		MarkHostile().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;
...
if (Chara.conSleep != null && flag)
{
	Chara.conSleep.Kill();
}

混沌属性の攻撃で盲目・麻痺・混乱・毒・睡眠・朦朧が付与され、狂気度が上昇します。

それぞれの状態異常が同時に付与されることがあります。また、この属性の攻撃では睡眠が解除されません。

盲目の付与確率は「5 + 属性強度 / 25」%で、最低5%、最大「40」%です。

付与される盲目の強度は「属性強度 / 2」です。

麻痺の付与確率は「5 + 属性強度 / 25」%で、最低5%、最大「40」%です。

付与される麻痺の強度は「属性強度 / 2」です。

混乱の付与確率は「5 + 属性強度 / 25」%で、最低5%、最大「40」%です。

付与される混乱の強度は「属性強度 / 2」です。

毒の付与確率は「5 + 属性強度 / 25」%で、最低5%、最大「40」%です。

付与される毒の強度は「属性強度 / 2」です。

睡眠の付与確率は「5 + 属性強度 / 25」%で、最低5%、最大「40」%です。

付与される睡眠の強度は「属性強度 / 2」です。

朦朧の付与確率は「5 + 属性強度 / 25」%で、最低5%、最大「40」%です。

付与される朦朧の強度は「属性強度 / 2」です。

狂気度の上昇確率は「(30 + 属性強度 / 10) / 2」%で、最低15%、最大「50」%です。

上昇する狂気度は「1」です。

エーテル属性

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

エーテル属性の攻撃でエーテル病が進行します。

進行確率は100%です。

進行度は「0 ~ (10 + 属性強度 / 50)の範囲内のランダムな値」です。[6]

酸属性

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

酸属性の攻撃で装備品の劣化判定が発生します。 付与確率は「(50 + 属性強度 / 10) / 4」%で、最低12.5%、最大「25」%です。

出血属性

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

出血属性の攻撃で出血が付与されます。

付与確率は「50 + 属性強度 / 10」%で、最低50%、最大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つが付与されます。

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

朦朧の付与確率は「30 + 属性強度 / 5」%で、最低30%、最大100%です。

付与される朦朧の強度は「属性強度」と等しいです。

麻痺の付与確率は100%です。

付与される麻痺は「1」ターンで、耐性や無効化を無視します。

混乱の付与確率は100%です。

付与される混乱の強度は「1 ~ 3の範囲内のランダムな値」で、耐性や無効化を無視します。

状態異常表

ゲーム内の状態異常は全部で81種ありますが、ここではよく参照されるであろうもののみ掲載します。

名前 種別 ターン数 無効化 軽減主能力 軽減属性耐性 一時的耐性係数 備考
悪性状態異常 強度 / 4 毒無効 耐久 毒属性耐性 100 ターン数30~: 猛毒
呼吸困難 悪性状態異常 強度 水中呼吸 耐久 なし 200 ターン数0~9: 表記なし, ターン数10~19: 呼吸困難, ターン数20~: 窒息
炎上 悪性状態異常 強度 / 30 火炎属性耐性(15) なし なし 100
恐怖 悪性状態異常 強度 / 10 恐怖無効 意志 幻惑属性耐性 200
睡眠 悪性状態異常 強度 / 10 睡眠無効 意志 神経属性耐性 500
気絶 悪性状態異常 強度 / 10 なし 感覚 なし 600
拘束 悪性状態異常 強度 / 20 なし 器用 なし 200
麻痺 悪性状態異常 強度 / 20 麻痺無効 感覚 神経属性耐性 800
混乱 悪性状態異常 強度 / 7 混乱無効 意志 幻惑属性耐性 200
盲目 悪性状態異常 強度 / 8 盲目無効 感覚 暗黒属性耐性 100
狂気 悪性状態異常 強度 / 10 なし 学習 なし 100 ターン数0~49: 不安定, ターン数50~89: 狂気, ターン数90~: 崩壊
出血 悪性状態異常 強度 / 10 魔導生命体,出血属性耐性(15) 耐久 なし 200 ターン数0~49: 切り傷, ターン数50~89: 出血, ターン数90~: 大出血
朦朧 悪性状態異常 強度 / 10 魔導生命体 意志 轟音属性耐性 500 ターン数0~49: 朦朧, ターン数50~: 混濁
幻覚 悪性状態異常 強度 なし なし なし 100
結露 悪性状態異常 強度 / 10 なし なし 冷気属性耐性 100 ターン数0~49: 結露, ターン数50~: 凍結
狂戦士化 悪性状態異常 5 なし なし なし 0
瘴気 呪い 強度 / 100 + 5 なし なし なし 0
重力 呪い 強度 / 20 + 10 なし なし なし 0
沈黙 呪い 強度 / 80 + 5 なし 意志 なし 500
脆弱 呪い 強度 / 50 + 10 なし 意志 なし 20
災い 呪い 強度 / 50 + 10 なし 学習 なし 20
破門 呪い 強度 / 50 + 20 なし 学習 なし 20
元素の傷跡 呪い 強度 / 40 + 8 なし 耐久 なし 20
ナイトメア 呪い 強度 / 60 + 6 なし 学習 なし 50
妨害 能力変化 強度 / 20 なし なし なし 100


  1. これらは名称・挙動こそ異なるものの、内部上では同一の状態異常として扱われている。
  2. 病気などターン経過によって残りターン数が減少しないものもありますが、それらは「ターン経過による減少処理」を無効化して実現しています。
  3. 既に2ターン以上の麻痺が付与されている状態で1ターンの麻痺に上書きされるのもこのため。
  4. 免疫でも状態異常強度が残るため、古代種フィートやメタルフィートなどで免疫属性のダメージを受けた場合はその属性の状態異常も付与される。 免疫≠状態な事に注意。
  5. 楽器も属性強度がありますが、説明を簡潔にするためこのページでは攻撃によるもののみ扱います。
  6. 参考として、進行度50でエーテル溶解液1個分相当、進行度200でエーテル抗体1個分相当。