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