Elin:解析/戦闘: Difference between revisions

m
ページ内容を分割したページを作成したため、Spoilerタグを外して解析ページ一覧から削除。(旧ページとして残るように。)
m (Sakumashiki がページ「Elin:解析/ダメージ計算式」を「Elin:解析/戦闘」に移動しました: EN版と名称を合わせるため、命中率の計算式なども掲載するため)
m (ページ内容を分割したページを作成したため、Spoilerタグを外して解析ページ一覧から削除。(旧ページとして残るように。))
 
(21 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{解析}}
{{解析}}
 
{{DISPLAYTITLE:{{SUBPAGENAME}}}}
==Evalueリスト==
==Evalueリスト==
{| class="wikitable"
{| class="wikitable"
Line 48: Line 48:
|}
|}


== 格闘==
 
==敵のレベルに応じたダメージ軽減==
{{バージョン|23.83}}
 
レベル50を超えた敵が受けるダメージ軽減量は以下の通りです:
 
まず、レベル50以下の敵の軽減率は0%、レベル1074以上の敵は軽減率80%となります。
if (!this.IsPCFaction && this.LV > 50)
{
    dmg = dmg * (100 - (int)Mathf.Min(80f, Mathf.Sqrt((float)(this.LV - 50)) * 2.5f)) / 100;
}
 
 
 
プレイヤーのファクションに属するキャラで、敵のレベルがLv50より高い場合:
 
与えるダメージに、* (100 - [  2.5 * √(敵のレベル - 50)  か 80 かのうち小さいほう ]<ref>正確には小さい方を四捨五入したもの</ref>) / 100が掛けられます。
 
つまり、Lv1074以上の敵に対してはダメージが80%減少し、Lv51~Lv1073の敵に対しては[sqrt(敵Lv-50) * 2.5]%減少します。
{| class="wikitable"
|+レベル毎のダメージ軽減
!敵のLv
!軽減率(%)
|-
|51
|2
|-
|100
|17
|-
|150
|25
|-
|200
|30
|-
|250
|35
|-
|300
|39
|-
|350
|43
|-
|400
|46
|-
|450
|50
|-
|500
|53
|-
|550
|55
|-
|600
|58
|-
|650
|61
|-
|700
|63
|-
|750
|66
|-
|800
|68
|-
|850
|70
|-
|900
|72
|-
|950
|75
|-
|1000
|77
|-
|1050
|79
|-
|1074
|80
|-
|1100
|80
|}
 
== 命中率==
 
{{バージョン|23.83}}
[[File:Function curve as of EA23.46.png|thumb|upright=3.0|バージョン EA23.46 のCURVE 関数の入力(オレンジ色)と出力(藍)です。Output = Curve(Input, 50, 25, 75) ]]
「CURVE」とはElinにて、スキル値の有効性を段階的に抑制する処理です。
CURVE( input, start, step, rate)
if input <= start
return input
repeat x10
{
  num = start + repeatindex * step
if input <= num
return input
else
input = num + (input - num) * rate /100
}
return input
まず、システムは攻撃者の「命中力」とターゲットの「回避力」を評価します。
 
命中力の値は、使用する武器の種類(投擲、遠距離、近接、格闘)とスタイルによって異なる計算式で算出されます。
 
{| class="wikitable wikitable」"
|+命中
!武器の種類
!計算式
|-
|投擲
|CURVE([攻撃者の器用] / 4 + [攻撃者の筋力] / 2 + [攻撃者の武器スキル], 50, 25, 75) + 75(PCのファクション以外の場合250)
|-
|格闘 (盾なし)
|CURVE([攻撃者の器用] / 3 + [攻撃者の武器の主能力] / 3 + [攻撃者の武器スキル], 50, 25, 75) + 50
|-
|格闘 (盾あり)
|CURVE([攻撃者の器用] / 3 + [攻撃者の武器の主能力] / 3 + [攻撃者の武器スキル], 50, 25, 75) + 50 の結果に0.75をかけたもの
|-
|ワンド
|CURVE([攻撃者の意志] / 4 + [攻撃者の武器の主能力] / 3 + [攻撃者の武器スキル], 50, 25, 75) + 100
|-
|その他すべての武器
|CURVE([攻撃者の器用or意志] / 4 + [攻撃者の武器の主能力] / 3 + [攻撃者の武器スキル], 50, 25, 75) + 50
|}
上記の式で算出した値に装備と武器による命中修正が足し算され、その後遠距離武器には距離による修正が適用されたものが「命中力」となります。
 
 
 
「回避力」はこちらの式で計算されます。:CURVE ([対象の感覚] / 3 + [対象の回避スキル], 50, 10, 75) + [対象のDV] + 25
 
 
命中力・回避力に影響を与える以下の要素は、複合して作用しながら次の表の上から順で適用されます。<ref>プログラムでは、X=X+1のように、同じ文字が一つの式に複数回登場して右辺にあるものが調整前の数字、左辺にあるものが調整後の数字になる記法があります。</ref>
 
