生活情怀-神话暗黑-暗黑破坏神2

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1869|回复: 1
收起左侧

[游戏攻略] FZ属性页显示的被怪物击中几率的计算过程

[复制链接]
  • TA的每日心情
    开心
    前天 00:08
  • 签到天数: 6 天

    [LV.2]石门叩响

    912

    主题

    20万

    元宝

    2370 小时

    在线时间

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    200878
    发表于 2020-1-13 21:44:18 | 显示全部楼层 |阅读模式
    本文由virgol在2008年首发于TTBN。
    属性页显示的被怪物击中几率的计算过程

    以下所涉及的内容只针对 "怪物攻击你“时 属性页所显示的被怪物击中几率Tohit%,实际攻击调用的是另外的代码(大体相同,但细节上更复杂)

    Tohit%计算过程资料片和非资料片调用的是同一函数(代码位置D2Client.6FB38A00),而且不是一般的相同

    以下是这个函数的主要流程:

    1 取人物属性页显示的防御值 DEF1,
    取 ARMORCLASS_VS_HTH 值(一般为0)
    最终用于计算的防御值 DEF = DEF1 + ARMORCLASS_VS_HTH ;

    2 获取怪物AR值,此值先记为 AR_BASE
    (一个复杂的过程,最终取得的值为各种资料网站上能找到的怪物AR值)

    3 将 AR_BASE 转换到用于计算的 AR

    判断monstats.txt中某一列的值是否等于1 ,这个列我估计是noRatio,不确定,但比较符合这个
    等于1 的情况下 AR = AR_BASE ,跳到第4步
    判断是否是资料片,资料片AR = AR_BASE ,跳到第4步
    判断是否在普通难度,普通难度AR = AR_BASE ,跳到第4步
    不满足上述条件,继续处理
    先给出代码的处理方式
    AR_BASE×5 ,逻辑左移1位 ,得到值 AR_TMP
    让AR_TMP与0x88888889相乘, 取结果的高32位与AR_TMP相加,将结果算术右移3位,得到结果 AR_TMP2
    接着还有一步 将AR_TMP2与 AR_TMP2算术右移15位相加 取得最终用于计算的 AR , 因为此步基本对结果没有影响,我们将其忽略

    转化为近似的公式:
    AR = (10*AR_BASE+10*AR_BASE*(-2004318071)/(2^32))/8 ~= AR_BASE×0.667
    实际计算过程中除法取整
    4 接着就是大家熟悉的Tohit%计算公式,但是原来的取整方式是错的
    Tohit% = [ ([ AR*100/(AR+DEF) ] * MLVL *2)/(DLVL+MLVL) ]
    其中 DLVL 就是自身的等级
    MLVL 是怪物等级

    这里MLVL很关键,他是从mpq的monstats.txt中直接获取的!!资料片和非资料片一视同仁
    也就是,对于资料片来说,计算Tohit%是忽略场景等级影响的,也忽略金怪带来的奖励等级
    对于非资料片,一个72lv的大虫,计算Tohit%是按88lv来算的~~
    同样,第2步取 AR_BASE 的时候也是按monstats.txt中的等级来计算的

    5 计算函数上面已经结束,调用后会再将结果限定到 [5 ,95]区间内

    神话战网出品,必出精品!

    嫌怪物和地图素材太小???赶紧找我定制吧!!!
    QQ:281886256
    回复

    使用道具 举报

  • TA的每日心情
    开心
    前天 00:08
  • 签到天数: 6 天

    [LV.2]石门叩响

    912

    主题

    20万

    元宝

    2370 小时

    在线时间

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    200878
     楼主| 发表于 2020-1-13 21:44:26 | 显示全部楼层
    楼上帖子中分析了属性页显示的被命中几率的计算过程
    因为属性页显示的值查看时可以忽略实际怪物的生存状态,所以肯定是不准确的

    本帖将分析 "怪物攻击你" 时实际命中率的计算过程 与 属性页显示的被命中几率的计算过程(暂称为"过程A")的不同
    其他情况可以参考(til的某帖子,但已失效),那个帖子大体内容还是正确的

    1 在计算命中率前,会调用D2Game.6FCB4740计算 MinDamage ,MaxDamage , AR_BASE
    计算AR_BASE时,将使用怪物的真实等级(不含场景等级修正,不含金怪等级奖励),
    一般来说 AR_BASE = (monlvl.txt中的TH × monstats.txt中的XXTH )/100 , 结果取整
    其中XXTH 可能为 A1TH , A2TH , S1TH ,根据使用的攻击来定(过程A中使用的都是A1TH)

    然后会跟过程A中一样根据条件进行调整,但条件顺序有点不一样,不过结果是一样的
    判断是否是资料片,资料片 AR = AR_BASE ,跳到第2步
    判断是否在普通难度,普通难度 AR = AR_BASE ,跳到第2步
    判断monstats.txt中noRatio是否为1 ,为1的情况下 AR = AR_BASE ,跳到第2步
    上面条件都不满足 AR = (10*AR_BASE+10*AR_BASE*(-2004318071)/(2^32))/8 ~= AR_BASE×0.667
    顺带提下MinDamage和MaxDamage,它们的修正因子为 ((10*715827883)/4294967296)/2 ~=0.833

    2 计算额外的附加AR -> AR_EXT ,如技能带的AR等,将作为参数传给第3步

    3 此步将开始计算命中率 (D2Game.6FC9D240)
    3.1 计算 DEF
    DEF = DEF1 + ARMORCLASS_VS_HTH 或者DEF = DEF1 + ARMORCLASS_VS_MISSILE (根据攻击来定)
    3.2 直接获的第一步计算好的AR
    AR = AR + AR_EXT + 5*Dex(敏捷值) ;
    获取AR加成 AR_Percent(含所有加成情况,如光环等)
    AR = AR + AR *(AR_Percent%) ;此AR将用于最终计算
    3.3 又来到了这个公式 Tohit% = [ ([ AR*100/(AR+DEF) ] * MLVL *2)/(DLVL+MLVL) ]
    但不同的是,这里的MLVL将使用实际的等级(不含场景等级修正,不含金怪等级奖励)

    3.4 将结果限定在 [5 , 95 ]区间内

    从上面过程可以看出,在非资料片里,实际怪物对你的命中率,将低于属性页显示的值
    以地狱大虫为例子,MPQ等级88 , 非资料片等级72 ,测试人物85级165防御
    属性页显示为94%命中 = [ [2584*100/(2584+165)]*88*2 /(88+85) ] (2584 为 88级的ACTH*A1TH/100 *0.667 = 3874*110/100 *0.667)

    实际只有[ [2138*100/(2138+165)]*72*2 /(72+85) ] = 84% (2138 为 72级的ACTH*A1TH/100 *0.667 = 2914 *110 /100 *0.667) (计算中有误差, 跟踪代码显示是86%)
    神话战网出品,必出精品!

    嫌怪物和地图素材太小???赶紧找我定制吧!!!
    QQ:281886256
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|神话暗黑 ( 陕ICP备18004004号-1 )

    GMT+8, 2026-1-29 12:43 , Processed in 0.071800 second(s), 24 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表