This post is also available in: English (英語)

ソロ特化ダンジョンクロール専用TRPG『Ker Nethalas』で、

「ビルドの参考にするのに命中率の一覧が欲しい」

と思ったので、Pythonでシミュレーションしてみた。

シミュレーションの条件

  • 攻撃側、防御側のWeaponSkill,又はCombatの値をもとに、100万回ずつシミュレーションをした。
  • 攻撃側の+10ボーナスは算入済みとした。
  • 表は攻撃側をA、防御側をDとし、それぞれのスキルの値を表している。

シミュレーション結果

単位は全てパーセント。小数点第二位以下切り捨て。

  A30 A40 A50 A60 A70 A80 A90 A100
 D10 29.6 39.5 49.5 59.5 69.579.5 89.5 99.5
 D2028.038.148.157.968.078.1 88.1 98.1
 D3025.335.6445.655.6 65.775.6 85.5 95.6
 D4022.231.842.152.1 62.272.1 82.1 92.1
 D5019.3527.837.247.7 57.767.777.8 87.7
 D6016.323.732.3 41.7 52.262.472.2 82.2
 D7013.319.827.2 35.6 45.155.865.775.8
 D8010.315.722.129.3 38.147.558.368.4
 D907.311.717.223.731.139.549.059.9
 D1004.37.812.217.724.131.540.149.5

シミュレーションから言えること

対抗判定よりも先に個々の成功判定が入るので、特に攻撃側のスキルが低い時は命中率が顕著に下がることに注意。

初期状態での命中率目安

初期作成の武器スキル60+攻撃時ボーナスでは、おおむね50~60%の確率で当たる。Simple特性を持つ武器やWeapon MasterのPassiveスキルでスキルを上昇させると、おおむねスキル10につき命中率が10%加算される。

強い相手を前にした時ほど、スキルを盛る効果が大きい

「スキル上昇は命中率を乗算するのではなく加算するのに近い」という性質上、Combatが高い相手(=PCの命中率が低くなる相手)ほど、相対的に命中率を盛る効果は大きくなる。

Combat40の相手に対し、武器スキルを70から90に上げると1.31倍の命中率アップとなる。

Combat70の相手に対し、武器スキルを70から90に上げるならば、1.456倍の命中率アップとなる。

初期状態の回避率目安

初期状態のDodge10でも、レベル1なら半分近くの攻撃は避けられる。Dodge40まで上げることによる恩恵は、少なくとも被ダメージ軽減の観点からは大きくない。(Dodgeは逃走成功率や罠回避率に大きくかかわるので、どちらかと言えばそちらの恩恵が大きいと思われる)

パリィ武器装備は全身にArmor装備と同程度のダメージ軽減期待値

1D6の攻撃をArmor1で防ぐことによる軽減率期待値は

[(0/6+1/6+2/6+3/6+4/6+5/6)/6]/[(1/6+2/6+3/6+4/6+5/6+6/6)/6]=0.7142[(0/6 + 1/6 + 2/6 + 3/6 + 4/6 + 5/6)/6] / [(1/6 + 2/6 + 3/6 + 4/6 + 5/6 + 6/6)/6] = 0.7142

なので、攻撃スキル60の敵が放つ攻撃を回避やパリィによって同程度無力化するには、Dodge10からDodge60まで上げることが必要になる。これはDodgeでは困難なものの、パリィ武器を用いれば初期作成キャラでも達成可能な数値である。

パリィ武器を持ち、Weapon Master + Tracherのビルドで、レベル2でHunter’s Markを取得した場合、Combat70の相手の攻撃ですら、6割以上は回避できる。この軽減率をArmorで換算すると、

[(0/6+0/6+1/6+2/6+3/6+4/6)/6]/[(1/6+2/6+3/6+4/6+5/6+6/6)/6]=0.428[(0/6 + 0/6 + 1/6 + 2/6 + 3/6 + 4/6)/6] / [(1/6 + 2/6 + 3/6 + 4/6 + 5/6 + 6/6)/6] = 0.428

により、全身をArmor2の防具で固めるのと同程度であるといえる。

命中率確保の困難さ

命中率80%以上を確保するには、相手のCombatが低かろうとも、武器スキルが補正込みで90必要

また、補正込みの武器スキル100になっても、Overseerの影響でCombatの値が80となった敵に対しては、命中率が7割を切る

シミュレーションに使ったコード(Python)

#Attackは、攻撃側の+10ボーナス適用済みの値とする!

#振りなおしは攻撃失敗とみなしているので、攻撃側がDefenseと同値だと命中率が50%を切る

#防御側のクリティカル成功の影響により、防御が上がると露骨に命中下がる!

Attack = 70

Defense =100

Double = [11,22,33,44,55,66,77,88,99,100]

HitCount =0

for i in range(1,1000000):

    AttackCritical = False

    DefenseCritical = False

    AttackFumble = False

    DefenseFumble = False

    AttackSuccess = False

    DefenseSuccess = False

    AttackWin =False

    DefenseWin =False

    Attackroll = random.randint(1,100)

    if Attack  >= Attackroll:

        AttackSuccess = True

        if AttackSuccess == True and Attackroll in Double:

            AttackCritical =True

        if AttackSuccess == False and Attackroll in Double:

            AttackFumble = True

    Defenseroll = random.randint(1,100)

    if Defense >= Defenseroll:

        DefenseSuccess =True

        if DefenseSuccess == True and Defenseroll in Double:

            DefenseCritical =True

        if DefenseSuccess == False and Defenseroll in Double:

           DefenseFumble = True

    if AttackSuccess == True and DefenseSuccess == False:

        AttackWin = True

    if AttackSuccess == False and DefenseSuccess == True:

        DefenseWin = True

    if AttackCritical ==True and DefenseCritical == False:

       AttackWin = True

       DefenseWin = False

    if DefenseCritical == True and AttackCritical == False:

        AttackWin = False

        DefenseWin = True

    if AttackSuccess == True and DefenseSuccess == True:

        if Attackroll > Defenseroll:

            AttackWin = True

            DefenseWin = False

        elif Defenseroll > Attackroll:

            AttackWin = False

            Defensewin = True

        elif Attackroll == Defenseroll:

            if Attack > Defense:

                AttackWin = True

                DefenseWin = False

            elif Defense > Attack:

                AttackWin = False

                DefenseWin = True

    if DefenseFumble ==True and AttackFumble == False:

        AttackWin = True

        DefenseWin = False

    if AttackFumble == True and DefenseFumble == False:

        AttackWin = False

        DefenseWin = True

    if AttackWin == True:

        HitCount +=1

HitRate =100 *  HitCount /1000000

print(HitRate)

終わりに

ああ……シミュレーションはいい!!

心が洗われるようだ。

つまり、風呂キャンしてもシミュレーションすれば実質入浴と同じ効果が得られるということですね。

知らんけど。

ということで、よきゲーマーライフを!!

最後までお読みいただき、ありがとうございました!

Xでは、記事更新の告知や、プレイ中の感想、ゲームを作ってみている様子等を叫び散らかしています。

ブログ記事の1.3倍くらいうるさいです(当社比)