{| class="wikitable"
|+命中修正
!条件
!効果
|-
|攻撃者が災い状態
|命中力 = 命中力 * 0.75
|-
|攻撃者が高所にいる
|命中力 = 命中力 * 1.2
|-
|攻撃者が乗馬している
|命中力 = 命中力 * 100 / (100 + 500 / ('''5''' or '''10 + [攻撃者の乗馬スキル]''' の高い方))
|-
|攻撃者がペットを寄生させている
|命中力 = 命中力 * 100 / (100 + 1000 / ('''5''' or '''10 + [攻撃者の共存スキル]''' の高い方))
|-
|騎乗されているペットによる攻撃
|命中力 = 命中力 * 100 / (100 + 1000 / ('''5''' or '''10 + [攻撃者の筋力]''' の高い方))
|-
|寄生しているペットによる攻撃
|命中力 = 命中力 * 100 / (100 + 1000 / ('''5''' または '''10 + [攻撃者の器用]''' の高い方))
|-
|攻撃者が両手持ち
| 命中力 = 命中力 + 25 + sqrt([攻撃者の両手持ちスキル] * 2) 
|-
|攻撃者が二刀流
|命中力 = 命中力 * 100 / (115 + 手の番号 * 15 + 手の番号 *(2000 / (20 + [攻撃者の二刀流スキル])[0-100でクランプ<ref>クランプとは値に上限と下限を適用するという意味です。この場合、確率なので0から100%に設定されています</ref>])
|-
|攻撃者が盲目
|命中力 = 命中力 * 0.333 (または、遠距離/投擲の場合は0.1)
|-
|対象が盲目
|回避力 = 回避力 * 0.5
|-
|対象が混乱もしくは朦朧
|回避力 = 回避力 * 0.5
|-
|対象が高所にいる
|回避力 = 回避力 * 1.2
|}
 
二刀流の補足説明:
 
ここでいう、「手の番号」は利き手・もう片方の手と、カオスシェイプなどが持つ2本目以降の手を表します。
 
1-100の間でクランプされるのは(2000 / (20 + [攻撃者の二刀流スキル])だけです。つまり、二刀流で最適化するには、二刀流スキルが1980必要です。
 
 
ここまでで最終的な命中力と回避力を計算しました。以下では攻撃が命中するか、外れるか、クリティカルになるかするまで、上から順に判定します。
苛立エンチャントの効果による攻撃の場合、確定クリティカル。
 
対象が朦朧状態の場合、25%の確率でクリティカル
 
対象が死亡または睡眠状態の場合、確定でクリティカル
 
[対象の見切りスキル] * 10 > 命中力の場合、見切り成否判定を行う。
見切り力 = 回避力 * 100 / 命中力 とし、以下3つの式を上から順に処理する。<ref>見切り力が301以上であれば、見切りによる回避判定は3回行われる</ref>
見切り力 > 300 かつ、 random 0 - ([対象の見切りスキル] + 250) > 100 のとき、攻撃は外れる
見切り力 > 200 かつ、 random 0 - ([対象の見切りスキル] + 250) > 150 のとき、攻撃は外れる
見切り力 > 150 かつ、 random 0 - ([対象の見切りスキル] + 250) > 200 のとき、攻撃は外れる
 
[対象の完全回避] > random 0 - 99 のとき、攻撃は外れる (random X-Yは等確率でXからYまでの乱数を生成する関数。0から99までの値が等確率で選ばれる。完全回避分の確率で回避する。)
 
random 0 - 19 が 0 のとき、攻撃は命中 (5%で対象の回避を無視して命中する)<ref name=":0">この場合、クリティカルにはならない。</ref>
 
random 0 - 19 が 0 のとき、攻撃は外れる (5%で攻撃者の命中を無視して外れる)
 
命中力 < 1 のとき、攻撃は外れる
 
回避力 < 1 のとき、攻撃は命中<ref name=":0" />
 
random 0 - 命中力 < random 0 - (回避力 * 125 (遠距離攻撃なら150) / 100) のとき、攻撃は外れる
 
random 0 - 5000 < [攻撃者の感覚] + 50 のとき、攻撃はクリティカル
 
[攻撃者のクリティカルエンチャント合計] + sqrt([攻撃者の心眼スキル]) > random 0 - 200のとき、攻撃はクリティカル
 
攻撃者が[死の真髄]フィートを所持している場合、以下の判定を行う
    HP減少率 = 100 - [攻撃者の現在HP] * 100 / [攻撃者の最大HP]
    HP減少率 >= 50 かつ、 (HP減少率 ^ 4 / 3) > random 0 - 100000000 のとき、攻撃はクリティカル (HPが5割以上減っている状態で、減少率に応じて最小2%~最大33%の確率でクリティカル)
 
攻撃は命中
 
==格闘==
<syntaxhighlight lang="c#" line="1">
<syntaxhighlight lang="c#" line="1">
else if (this.IsMartial || this.IsMartialWeapon)
else if (IsMartial || IsMartialWeapon)
{
{
    this.weaponSkill = this.CC.elements.GetOrCreateElement(100);
weaponSkill = CC.elements.GetOrCreateElement(100);
    this.attackType = (this.CC.race.meleeStyle.IsEmpty() ? ((EClass.rnd(2) == 0) ? AttackType.Kick : AttackType.Punch) : this.CC.race.meleeStyle.ToEnum(true));
bool flag2 = weapon != null && weapon.Evalue(482) > 0;
    this.dBonus = this.CC.DMG + this.CC.encLV + (int)Mathf.Sqrt((float)(this.CC.STR / 5 + this.weaponSkill.Value / 4));
if (flag2)
    this.dNum = 2 + Mathf.Min(this.weaponSkill.Value / 10, 4);
{
    this.dDim = 5 + (int)Mathf.Sqrt((float)(this.weaponSkill.Value / 3));
weaponSkill = CC.elements.GetOrCreateElement(305);
    this.dMulti = 0.6f + (float)(this.CC.STR / 2 + this.weaponSkill.Value / 2 + this.CC.Evalue(132) / 2) / 50f;
}
    this.dMulti += 0.05f * (float)this.CC.Evalue(1400);
attackType = ((!CC.race.meleeStyle.IsEmpty()) ? CC.race.meleeStyle.ToEnum<AttackType>() : ((EClass.rnd(2) == 0) ? AttackType.Kick : AttackType.Punch));
    this.toHitBase = EClass.curve(this.CC.DEX / 3 + this.CC.STR / 3 + this.weaponSkill.Value, 50, 25, 75) + 50;
dBonus = CC.DMG + CC.encLV + (int)Mathf.Sqrt(Mathf.Max(0, weaponSkill.GetParent(CC).Value / 5 + weaponSkill.Value / 4));
    this.toHitFix = this.CC.HIT;
dNum = 2 + Mathf.Min(weaponSkill.Value / 10, 4);
    if (this.attackStyle == AttackStyle.Shield)
dDim = 5 + (int)Mathf.Sqrt(Mathf.Max(0, weaponSkill.Value / 3));
    {
dMulti = 0.6f + (float)(weaponSkill.GetParent(CC).Value / 2 + weaponSkill.Value / 2 + CC.Evalue(flag2 ? 304 : 132) / 2) / 50f;
        this.toHitBase = this.toHitBase * 75 / 100;
dMulti += 0.05f * (float)CC.Evalue(1400);
    }
toHitBase = EClass.curve(CC.DEX / 3 + weaponSkill.GetParent(CC).Value / 3 + weaponSkill.Value, 50, 25) + 50;
    this.penetration = Mathf.Clamp(this.weaponSkill.Value / 10 + 5, 5, 20) + this.CC.Evalue(92);
toHitFix = CC.HIT;
    if (this.IsMartialWeapon)
if (attackStyle == AttackStyle.Shield)
    {
{
        this.dBonus += this.weapon.DMG;
toHitBase = toHitBase * 75 / 100;
        this.dNum += this.weapon.source.offense[0];
}
        this.dDim = Mathf.Max(this.dDim / 2 + this.weapon.c_diceDim, 1);
penetration = Mathf.Clamp(weaponSkill.Value / 10 + 5, 5, 20) + CC.Evalue(92);
        this.toHitFix += this.weapon.HIT;
if (IsMartialWeapon)
        this.penetration += this.weapon.Penetration;
{
        if (!this.weapon.source.attackType.IsEmpty())
dBonus += weapon.DMG;
        {
dNum += weapon.source.offense[0];
            this.attackType = this.weapon.source.attackType.ToEnum(true);
dDim = Mathf.Max(dDim / 2 + weapon.c_diceDim, 1);
        }
toHitFix += weapon.HIT;
    }
penetration += weapon.Penetration;
if (!weapon.source.attackType.IsEmpty())
{
attackType = weapon.source.attackType.ToEnum<AttackType>();
}
}
}
}
</syntaxhighlight>
</syntaxhighlight>
プレイヤーは格闘スキルを使用してキックまたはパンチを繰り出します。近接戦闘スタイルやキャラクターの特性に基づいて攻撃エフェクトは変わります。
キャラクターは格闘スキルを使用して格闘攻撃を繰り出します。通常はパンチないしキックですが、武器の近接戦闘スタイルやキャラクターの特性に基づいて攻撃エフェクトは変わります。
 
武器に'''理力武器'''のエンチャントが付いている場合、格闘スキルの代わりに'''魔道具'''スキルを、戦術スキルの代わりに'''詠唱'''スキルを使用します。
 
 
素手及び通常の格闘武器の場合:
 
ダメージの基礎ダイス数は「'''2 + 格闘 / 10'''」で、最大で6です。


ダメージは「格闘、筋力、器用、エンチャント値」によって決定されます。
ダメージの基礎ダイス面は「'''5 + √(格闘 / 3)'''」です。


ダメージのダイスは「2+(格闘/10)」、最大で「d6」です。
基礎ダメージ修正は「'''√(筋力 / 5 + 格闘 / 4) + 防具のダメージ修正合計 + キャラ固有のダメージ修正'''<ref name=":1">エーテル病の殺戮への飢えが該当する。</ref>」です。


ダイスのダメージ値は「5+(格闘/3)」です。
ダメージ倍率は「'''0.6 + ((筋力 / 2 + 格闘 / 2 + 戦術 / 2) / 50.0)'''」です'''。'''


ダメージ倍率は『'''0.6 + ((筋力 / 2 + 格闘 / 2 + 戦術 / 2) / 50.0)』です。'''
貫通率は「'''格闘 / 10 + 5'''」で、最低5%、最高で20%です。<ref name=":2">固有の貫通率を持っているキャラクターであればその値も加算される。</ref>


プレイヤーが武器の知識フィートを持っている場合、追加ダメージが『0.05×(''武器の知識フィートのランク)』の割合で与えられます。''(事実上、+0.05または+0.10)
基礎命中力は「'''(器用 / 3 + 筋力 / 3 + 格闘)'''」を、スタート50、ステップ25、レート75%のCURVE関数で計算した後、50を足したものです。


命中率は「(筋力/3 + 器用/3 + 格闘)+50)」で、最低値は「25+50」、最高値は「75+50」です。プレイヤーが「盾」を装備している場合、-25%の下方修正があります。


貫通率は「(格闘/10)+5」で計算され、最低5%、最高「20% + 貫通率」です。
理力武器のエンチャントが付いた格闘武器の場合:


格闘技武器を装備している場合:
ダメージの基礎ダイス数は「'''2 + 魔道具 / 10'''」で、最大で6です。


ダメージボーナスは素手のダメージボーナス + '''武器のダメージボーナス'''
ダメージの基礎ダイス面は「'''5 + √(魔道具 / 3)'''」です。


ダイス数は、素手のダイス数 + '''武器のダイス数'''
基礎ダメージ修正は「'''√(魔力 / 5 + 魔道具 / 4) + 防具のダメージ修正合計 + キャラ固有のダメージ修正<ref name=":1" />'''」です。


ダイス面は、素手のダイス面 / 2 + '''武器のダイス面'''
ダメージ倍率は「'''0.6 + ((魔力 / 2 + 魔道具 / 2 + 詠唱 / 2) / 50.0)'''」です''''''


命中ボーナスは素手の命中命中ボーナス + '''武器の命中ボーナス'''
基礎貫通率は「'''魔道具 / 10 + 5'''」で、最低5%、最高で20%です。<ref name=":2" />
 
基礎命中力は「'''器用''' '''/ 3 + 魔力 / 3 + 魔道具'''」を、スタート50、ステップ25、レート75%のCURVE関数で計算した後、'''50'''を足したものです。
 
 
プレイヤーが武器の知識フィートを持っている場合、ダメージ倍率に『0.05×(''武器の知識フィートのランク)』だけ加算されます。''<small>(事実上、+0.05または+0.10)</small>
 
プレイヤーが盾を装備している場合、基礎命中力は0.75倍に修正されます。
 
上記の後、基礎命中力に防具の命中修正が加算されます。
 
 
さらに、格闘武器を装備している場合は以下の修正を受けます。
 
最終的なダイス数は「'''基礎ダイス数 + 武器の基礎ダイス数'''」です。
 
最終的なダイス面は「'''基礎ダイス面 / 2 + 武器の基礎ダイス数'''」です。
 
最終的なダメージ修正は「'''基礎ダメージ修正 + 武器のダメージ修正'''」です。
 
最終的な命中力は「'''基礎命中力 + 武器の命中修正'''」です。
 
最終的な貫通率は「'''基礎貫通率 + 武器の貫通率'''」です。


貫通率は素手の貫通率 + '''武器の貫通率'''
==投擲==
==投擲==
<syntaxhighlight lang="c#" line="1">
<syntaxhighlight lang="c#" line="1">
if (this.isThrow)
if (isThrow)
{
{
    bool flag = this.weapon.HasTag(CTAG.throwWeapon) || this.weapon.HasTag(CTAG.throwWeaponEnemy);
bool flag = weapon.HasTag(CTAG.throwWeapon) || weapon.HasTag(CTAG.throwWeaponEnemy);
    int num2 = (int)Mathf.Clamp(Mathf.Sqrt((float)(this.weapon.SelfWeight + this.weapon.ChildrenWeight)) * 3f + 25f + (float)(flag ? 75 : 0), 10f, 400f + Mathf.Sqrt((float)this.CC.STR) * 50f);
int num2 = (int)Mathf.Clamp(Mathf.Sqrt(weapon.SelfWeight + weapon.ChildrenWeight) * 3f + 25f + (float)(flag ? 75 : 0), 10f, 400f + Mathf.Sqrt(CC.STR) * 50f);
    int num3 = Mathf.Clamp(this.weapon.material.hardness, flag ? 40 : 20, 200);
int num3 = Mathf.Clamp(weapon.material.hardness, flag ? 40 : 20, 200);
    this.weaponSkill = this.CC.elements.GetOrCreateElement(108);
weaponSkill = CC.elements.GetOrCreateElement(108);
    this.attackType = AttackType.Blunt;
attackType = AttackType.Blunt;
    this.dBonus = (this.CC.IsPCParty ? 3 : 7);
dBonus = CC.DMG + (CC.IsPCParty ? 3 : 7);
    this.dNum = 2;
dNum = 2;
    this.dDim = ((this.CC.IsPCParty ? 0 : this.CC.LV) + this.CC.STR + this.CC.Evalue(108)) * num2 * num3 / 10000 / 2;
dDim = (((!CC.IsPCParty) ? CC.LV : 0) + CC.STR + CC.Evalue(108)) * num2 * num3 / 10000 / 2;
    this.dMulti = 1f;
dMulti = 1f;
    this.toHitBase = EClass.curve(this.CC.DEX / 4 + this.CC.STR / 2 + this.weaponSkill.Value, 50, 25, 75) + (this.CC.IsPC ? 75 : 250);
toHitBase = EClass.curve(CC.DEX / 4 + CC.STR / 2 + weaponSkill.Value, 50, 25) + (CC.IsPCFaction ? 75 : 250);
    this.toHitFix = this.CC.HIT + this.weapon.HIT;
toHitFix = CC.HIT + weapon.HIT;
    this.penetration = 25;
penetration = 25;
}
}
</syntaxhighlight>プレイヤーの投げたアイテムは、投擲スキルの使用するかしないかにかかわらず、手元に戻ってきます。
</syntaxhighlight>プレイヤーの投げたアイテムは投擲武器であってもそうでなくても投擲スキルを参照します。


攻撃エフェクトは常に'''鈍器'''です。
攻撃エフェクトは常に鈍器です。


重量値は'''√アイテムの重量×3 + 武器を投げている場合: 75''' それ以外は'''0''''''10'''から'''400'''までの範囲で、'''√(筋力 x 50)'''を上限とします
重量値は 25 + '''投擲武器限定75<ref>投擲武器でないときは0</ref>''' + '''3 * √ [アイテムの重量]''' ですが、下限10、上限'''400 + 50 * √(筋力)'''があります。


武器の材質値は'''材質の硬度'''で、'''武器を投げている場合'''は'''40'''、それ以外は'''0'''から'''200'''までの範囲で下限が設定されます
ここでいうアイテムの重量はゲーム中の〇.〇sに1000をかけたものです。


ダイスの目は常に'''2'''です
武器の材質値は'''素材の硬度'''です。上限は200で、これはダークマターの硬度と等しく、下限は'''投擲武器を投げている場合'''で'''40'''、それ以外では'''20'''として設定されています。


ダイスの目は ('''プレイヤーキャラクターでない場合:キャラクターレベル''' + '''筋力''' + '''投擲''' ) x '''武器の重量値''' x '''武器の材質値 / 10000 / 2'''


正確さは、'''器用'''/4 + '''筋力'''/2 + '''投擲'''で、最低値は'''25+50'''、最高値は'''75+50 +''' ('''プレイヤーキャラクターの場合:75'''、それ以外:'''250''')
ダイスの数は常に'''「2」'''です。


命中ボーナスは、'''キャラクターの命中ボーナス''' + '''武器の命中ボーナス'''
ダイスの面は「'''('''(プレイヤーパーティー外のキャラのみLv) + '''筋力''' + '''投擲''' ) * '''重量値''' * '''武器の材質値 / 10000 / 2」'''です。


