Jump to content

Elin:解析/物理戦闘: Difference between revisions

物理戦闘に直接関わる盾エンチャントについて記載。突進の攻撃倍率の記載漏れを修正。影抜きエンチャントによる逆襲エンチャントの無効化を追加。
m (投擲にもノックバックはのる)
(物理戦闘に直接関わる盾エンチャントについて記載。突進の攻撃倍率の記載漏れを修正。影抜きエンチャントによる逆襲エンチャントの無効化を追加。)
Line 768: Line 768:
if (chaser > EClass.rnd(4 + (int)Mathf.Pow(4f, j + 2)))
if (chaser > EClass.rnd(4 + (int)Mathf.Pow(4f, j + 2)))
{
{
num5++;
num8++;
}
}
}
}
}
}
bool flag = false;
bool flag = false;
for (int k = 0; k < num5; k++)
for (int k = 0; k < num8; k++)
{
{
if (!Act.CC.IsAliveInCurrentZone)
{
break;
}
if (!Act.TC.IsAliveInCurrentZone)
{
break;
}
if (k > 0)
if (k > 0)
{
{
Act.CC.Say("attack_chaser");
Act.CC.Say("attack_chaser");
}
}
flag = AttackProcess.Current.Perform(count, hasHit, dmgMulti * mtp, maxRoll, subAttack);
flag = AttackProcess.Current.Perform(count, hasHit, dmgMulti * mtp * BaseDmgMTP, maxRoll, subAttack);
if (!flag && frustration > 0 && 10f + 2f * Mathf.Sqrt(frustration) > (float)EClass.rnd(100))
if (!flag && frustration > 0 && !Act.TC.HasElement(439) && 10f + 2f * Mathf.Sqrt(frustration) > (float)EClass.rnd(100))
{
{
AttackProcess.Current.critFury = true;
AttackProcess.Current.critFury = true;
Line 794: Line 802:
追尾エンチャントは、攻撃が回避された場合、攻撃が命中するまで追尾の回数分再度攻撃を行います。
追尾エンチャントは、攻撃が回避された場合、攻撃が命中するまで追尾の回数分再度攻撃を行います。


逆襲エンチャントは、攻撃が回避された場合、確率で必中のクリティカルになる攻撃を行います。
逆襲エンチャントは、影抜きエンチャントを持たない攻撃対象に攻撃が回避された場合、確率で必中のクリティカルになる攻撃を行います。


追尾と逆襲は共存し、追尾による攻撃1回毎にも逆襲の判定が行われます。逆襲が発動した場合、追尾による再攻撃は終了します。
追尾と逆襲は共存し、追尾による攻撃1回毎にも逆襲の判定が行われます。逆襲が発動した場合、追尾による再攻撃は終了します。


追尾の回数は "追尾エンチャント強度 > 0~「4 + 4 ^ (追尾回数 + 2)」までのランダムな値" の判定を満たし続ける限り、最大10回まで増加します。
追尾の回数は "追尾エンチャント強度 > 0~「4 + 4 ^ (追尾回数 + 2)」までのランダムな値" の判定を満たし続ける限り、最大10回まで増加します。
Line 1,012: Line 1,018:


効果は常に発動し、エンチャント強度による発動率などへの影響はありません。
効果は常に発動し、エンチャント強度による発動率などへの影響はありません。
== 盾エンチャント ==
=== カウンター ===
<syntaxhighlight lang="c#">
if (orgTC.isChara && orgTC.ExistsOnMap && orgTC != cC && !orgTC.IsRestrainedResident && ACT.Melee.CanPerform(orgTC.Chara, cC))
{
...
else if (AllowCounter && hasMissed && !cC.HasElement(439) && orgTC.HasElement(380))
{
orgTC.Say((orgTC.isChara && orgTC.Chara.IsHostile()) ? "counter_enemy" : "counter");
new ActMeleeCounter().Perform(orgTC.Chara, cC);
}
}
</syntaxhighlight>影抜きエンチャントを持たない攻撃者の攻撃を攻撃対象が1度でも回避に成功した場合、攻撃者による攻撃が全て終了した後で攻撃対象は近接物理攻撃行動を行います。<ref name=":5">行動そのものを行うため、複数の武器を装備している場合はその分攻撃し、連撃や旋風などあらゆる(カウンター・パリィ以外の)エンチャントが適用されます。</ref>ただし、攻撃者が攻撃対象の攻撃可能範囲内に居る必要があります。
(攻撃者が追尾・逆襲エンチャントを持っていた場合、全ての追尾・逆襲の効果を回避する必要があります。)
これによる近接物理攻撃でカウンター・パリィは発生しません。
=== 盾の暴君 ===
シールドバッシュの攻撃力・貫通率、盾の発動エンチャントの発動率が増加します。
詳細は[[Elin:解析/物理戦闘#シールドバッシュ|「シールドバッシュ」の節]]、[[Elin:解析/物理戦闘#盾の発動エンチャント|「盾の発動エンチャント」の節]]を参照してください。
=== 突撃者 ===
<syntaxhighlight lang="c#">
float num2 = 1f + 0.1f * (float)num;
num2 = num2 * (float)(100 + EClass.curve(Act.CC.Evalue(382), 50, 25, 65)) / 100f;
Attack(num2);
if (Act.TC.isChara && Act.TC.ExistsOnMap && Act.CC.HasElement(382))
{
if (!Act.TC.IsPowerful || EClass.rnd(4) == 0)
{
Act.TC.Chara.AddCondition<ConParalyze>(2, force: true);
}
if (!Act.TC.IsPowerful || EClass.rnd(3) == 0)
{
Act.TC.Chara.AddCondition<ConDim>(5, force: true);
}
if (!Act.TC.IsPowerful || EClass.rnd(2) == 0)
{
Act.TC.Chara.AddCondition<ConConfuse>(8, force: true);
}
}
</syntaxhighlight>突進による物理攻撃力をエンチャント強度に応じて増加させます。
倍率は「1 + [[Elin:解析/共通処理|CURVE]](突撃者エンチャント強度, 50, 25, 65) × 0.01」倍です。
また、突進後に、
1ターンの麻痺を攻撃対象に耐性や無効化エンチャントを無視して強制的に付与します。攻撃対象が『』や《》つきの場合、これは'''「25」'''%の確率で発生します。
強度5の朦朧を攻撃対象に耐性や無効化エンチャントを無視して強制的に付与します。攻撃対象が『』や《》つきの場合、これは'''「33」'''%の確率で発生します。
強度8の混乱を攻撃対象に耐性や無効化エンチャントを無視して強制的に付与します。攻撃対象が『』や《》つきの場合、これは'''「50」'''%の確率で発生します。
=== パリィ ===
影抜きエンチャントを持たない攻撃者からのパリィ判定に成功した場合、攻撃を無効化して反撃します。
詳細は[[Elin:解析/物理戦闘#パリィ判定|「パリィ」の節]]を参照してください。
== パリィ ==
<syntaxhighlight lang="c#">
if (AllowParry && !Act.TC.IsDisabled && !Act.TC.IsRestrainedResident)
{
int num5 = Act.TC.Evalue(437);
if (num5 > 0 && !Act.CC.HasElement(439))
{
int num6 = EClass.curve(5 + num5 / 3, 10, 3, 70);
int num7 = Act.TC.Evalue(123);
if (Act.TC.isChara)
{
foreach (BodySlot slot2 in Act.TC.Chara.body.slots)
{
if (slot2.thing != null && slot2.thing.HasElement(437) && Act.TC.Evalue(slot2.thing.category.skill) > num7)
{
num7 = Act.TC.Evalue(slot2.thing.category.skill);
}
}
}
num6 = num6 * 100 / (int)Mathf.Clamp((float)AttackProcess.Current.weaponSkill.Value / (float)num7 * 100f, 50f, 150f);
if (EClass.rnd(100) < num6)
{
Act.TC.Say((Act.TC.isChara && Act.TC.Chara.IsHostile()) ? "parry_enemy" : "parry");
Act.TC.PlaySound("parry");
parried = true;
return;
}
}
}
</syntaxhighlight>攻撃者が影抜きエンチャントを持たない場合、攻撃1回ごとに命中判定に入る前にパリィ判定を行います。
=== パリィ判定 ===
パリィ判定は以下のように行われます。
1.パリィエンチャント強度から「パリィ基礎成功率」を求める。
パリィ基礎成功率(%) = [[Elin:解析/共通処理|CURVE]](5 + 攻撃対象のパリィエンチャント強度合計 / 3, 10, 3, 70)
2.攻撃対象の盾スキルとパリィエンチャントが付与されている全ての装備の関連スキルをそれぞれ比較し、最も高い値を攻撃対象の「パリィスキル」とする。
3.攻撃者の武器スキルとパリィスキルから、「パリィ成功率補正」を求める。
パリィ成功率補正 = CLAMP<ref name=":6" />(攻撃者の武器スキル / パリィスキル, 0.5, 1.5)
4.パリィ基礎成功率とパリィ成功率補正から「パリィ成功率」を求める。
パリィ成功率(%) = パリィ基礎成功率 / パリィ成功率補正
5.パリィ成功率ぶんの確率でパリィ判定は成功する。
パリィ判定に成功した場合、それ以降に発生するあらゆる攻撃者からの攻撃や処理を全て中断します。
3
その後、攻撃対象は近接物理攻撃行動を行います。<ref name=":5" />
これによる近接物理攻撃でカウンター・パリィは発生しません。


==命中判定==
==命中判定==
Line 1,144: Line 1,262:
その後攻撃倍率と距離修正をかけたものです。
その後攻撃倍率と距離修正をかけたものです。


(「攻撃能力の算出」の節を参照してください。)
([[Elin:解析/物理戦闘#攻撃能力の算出|「攻撃能力の算出」の節]]を参照してください。)


クリティカルだった場合、ダイスロールの結果は最大値になり、格闘攻撃のみ攻撃力が1.25倍になります。
クリティカルだった場合、ダイスロールの結果は最大値になり、格闘攻撃のみ攻撃力が1.25倍になります。
Line 1,189: Line 1,307:
==== 行動による攻撃倍率 ====
==== 行動による攻撃倍率 ====
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
public class ActRush : ActMelee
{
...
    int num = Act.CC.Dist(Act.TP);
...
float num2 = 1f + 0.1f * (float)num;
num2 = num2 * (float)(100 + EClass.curve(Act.CC.Evalue(382), 50, 25, 65)) / 100f;
Attack(num2);
...
}
public class ActMeleeBladeStorm : ActMelee
public class ActMeleeBladeStorm : ActMelee
{
{
Line 1,204: Line 1,332:
public override float BaseDmgMTP => 1.5f;
public override float BaseDmgMTP => 1.5f;
}
}
</syntaxhighlight>斬撃無双・カウンター・パリィから発生した近接攻撃はそれぞれ追加の攻撃倍率を持ち、それを攻撃力に乗算します。
</syntaxhighlight>突進・斬撃無双・カウンター・パリィから発生した近接攻撃はそれぞれ追加の攻撃倍率を持ち、それを攻撃力に乗算します。


攻撃力は以下のようになります。
攻撃力は以下のようになります。
  物理攻撃力 = 物理攻撃力 × 追加の攻撃倍率
  物理攻撃力 = 物理攻撃力 × 追加の攻撃倍率
斬撃無双の攻撃倍率は'''「0.2」'''倍、カウンターの攻撃倍率は'''「1」'''<ref>変動するような仕組みは用意されているものの、bonusが初期値以外の値を取らないため現状は1倍で固定。</ref>倍、パリィの攻撃倍率は'''「1.5」'''倍です。
斬撃無双の攻撃倍率は'''「0.2」'''倍、カウンターの攻撃倍率は'''「1」'''<ref>変動するような仕組みは用意されているものの、bonusが初期値以外の値を取らないため現状は1倍で固定。</ref>倍、パリィの攻撃倍率は'''「1.5」'''倍です。
突進の攻撃倍率は以下の式で算出されます。
突進攻撃倍率 = (1 + 攻撃対象との距離 × 0.1) × (1 + [[Elin:解析/共通処理|CURVE]](突撃者エンチャント強度, 50, 25, 65) × 0.01)


==== 物理攻撃力の上限 ====
==== 物理攻撃力の上限 ====
Line 1,436: Line 1,567:


シールドバッシュの発生確率は以下の式で算出されます。
シールドバッシュの発生確率は以下の式で算出されます。
  シールドバッシュ発生率(%) = CLAMP<ref>値を一定範囲内に制限する関数です。 関数内の1つめの引数の値は、「2つめの引数の値」~「3つめの引数の値」の範囲内になるよう補正されます。</ref>(√(攻撃者の盾スキル) - 2, 8, 15) + MIN(√(盾の暴君エンチャント強度), 25)
  シールドバッシュ発生率(%) = CLAMP<ref name=":6">値を一定範囲内に制限する関数です。 関数内の1つめの引数の値は、「2つめの引数の値」~「3つめの引数の値」の範囲内になるよう補正されます。</ref>(√(攻撃者の盾スキル) - 2, 8, 15) + MIN(√(盾の暴君エンチャント強度), 25)
発動率の最小は「8」%です。
発動率の最小は「8」%です。


250

edits