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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
逗破暗黑Mod群:67994934逗破暗黑Mod客户端及补丁逗破暗黑Mod新手攻略逗破暗黑Mod赞助菜单
神话怀旧MOD群:67994934神话怀旧Mod客户端及补丁神话怀旧Mod新手攻略神话怀旧Mod赞助菜单
圣者归来Mod群:558972013圣者归来Mod客户端及补丁圣者归来Mod新手攻略圣者归来Mod赞助菜单
查看: 1840|回复: 1
收起左侧

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

[复制链接]

428

回帖

830

元宝

1

圣者绑元

管理员

Rank: 9Rank: 9Rank: 9

积分
1
发表于 2020-1-13 21:44:18 | 显示全部楼层 |阅读模式
本文由virgol在2008年首发于TTBN。1 x7 n" T4 P- ]) }" M5 R- E. d! |' ?
属性页显示的被怪物击中几率的计算过程8 @! [2 f, P/ k; e3 k' x% ~8 d

5 O, F) |2 x& S0 A( X. w& B' d* S以下所涉及的内容只针对 "怪物攻击你“时 属性页所显示的被怪物击中几率Tohit%,实际攻击调用的是另外的代码(大体相同,但细节上更复杂)
5 l$ U* Y/ x* R- r+ \  i) g) S  q7 h# ]6 u
Tohit%计算过程资料片和非资料片调用的是同一函数(代码位置D2Client.6FB38A00),而且不是一般的相同# B- B4 l/ L4 V0 M  x3 I+ a' X5 ~2 B
" y! _* \; N: z% t
以下是这个函数的主要流程:3 P5 M( h1 m: Q1 @" q
4 Z- j1 ^- w3 N  R
1 取人物属性页显示的防御值 DEF1,6 b" O3 t' k: i6 i( L' t& A
取 ARMORCLASS_VS_HTH 值(一般为0)
2 x0 p) z' U8 h最终用于计算的防御值 DEF = DEF1 + ARMORCLASS_VS_HTH ; $ z. F: I! [8 O5 _7 {& w$ s
$ o4 f' P. _! M" R8 F% Q
2 获取怪物AR值,此值先记为 AR_BASE* m, o7 |& s( E& m: v
(一个复杂的过程,最终取得的值为各种资料网站上能找到的怪物AR值)
' X* w  V$ K, A& e& _* m6 j  l
! ~* k& N# w- P  w; @+ _7 G1 A( @" L3 将 AR_BASE 转换到用于计算的 AR
; Q0 O+ t0 e' o9 [9 d) {- e( T7 `" z9 V3 O5 J( G2 i
判断monstats.txt中某一列的值是否等于1 ,这个列我估计是noRatio,不确定,但比较符合这个' I, ~0 k6 x  C/ p2 T
等于1 的情况下 AR = AR_BASE ,跳到第4步
# R4 W2 \( n* f1 B5 v2 b# U1 Z判断是否是资料片,资料片AR = AR_BASE ,跳到第4步
* b& U& m: M' r判断是否在普通难度,普通难度AR = AR_BASE ,跳到第4步* H& @' t' ^9 J" i' q8 h
不满足上述条件,继续处理
' \( s  X0 Q3 A$ C* N" N8 }先给出代码的处理方式4 L9 M* n8 ?. ~1 B' u  j$ a
AR_BASE×5 ,逻辑左移1位 ,得到值 AR_TMP
6 {* N5 T3 j+ m# I5 ~& c让AR_TMP与0x88888889相乘, 取结果的高32位与AR_TMP相加,将结果算术右移3位,得到结果 AR_TMP23 ~4 R$ s( e% q1 ?  m! {1 L& d
接着还有一步 将AR_TMP2与 AR_TMP2算术右移15位相加 取得最终用于计算的 AR , 因为此步基本对结果没有影响,我们将其忽略
& k  \3 }. E( N& l4 L4 l) u& k, v" g3 Z, Y
转化为近似的公式:9 W$ p  Z* o$ w& {, r7 a
AR = (10*AR_BASE+10*AR_BASE*(-2004318071)/(2^32))/8 ~= AR_BASE×0.6672 B( n8 P% p( D: @
实际计算过程中除法取整 9 W2 r  y. t6 t. D
4 接着就是大家熟悉的Tohit%计算公式,但是原来的取整方式是错的* z, e3 t5 E, [3 O% X8 n4 |; f
Tohit% = [ ([ AR*100/(AR+DEF) ] * MLVL *2)/(DLVL+MLVL) ]
3 Z2 T5 Q' r+ w: A1 t其中 DLVL 就是自身的等级0 r0 Y- _, I3 D( m
MLVL 是怪物等级
5 ?! |, M2 f$ [: j0 p4 p
  u: K' L9 u! G6 g6 V9 L+ ^这里MLVL很关键,他是从mpq的monstats.txt中直接获取的!!资料片和非资料片一视同仁$ W8 |6 y- l6 e2 |3 {
也就是,对于资料片来说,计算Tohit%是忽略场景等级影响的,也忽略金怪带来的奖励等级$ X$ Z. z! c2 L
对于非资料片,一个72lv的大虫,计算Tohit%是按88lv来算的~~
: N5 I  M3 q$ L# O- q同样,第2步取 AR_BASE 的时候也是按monstats.txt中的等级来计算的
4 {) c; Q% `, y- O& J! [" c2 e9 w% Z% p7 n
5 计算函数上面已经结束,调用后会再将结果限定到 [5 ,95]区间内

5 G' x- X, G6 q# m. t
神话战网出品,必出精品!
回复

使用道具 举报

428

回帖

830

元宝

1

圣者绑元

管理员

Rank: 9Rank: 9Rank: 9

积分
1
 楼主| 发表于 2020-1-13 21:44:26 | 显示全部楼层
楼上帖子中分析了属性页显示的被命中几率的计算过程( ?7 u+ Q- b* i8 e
因为属性页显示的值查看时可以忽略实际怪物的生存状态,所以肯定是不准确的# Y+ Z4 r. J" }/ G+ q

" C! Q1 ?, T. \1 a本帖将分析 "怪物攻击你" 时实际命中率的计算过程 与 属性页显示的被命中几率的计算过程(暂称为"过程A")的不同9 y; t0 G3 U# P& z6 M. W
其他情况可以参考(til的某帖子,但已失效),那个帖子大体内容还是正确的; i4 ^( b; |/ l6 _7 q8 d

4 I. ]& m3 A; K, D* p9 m) {5 L1 在计算命中率前,会调用D2Game.6FCB4740计算 MinDamage ,MaxDamage , AR_BASE
$ ?3 V$ [0 ]5 {3 E计算AR_BASE时,将使用怪物的真实等级(不含场景等级修正,不含金怪等级奖励),. y3 S! C8 z' h9 a7 }0 ~/ J
一般来说 AR_BASE = (monlvl.txt中的TH × monstats.txt中的XXTH )/100 , 结果取整
$ f5 Z3 A, U, O! y其中XXTH 可能为 A1TH , A2TH , S1TH ,根据使用的攻击来定(过程A中使用的都是A1TH)
0 \2 p$ d/ _4 ^5 n# u9 r/ v+ h" P3 P4 a3 Z4 x
然后会跟过程A中一样根据条件进行调整,但条件顺序有点不一样,不过结果是一样的
: K: [# u, G) a. P3 C判断是否是资料片,资料片 AR = AR_BASE ,跳到第2步8 T0 n  h  d5 z9 i/ U1 S- @
判断是否在普通难度,普通难度 AR = AR_BASE ,跳到第2步  [6 W- m# c+ D; ~
判断monstats.txt中noRatio是否为1 ,为1的情况下 AR = AR_BASE ,跳到第2步
2 l1 B( A' _  C$ i* M, w上面条件都不满足 AR = (10*AR_BASE+10*AR_BASE*(-2004318071)/(2^32))/8 ~= AR_BASE×0.667
( \6 b( O5 g0 k9 k. f/ D8 B7 Q* H顺带提下MinDamage和MaxDamage,它们的修正因子为 ((10*715827883)/4294967296)/2 ~=0.833( \2 j" o1 Y. k  X7 ?  c
; |3 Z' `' Q4 @" \4 ^; k# ]; q
2 计算额外的附加AR -> AR_EXT ,如技能带的AR等,将作为参数传给第3步
9 s+ u+ e, E% P7 L2 R, J
1 H) Q0 S+ V3 ?3 此步将开始计算命中率 (D2Game.6FC9D240)+ p" h- y9 q, ]+ p/ m! j" \$ H: o  {# u
3.1 计算 DEF
0 V( ]7 J  z* t2 U/ N. VDEF = DEF1 + ARMORCLASS_VS_HTH 或者DEF = DEF1 + ARMORCLASS_VS_MISSILE (根据攻击来定). P# P+ B2 v: R
3.2 直接获的第一步计算好的AR
. P; V- w  U5 e4 ~8 F- E+ w' kAR = AR + AR_EXT + 5*Dex(敏捷值) ;
- b: Z& L( T1 V/ R( |; v% i9 D7 v$ s获取AR加成 AR_Percent(含所有加成情况,如光环等)& S$ h$ a# a: z. }- D3 _  L9 U
AR = AR + AR *(AR_Percent%) ;此AR将用于最终计算1 i4 y( [  x8 g+ P/ d3 ~9 O, l/ F
3.3 又来到了这个公式 Tohit% = [ ([ AR*100/(AR+DEF) ] * MLVL *2)/(DLVL+MLVL) ]
9 ?; S4 f: N; U4 X但不同的是,这里的MLVL将使用实际的等级(不含场景等级修正,不含金怪等级奖励)8 Z; ]# R$ p! G/ H

7 H2 E  X6 \  m) w  R, v- _3.4 将结果限定在 [5 , 95 ]区间内 * Y1 K* c; f; N, `6 @6 q! |
# V7 `/ i0 T8 B4 J( S
从上面过程可以看出,在非资料片里,实际怪物对你的命中率,将低于属性页显示的值
& `$ r. i3 Q2 v) }1 d. [( y7 M: u以地狱大虫为例子,MPQ等级88 , 非资料片等级72 ,测试人物85级165防御
7 n9 G& o* F3 X3 ]5 d属性页显示为94%命中 = [ [2584*100/(2584+165)]*88*2 /(88+85) ] (2584 为 88级的ACTH*A1TH/100 *0.667 = 3874*110/100 *0.667)
( q( I7 T/ J, w. t
+ K; W! h0 p8 j, s5 X实际只有[ [2138*100/(2138+165)]*72*2 /(72+85) ] = 84% (2138 为 72级的ACTH*A1TH/100 *0.667 = 2914 *110 /100 *0.667) (计算中有误差, 跟踪代码显示是86%)
神话战网出品,必出精品!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-26 04:29 , Processed in 0.062877 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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