ダメージボーナスは、'''プレイヤーキャラクターの場合:3'''、それ以外:7
ダメージボーナスは「(プレイヤーパーティー内のキャラの場合''':3'''、それ以外の場合:7) '''+''' '''武器のダメージ修正 + 防具のダメージ修正合計 + キャラ固有のダメージ修正<ref name=":1" />'''」です。


ダメージ倍率は常に'''1'''
ダメージ倍率は常に「'''1'''」です。


貫通力は常に'''25'''です。
貫通力は常に'''25%'''です。


==近接&遠隔武器==
基礎命中力は「'''器用 / 4 +''' '''筋力 / 2 +''' '''投擲'''」を、スタート50、ステップ25、レート75%のCURVE関数で計算した後、プレイヤーキャラクターの場合''':75'''、それ以外の場合:'''250''' を足したもので、
 
最終的な命中力は「'''基礎命中力 +''' '''武器の命中修正 + 防具の命中修正合計」'''です。
 
==近接&遠隔武器 ==
<syntaxhighlight lang="c#" line="1">
<syntaxhighlight lang="c#" line="1">
else
else
{
{
    if (this.IsRanged)
if (IsRanged)
    {
{
        this.weaponSkill = this.CC.elements.GetOrCreateElement(this.toolRange.WeaponSkill);
weaponSkill = CC.elements.GetOrCreateElement(toolRange.WeaponSkill);
    }
}
    else
else
    {
{
        this.weaponSkill = this.CC.elements.GetOrCreateElement(this.weapon.category.skill);
weaponSkill = CC.elements.GetOrCreateElement(weapon.category.skill);
    }
}
    if (!this.weapon.source.attackType.IsEmpty())
if (!weapon.source.attackType.IsEmpty())
    {
{
        this.attackType = this.weapon.source.attackType.ToEnum(true);
attackType = weapon.source.attackType.ToEnum<AttackType>();
    }
}
    bool flag2 = this.IsCane || this.weapon.Evalue(482) > 0;
bool flag3 = IsCane || weapon.Evalue(482) > 0;
    if (flag2)
if (flag3)
    {
{
        this.weaponSkill = this.CC.elements.GetOrCreateElement(305);
weaponSkill = CC.elements.GetOrCreateElement(305);
    }
}
    this.dBonus = this.CC.DMG + this.CC.encLV + this.weapon.DMG;
dBonus = CC.DMG + CC.encLV + weapon.DMG;
    this.dNum = this.weapon.source.offense[0];
dNum = weapon.source.offense[0];
    this.dDim = this.weapon.c_diceDim;
dDim = weapon.c_diceDim;
    this.dMulti = 0.6f + (float)(this.weaponSkill.GetParent(this.CC).Value + this.weaponSkill.Value / 2 + this.CC.Evalue(flag2 ? 304 : (this.IsRanged ? 133 : 132))) / 50f;
dMulti = 0.6f + (float)(weaponSkill.GetParent(CC).Value + weaponSkill.Value / 2 + CC.Evalue(flag3 ? 304 : (IsRanged ? 133 : 132))) / 50f;
    this.dMulti += 0.05f * (float)this.CC.Evalue(this.IsRanged ? 1404 : 1400);
dMulti += 0.05f * (float)CC.Evalue(IsRanged ? 1404 : 1400);
    this.toHitBase = EClass.curve((this.IsCane ? this.CC.WIL : this.CC.DEX) / 4 + this.weaponSkill.GetParent(this.CC).Value / 3 + this.weaponSkill.Value, 50, 25, 75) + 50;
toHitBase = EClass.curve((IsCane ? CC.WIL : CC.DEX) / 4 + weaponSkill.GetParent(CC).Value / 3 + weaponSkill.Value, 50, 25) + 50;
    this.toHitFix = this.CC.HIT + this.weapon.HIT;
toHitFix = CC.HIT + weapon.HIT;
    this.penetration = this.weapon.Penetration + this.CC.Evalue(92);
penetration = weapon.Penetration + CC.Evalue(92);
    if (this.IsCane)
if (IsCane)
    {
{
        this.toHitBase += 50;
toHitBase += 50;
    }
}
}
}
if (this.ammo != null)
if (ammo != null && !(ammo.trait is TraitAmmoTalisman))
{
{
    this.dNumAmmo = ((this.ammo.source.offense.Length != 0) ? this.ammo.source.offense[0] : 0);
dNumAmmo = ((ammo.source.offense.Length != 0) ? ammo.source.offense[0] : 0);
    this.dDimAmmo = this.ammo.c_diceDim;
dDimAmmo = ammo.c_diceDim;
    this.dBonusAmmo = this.ammo.DMG;
dBonusAmmo = ammo.DMG + ammo.encLV;
    if (this.dNumAmmo < 1)
if (dNumAmmo < 1)
    {
{
        this.dNumAmmo = 1;
dNumAmmo = 1;
    }
}
    if (this.dDimAmmo < 1)
if (dDimAmmo < 1)
    {
{
        this.dDimAmmo = 1;
dDimAmmo = 1;
    }
}
    this.dBonus += this.ammo.DMG;
toHitFix += ammo.HIT;
    this.toHitFix += this.ammo.HIT;
}
}
else
else
{
{
    this.dNumAmmo = 0;
dNumAmmo = 0;
    this.dDimAmmo = 0;
dDimAmmo = 0;
}
}
</syntaxhighlight>プレイヤーは、戦術スキルを使用して近接武器を振るうか、または射撃スキルを使用して遠距離武器を撃ちます。
</syntaxhighlight>プレイヤーは、戦術スキルを使用して近接武器を振るうか、または射撃スキルを使用して遠距離武器を撃ちます。


