250
edits
(エーテル病処理を消す(エーテル病のページはあるのでそこに移したいが追跡対象の解析ページが増えるのは主にモチベ的にきつい)) |
(一般的な状態異常付与を書く) |
||
| Line 16: | Line 16: | ||
また、「朦朧->混濁」や「切り傷->出血->大出血」<ref>これらは名称・挙動こそ異なるものの、内部上では同一の状態異常として扱われている。</ref>のように一部の状態異常には深度がありますが、これは残りターン数によって段階が決定されています。 | また、「朦朧->混濁」や「切り傷->出血->大出血」<ref>これらは名称・挙動こそ異なるものの、内部上では同一の状態異常として扱われている。</ref>のように一部の状態異常には深度がありますが、これは残りターン数によって段階が決定されています。 | ||
例えば朦朧は蓄積可能な状態異常なので、連続して付与することでターン数が伸び、一定の残りターン数になると深度が混濁になる、ということが起こっています。 | 例えば朦朧は蓄積可能な状態異常なので、連続して付与することでターン数が伸び、一定の残りターン数になると深度が混濁になる、ということが起こっています。<ref>病気などターン経過によって残りターン数が減少しないものもありますが、それらは「ターン経過による減少処理」を無効化して実現しています。</ref> | ||
=== 状態異常の強制付与 === | === 状態異常の強制付与 === | ||
| Line 36: | Line 36: | ||
== 一般的な状態異常付与 == | == 一般的な状態異常付与 == | ||
魔法による付与やポーション・巻物・魔法杖の効果による付与、その他特殊処理による付与は状態異常の強度を直接指定することで付与しています。 | |||
魔法による付与は魔法パワーを状態異常の強度に、ポーション・巻物・魔法杖の効果による付与はそのパワーが状態異常の強度として扱われていることが殆どです。 | |||
=== 一時的耐性による軽減・無効化 === | |||
<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 359: | Line 511: | ||
付与される混乱の強度は'''「1 ~ 3の範囲内のランダムな値」'''で、耐性や無効化を無視します。 | 付与される混乱の強度は'''「1 ~ 3の範囲内のランダムな値」'''で、耐性や無効化を無視します。 | ||
<references /> | <references /> | ||
edits