晕眩测试

晕眩公式

  • ro小站给出的公式

  • 上述公式没有写到晕眩抗性如何作用到成功率的计算里面,我们推测晕眩抗性的作用,整理出以下公式。

测试

为了验证上面的公式,我们做以下测试

  • 测试中的装备与素质点


  • 测试技能: 惊声尖叫Lv5 (眩晕基础机率 50%)


  • 结果

惊声尖叫次数 眩晕次数 眩晕机率
103 10 9.70%
  • 验证

我们带入公式计算出推测的理论眩晕机率

由于样本量较少,实验所得的 9.70% 与理论计算的 7.26% 之间的差距可看作合理的误差

查询源码

我们来读一下从GM拿到的源代码

惊声尖叫的技能描述

  - Id: 326
    Name: DC_SCREAM
    Description: Dazzler
    MaxLevel: 5
    Type: Misc
    TargetType: Self
    DamageFlags:
      NoDamage: true
      Splash: true
    Hit: Single
    HitCount: 1
    SplashArea: -1
    AfterCastActDelay: 4000
    Duration2: 5000
    Requires:
      SpCost:
        - Level: 1
          Amount: 12
        - Level: 2
          Amount: 14
        - Level: 3
          Amount: 16
        - Level: 4
          Amount: 18
        - Level: 5
          Amount: 20
  • 可看出惊声尖叫的英文名为Dazzler,代码中的变量名为DC_SCREAM

惊声尖叫的眩晕基础概率

case DC_SCREAM:
    sc_start(src,bl,SC_STUN,(25+5*skill_lv),skill_lv,skill_get_time2(skill_id,skill_lv));
    break;
  • 可看出基础概率的计算为 (25+5*技能等级)%

眩晕状态的机率计算

/// Resistance rate: 10000 = 100%
/// Example:    50% (5000) -> sc_def = 5000 -> 25%;
///             5000ms -> tick_def = 5000 -> 2500ms
int sc_def = 0, tick_def = -1; // -1 = use sc_def
/// Fixed resistance value (after rate calculation)
/// Example:    25% (2500) -> sc_def2 = 2000 -> 5%;
///             2500ms -> tick_def2=2000 -> 500ms
int sc_def2 = 0, tick_def2 = 0;

......
......

case SC_STUN:
    sc_def = status->vit*100;
    sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
    tick_def2 = status->luk*10;
    break;
  • 结合注释理解,状态的抗性有两种,一种为乘算抗性,一种为加算抗性。以上面的眩晕为例子,vit作用于乘算抗性,luk等作用于加算抗性。
  • 状态持续时间的抗性也同样的分为乘算与加算的两种
  • 状态持续时间的抗性没有给出时,将用状态抗性代替(就是说vit以乘算的方式减少眩晕时间)

最终眩晕的机率计算

if (!(flag&SCSTART_NORATEDEF)) {
    rate -= rate*sc_def/10000;
    rate -= sc_def2;

    // Minimum chances
    switch (type) {
        case SC_BITE:
            rate = max(rate, 5000); // Minimum of 50%
            break;
    }

    // Item resistance (only applies to rate%)
    if (sd) {
        for (const auto &it : sd->reseff) {
            if (it.id == type)
                rate -= rate * it.val / 10000;
        }
        if (sd->sc.data[SC_COMMONSC_RESIST] && SC_COMMON_MIN <= type && type <= SC_COMMON_MAX)
            rate -= rate*sd->sc.data[SC_COMMONSC_RESIST]->val1/100;
    }

    // Aegis accuracy
    if(rate > 0 && rate%10 != 0) rate += (10 - rate%10);
}
  • 先由基础机率,状态的乘算抗性,状态的加算抗性计算得出中状态的机率
  • 卡片,装备等所带来的状态抗性(Item resistance)最后计算

总结

  • 源码的查询结果与实验结果均与推测公式相符

你可能感兴趣的:(晕眩测试)