武器が'''ワンド'''であるか、または'''理力武器'''のエンチャントが付いている場合、戦術スキルまたは射撃スキルの代わりに'''魔道具'''スキルを使用します
武器が'''ワンド'''、または'''理力武器'''のエンチャントが付いている場合、戦術スキルまたは射撃スキルの代わりに'''詠唱'''スキルを、武器スキル(長剣、短剣、斧など)の代わりに'''魔道具'''スキルを使用します。
 


ダメージボーナスは、'''プレイヤーのダメージボーナス''' + '''武器の改造道具によるダメージボーナス''' + '''武器のダメージボーナス'''です
ダメージのダイス数及びダイス面は武器に表記されているものを使用します。


ダメージ倍率は0.6 + ('''武器に対応する主能力''' + '''武器スキル / 2''' + (近接武器は'''戦術'''、遠距離武器は'''射撃'''、ワンドまたは理力武器の場合'''魔道具''')) / 50
基礎ダメージ修正は「'''攻撃中の武器のダメージ修正 + 防具のダメージ修正合計 + キャラ固有のダメージ修正<ref name=":1" />'''」です。


プレイヤーが武器の知識/射撃の名手のフィートを持っている場合、追加ダメージが'''0.05 x (フィートランク)'''の割合で与えられます。''<sub>(事実上、+0.05または+0.10)</sub>''
ダメージ倍率は「'''0.6 + (武器スキルに対応する主能力 + 武器スキル / 2 + ('''近接武器は'''戦術'''、遠距離武器は'''射撃'''、ワンドまたは理力武器の場合'''魔道具)) / 50.0)'''」です'''。'''


命中率は('''器用'''、ワンドや理力武器なら'''意志''') / 4 + '''武器スキル''' / 3 + (近接武器は'''戦術'''、遠距離武器は'''射撃'''、ワンドまたは理力武器の場合'''魔道具''') で、最小値は'''25+50'''、最大値は'''75+50'''です。
プレイヤーが武器の知識フィートを持っている場合、ダメージ倍率に『0.05 * (''武器の知識フィートのランク'')''』だけ加算されます。''<small>(事実上、+0.05または+0.10)</small>


'''ワンド'''の命中率には、さらに+50が加わります


命中ボーナスは、'''キャラクターの命中ボーナス''' + '''武器の命中ボーナス''' + '''弾薬の命中ボーナス'''(弾薬を装填している場合)
貫通率は武器に表記されているものを使用します。<ref name=":2" />


ダメージボーナスは、'''キャラクターのダメージボーナス''' + '''武器のダメージボーナス''' + '''弾薬のダメージボーナス'''(弾薬を装填している場合)
基礎命中力は「'''(器用'''、ワンドなら'''意志) / 4 + 武器スキルに対応する主能力 / 3 + 武器スキル''' 」を、スタート50、ステップ25、レート75%のCURVE関数で計算した後、'''50'''を足したものです。


貫通力は、'''キャラクターの貫通率''' + '''武器の貫通率'''
命中力は「'''基礎命中力 +''' '''攻撃中の武器の命中修正 + 防具の命中修正合計 +''' (ワンドのみ:'''50'''、それ以外は'''0''')」です。


==魔法:魔法のパワー==
 
<syntaxhighlight lang="c#">
 
public override int GetPower(Card c)
さらに、弾薬を消費して攻撃した場合:
 
ダメージ修正に「'''弾薬のダメージダイスを振った結果 + 弾薬のダメージ修正'''」を加算します。
 
命中力に「'''弾薬の命中修正'''」を加算します。
 
==遠隔武器の命中率&ダメージと距離==
<syntaxhighlight lang="c#" line="1">
distMod = 100;
if (!isThrow)
{
{
    int num = base.Value * 8 + 50;
if (!IsRanged)
    if (!c.IsPC)
{
    {
attackStyle = CC.body.GetAttackStyle();
        num = Mathf.Max(num, c.LV * 6 + 30);
}
    }
else if (TP != null)
    num = EClass.curve(num, 400, 100, 75);
{
    if (this is Spell)
int num = CC.pos.Distance(TP);
    {
distMod = Mathf.Max(115 - 10 * Mathf.Abs(num - toolRange.BestDist) * 100 / (100 + weapon.Evalue(605) * 10), 80);
        num = num * (100 + c.Evalue(411)) / 100;
}
    }
    return num;
}
}
</syntaxhighlight><syntaxhighlight lang="c#">
public static int curve(int a, int start, int step, int rate = 75)
dMulti = dMulti * (float)distMod / 100f;
{
toHit = toHitBase + toHitFix;
    if (a <= start)
toHit = toHit * distMod / 100;
</syntaxhighlight>
 
遠隔武器には、適正の攻撃距離があり、それによって命中力とダメージ倍率が増減します。
 
Evalue(605)はmod_precisionであり、遠隔武器の改造道具の精密射撃レベルにあたります。
 
適正攻撃距離から離れているほど、ペナルティも増えます。
 
精密射撃の改造道具のない場合、0(適正攻撃距離)の時は命中力、ダメージ共に115%になります、±1は105%、±2は95%、±3は85%、それ以降は80%になります。
 
 
精密射撃modの強度と適正距離差による命中力とダメージの倍率(%)は以下の表のようになっています。
{| class="wikitable"
!精密射撃mod強度
!適正距離差0
!適正距離差1
!適正距離差2
!適正距離差3
!適正距離差4
|-
|0
|115
|105
|95
|85
|80
|-
|10
|115
|110
|105
|100
|95
|-
|20
|115
|112
|109
|105
|102
|-
|30
|115
|113
|110
|108
|105
|-
|40
|115
|113
|111
|109
|107
|-
|50
|115
|114
|112
|110
|109
|-
|60
|115
|114
|113
|111
|110
|-
|70
|115
|114
|113
|112
|110
|-
|80
|115
|114
|113
|112
|111
|-
|90
|115
|114
|113
|112
|111
|-
|99
|115
|115
|114
|113
|112
|}
 
==魔法:魔法のパワー==
EA 23.79 Nightly Patch 1
 
これはAbility.csの44行目です
 
ここに、魔法のパワーを決定するためにどの式を使用するかを記述したコードが書かれています
 
<syntaxhighlight lang="「c#」" line="「1」">
public override int GetPower(Card c)
     {
     {
         return a;
         int a = base.Value * 8 + 50;
    }
        if (!c.IsPC)
    for (int i = 0; i < 10; i++)
        {
    {
            a = Mathf.Max(a, c.LV * 6 + 30);
         int num = start + i * step;
            if (c.IsPCFactionOrMinion && !base.source.aliasParent.IsEmpty())
         if (a <= num)
            {
                a = Mathf.Max(a, c.Evalue(base.source.aliasParent) * 4 + 30);
            }
        }
         a = EClass.curve(a, 400, 100);
         if (this is Spell)
         {
         {
             return a;
             a = a * Mathf.Max(100 + c.Evalue(411) - c.Evalue(93), 1) / 100;
         }
         }
         a = num + (a - num) * rate / 100;
         return a;
     }
     }
    return a;
</syntaxhighlight>ここではカーブ関数を使用します:<syntaxhighlight lang="「c#」" line="「1」">
public static int curve(int a, int start, int step, int rate = 75)
{
if (a <= start)
{
return a;
}
}
</syntaxhighlight>プレイヤーキャラクターの場合、魔法のパワーはcurve( ('''魔法レベル''' x 8 + 50), 400, 100, 75 ) x (100 + '''魔法強化エンチャント''') / 100 です
for (int i = 0; i < 10; i++)
{
int num = start + i * step;
if (a <= num)
{
return a;
}
a = num + (a - num) * rate / 100;
}
return a;
} }.
</syntaxhighlight>プレイヤーの魔法のパワーはcurve[ ('''魔法レベル''' x 8 + 50), 400, 100, 75 ] x (100 + '''魔法強化エンチャント''' - '''反魔法エンチャント''') / 100 です


プレイヤーキャラクター以外の場合、魔法のパワーは'''魔法レベル''' x 8 + 50 または '''キャラレベル''' x 6 + 30 のうち大きい方です
ペットや味方ミニオンの場合、魔法のパワーは('''魔法レベル''' x 8 + 50)の部分が、[キャラレベル * 6 + 30] か [関連主能力 * 4 + 30] のうち大きい方で置き換えられます。


'''曲線関数<code>curve(a, start, step, rate)</code>について:'''
敵などの場合、魔法のパワーは('''魔法レベル''' x 8 + 50)の部分が、[キャラレベル * 6 + 30]で置き換えられます。


<code>i = 0</code> とします。 <code>num = start + i * step</code> を計算します。 <code>a</code> が <code>num</code> を超える場合、超過分は <code>rate / 100</code> を掛ける必要があります。 その後、<code>i</code> を1 増やします。 上記の手順を10回繰り返します


簡単に言えば、この関数は数値を圧縮するために使用されます。関数の曲線の傾きは、<code>(rate / 100)^10</code>まで徐々に減少します。
'''curve 関数について: ''' '''<code>curve(a, start, step, rate)</code>'''
 
簡単に言うと、この関数は数値の伸びを抑えるために使われます。
 
<code>i = 0</code> をセットします。計算 <code>num = start + i * step</code>. <code>a</code> が <code>num</code> を超えたら、超えた部分に <code>rate / 100</code> を掛けます。その後、<code>i</code> を 1 ずつ増やします。上記のステップを 10 回繰り返します。
 
関数の曲線の傾きは徐々に小さくなり、最終的には<code>(rate / 100)^10</code> となります。


==魔法:攻撃魔法==
==魔法:攻撃魔法==
ダイス数、ダイス面、ダメージボーナスは切り捨て。
[[File:Damage of different types of spells as of EA23.71.png|thumb|upright=5.0|標準偏差を含むEA23.71時点での各種魔法のダメージ。パラメータは魔力=100固定、x軸は魔法レベル、y軸は平均ダメージ]]
{| class="wikitable"
{| class="wikitable"
!魔法
!魔法
Line 303: Line 710:
|5+魔法のパワー/80
|5+魔法のパワー/80
|
|
|ターンに1回ダメージを与える
| ターンに1回ダメージを与える
|-
|-
|ブレス
|ブレス
Line 317: Line 724:
|火炎属性固定
|火炎属性固定


ダメージ 発動者から10タイルの半径のボール内のすべてのターゲットにダメージを与えます。 壁でブロックされることがあります。 また、発動者にもダメージを与えます。
ダメージ 発動者から10マスの半径のボール内のすべてのターゲットにダメージを与えます。 壁でブロックされることがあります。 また、発動者にもダメージを与えます。
|-
|-
|地震
|地震
|5+魔法のパワー/30
|1+魔法のパワー/30
|10+対応主能力/3
|2+対応主能力/3
|
|
|衝撃属性固定
|衝撃属性固定
発動者から12タイルの半径のボール内のすべてのターゲットにダメージを与えます。 重力デバフを持つ敵には、最大ダイスダメージの2倍のダメージを与えます。 浮遊効果を持つ敵には、ダメージの半分を与えます。
発動者から12マスの半径のボール内のすべてのターゲットにダメージを与えます。 重力デバフを持つ敵には、最大ダイスダメージの2倍のダメージを与えます。 浮遊効果を持つ敵には、ダメージの半分を与えます。
|-
|-
|破呪
|破呪
Line 390: Line 797:
|
|
|
|
|}
==魔法:バフ魔法==
{| class="wikitable"
!魔法
!パワー
!持続時間
!備考
|-
|(属性)の唄
|(魅力/40 + 1)*5
|魔法のパワー/25 + 8
|ここでいう「パワー」は、獲得できる属性耐性のこと
|-
|テレパシー
|固定
|魔法のパワー/5 + 15
|
|-
|透明化
|魔法のパワー/30 + 5
|魔法のパワー/12 + 6
|
|-
|透明可視
|魔法のパワー/40 + 6
|魔法のパワー/6 + 12
|
|-
|インコグニート
|固定
|魔法のパワー/2 + 20
|
|-
|猫の目
|魔法のパワー/30 + 5
|魔法のパワー*3
|
|-
|ホーリーヴェイル
|固定
|魔法のパワー/6 + 5
|
|-
|元素保護
|魔法のパワー/200 + 5
|魔法のパワー/15 + 8
|ここでいう「パワー」は、獲得できる元素耐性のこと
|-
|英雄
|筋力: 魔法のパワー/30 + 5
器用: 魔法のパワー/30 + 5
|魔法のパワー/4 + 10
|
|-
|浮遊
|固定
|魔法のパワー/5 + 10
|
|-
|聖なる盾
| 魔法のパワー/15 + 15
|魔法のパワー/3 + 10
|
|-
|知者
|魔力: 魔法のパワー/40 + 6
学習: 魔法のパワー/40 + 6
読書: 魔法のパワー/40 + 3
|魔法のパワー/4 + 10
|
|-
|ホウキ変容
|固定
|魔法のパワー + 30
|
|}
==魔法:デバフ魔法==
{| class="wikitable"
!魔法
!パワー
!持続時間
!備考
|-
|瘴気
|固定
|魔法のパワー/100 + 5
|
|-
|グラビティ
|固定
|魔法のパワー/20 + 10
|
|-
|沈黙
|固定
|魔法のパワー/80 + 5
|
|-
|脆弱
|固定
| 魔法のパワー/50 + 10
|
|-
|災い
|魔法のパワー/30 + 50
|魔法のパワー/50 + 10
| ここでいう「パワー」は、運の低下量のこと
|-
|破門
|固定
|魔法のパワー/50 + 20
|
|-
|元素の傷跡
|魔法のパワー/100 + 5
|魔法のパワー/40 + 8
|ここでいう「パワー」は、元素耐性の低下量のこと
|}
|}


Line 415: Line 942:
{| class="wikitable"
{| class="wikitable"
!魔法
!魔法
!持続時間
!持続時間  
!レベル
! レベル
!備考
!備考
|-
|-
|具象
|具象
|20 + rnd (20) + 魔法のパワー / 20
|20 + rnd (10) + 魔法のパワー / 20
|魔法のパワー / 15
|魔法のパワー / 15
|
|
|-
|-
|動物召喚
|動物召喚  
|死ぬまで
|死ぬまで
|魔法レベル * (100 + 魔法のパワー / 10) / 100 + 魔法のパワー / 30
|魔法レベル * (100 + 魔法のパワー / 10) / 100 + 魔法のパワー / 30
Line 430: Line 957:
|-
|-
|アンデッド妹召喚
|アンデッド妹召喚
|死ぬまで
|死ぬまで  
|魔法レベル* (100 + 魔法のパワー / 10) / 100 + 魔法のパワー / 30
|魔法レベル* (100 + 魔法のパワー / 10) / 100 + 魔法のパワー / 30
|
|
|-
|-
|影召喚
|影召喚  
|死ぬまで
|死ぬまで
|魔法のパワー / 10 + 1
|魔法のパワー / 10 + 1
|自爆攻撃を行う
|自爆攻撃を行う
|}
|}




{{DEFAULTSORT:カイセキ,ダメージケイサンシキ}}
{{DEFAULTSORT:カイセキ,ダメージケイサンシキ}}
[[Category:JA]]
[[Category:JA]]
[[Category:Elin Spoiler]]
 
<references />
250

edits