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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

428

回帖

830

元宝

1

圣者绑元

管理员

Rank: 9Rank: 9Rank: 9

积分
1
发表于 2020-1-13 21:44:18 | 显示全部楼层 |阅读模式
本文由virgol在2008年首发于TTBN。
. i( N9 L" |) N: e2 P" h' _5 r( a5 W属性页显示的被怪物击中几率的计算过程" Q2 i5 G! M* e/ g& O* n3 l

* H- b5 N; M! n+ O4 y) H! L6 R以下所涉及的内容只针对 "怪物攻击你“时 属性页所显示的被怪物击中几率Tohit%,实际攻击调用的是另外的代码(大体相同,但细节上更复杂); F* A/ I2 M* s8 i* k

# J0 j# i; f5 Z( S% jTohit%计算过程资料片和非资料片调用的是同一函数(代码位置D2Client.6FB38A00),而且不是一般的相同4 W% a! @3 i$ `
- R- p- B9 [1 q6 C0 h) m; r% c/ J
以下是这个函数的主要流程:/ B# p9 S" F. s+ |
/ ?9 H! z1 r* u' g) M1 p( ?* k
1 取人物属性页显示的防御值 DEF1,0 [2 x( U1 e2 n! T! M
取 ARMORCLASS_VS_HTH 值(一般为0)7 `4 R8 X' C3 N! L# V% _- j. |
最终用于计算的防御值 DEF = DEF1 + ARMORCLASS_VS_HTH ; : D; J0 E. y; z
7 @4 X( q1 o& R+ X3 c
2 获取怪物AR值,此值先记为 AR_BASE
$ T9 @3 B. T' P+ W(一个复杂的过程,最终取得的值为各种资料网站上能找到的怪物AR值)
" [! c, G2 |2 h8 W- G/ T
& K$ Z7 ~* H0 R, e/ a& m3 将 AR_BASE 转换到用于计算的 AR   ?2 e; G: ^0 e6 j

! C+ y5 s1 }( v* {/ F判断monstats.txt中某一列的值是否等于1 ,这个列我估计是noRatio,不确定,但比较符合这个
, ^5 j) v. Z! ]等于1 的情况下 AR = AR_BASE ,跳到第4步& y/ l5 q  ], e; N) k3 M7 V: `$ S
判断是否是资料片,资料片AR = AR_BASE ,跳到第4步+ v- M$ h5 ]- r) r- t- \
判断是否在普通难度,普通难度AR = AR_BASE ,跳到第4步
6 ^# f2 x$ e- c/ D- L9 |2 M9 I0 x% Q不满足上述条件,继续处理
! e* U8 M# O+ w2 e8 j先给出代码的处理方式
. B5 |9 v- X' U, e2 j/ L# ]; Y3 ?' \8 TAR_BASE×5 ,逻辑左移1位 ,得到值 AR_TMP  N' t% e6 X0 O9 x& _
让AR_TMP与0x88888889相乘, 取结果的高32位与AR_TMP相加,将结果算术右移3位,得到结果 AR_TMP2
6 Y3 v1 T- F9 A7 g" I接着还有一步 将AR_TMP2与 AR_TMP2算术右移15位相加 取得最终用于计算的 AR , 因为此步基本对结果没有影响,我们将其忽略$ [* w! r9 h" N. S1 d
6 W* E8 L& s0 D
转化为近似的公式:; P$ ?( i* _- T* D" n0 W4 j: q
AR = (10*AR_BASE+10*AR_BASE*(-2004318071)/(2^32))/8 ~= AR_BASE×0.6675 y* T% {# I5 a& j
实际计算过程中除法取整 9 p8 N! D- w, v8 I- Z8 @1 o
4 接着就是大家熟悉的Tohit%计算公式,但是原来的取整方式是错的$ p2 X6 A9 f: F7 h8 s4 i! ?5 G2 C8 {
Tohit% = [ ([ AR*100/(AR+DEF) ] * MLVL *2)/(DLVL+MLVL) ]
2 y! S$ r8 K6 o! ^) M7 O/ o2 g其中 DLVL 就是自身的等级" s4 e9 p4 G1 C, x* m1 p; b- H1 a
MLVL 是怪物等级
: g. N/ h+ u; i7 F# G8 b7 L8 O0 Q) H  k
这里MLVL很关键,他是从mpq的monstats.txt中直接获取的!!资料片和非资料片一视同仁
* g) x% Z+ V  D. X* F也就是,对于资料片来说,计算Tohit%是忽略场景等级影响的,也忽略金怪带来的奖励等级
. U% Y0 O& H3 o. e, w7 v对于非资料片,一个72lv的大虫,计算Tohit%是按88lv来算的~~! D2 N7 x: z  T
同样,第2步取 AR_BASE 的时候也是按monstats.txt中的等级来计算的" x# z& N) ^* G# g! p
; N* w9 {* E% ]3 r, O
5 计算函数上面已经结束,调用后会再将结果限定到 [5 ,95]区间内
) @, D6 H+ n- i  O
神话战网出品,必出精品!
回复

使用道具 举报

428

回帖

830

元宝

1

圣者绑元

管理员

Rank: 9Rank: 9Rank: 9

积分
1
 楼主| 发表于 2020-1-13 21:44:26 | 显示全部楼层
楼上帖子中分析了属性页显示的被命中几率的计算过程
) i" q0 c1 M6 n- h因为属性页显示的值查看时可以忽略实际怪物的生存状态,所以肯定是不准确的/ O* G* Q+ W/ I) }$ r# h2 J
3 U" ]  }0 e3 X" i. W0 G; ^0 G
本帖将分析 "怪物攻击你" 时实际命中率的计算过程 与 属性页显示的被命中几率的计算过程(暂称为"过程A")的不同
6 N4 {2 B: |. t1 u) E& e其他情况可以参考(til的某帖子,但已失效),那个帖子大体内容还是正确的) e, N1 x+ _) d) @/ f/ @
* |" Z8 g7 d# U* ~  Z
1 在计算命中率前,会调用D2Game.6FCB4740计算 MinDamage ,MaxDamage , AR_BASE
$ m! c( H8 d: C" r5 b计算AR_BASE时,将使用怪物的真实等级(不含场景等级修正,不含金怪等级奖励),0 s5 A( Y3 t* g3 ~, k2 g
一般来说 AR_BASE = (monlvl.txt中的TH × monstats.txt中的XXTH )/100 , 结果取整' i5 @+ y1 y' r" }! o: e5 h( k
其中XXTH 可能为 A1TH , A2TH , S1TH ,根据使用的攻击来定(过程A中使用的都是A1TH)* @( r" y6 ?2 X& N8 d- E' ^; R
! u9 y! U7 j. N6 K* Y
然后会跟过程A中一样根据条件进行调整,但条件顺序有点不一样,不过结果是一样的
2 B1 n( i3 w5 ~判断是否是资料片,资料片 AR = AR_BASE ,跳到第2步
* [9 E/ M2 A, P3 R7 G0 `/ q判断是否在普通难度,普通难度 AR = AR_BASE ,跳到第2步" B5 |5 l$ v3 t2 s' g
判断monstats.txt中noRatio是否为1 ,为1的情况下 AR = AR_BASE ,跳到第2步
, |# Z9 l8 k- Y" Q: V! }上面条件都不满足 AR = (10*AR_BASE+10*AR_BASE*(-2004318071)/(2^32))/8 ~= AR_BASE×0.6674 Q- {7 {, ?  I: v2 i
顺带提下MinDamage和MaxDamage,它们的修正因子为 ((10*715827883)/4294967296)/2 ~=0.8339 @% _/ U( s9 E; T/ n) N8 D

, H, p3 y) _( e2 计算额外的附加AR -> AR_EXT ,如技能带的AR等,将作为参数传给第3步
, ^. a& p# [& ]$ r0 F# f
7 ^3 V$ U5 p7 j" a% {8 _3 此步将开始计算命中率 (D2Game.6FC9D240)" {. g+ ~/ v1 \' M4 ]/ ]( L
3.1 计算 DEF7 G6 s5 Y$ S3 u2 g0 H
DEF = DEF1 + ARMORCLASS_VS_HTH 或者DEF = DEF1 + ARMORCLASS_VS_MISSILE (根据攻击来定); a1 _4 h3 c2 a( {5 M( {0 A4 K8 n* F$ Q
3.2 直接获的第一步计算好的AR" D) L, P) W1 a! n5 n
AR = AR + AR_EXT + 5*Dex(敏捷值) ;! h$ f9 D% V1 a" r4 o6 p5 r, |, b
获取AR加成 AR_Percent(含所有加成情况,如光环等)
  U& s: _/ d- d- `1 \! C# \AR = AR + AR *(AR_Percent%) ;此AR将用于最终计算
3 L) {& B0 h7 s( t" {3.3 又来到了这个公式 Tohit% = [ ([ AR*100/(AR+DEF) ] * MLVL *2)/(DLVL+MLVL) ]( u! ?2 c" X9 F7 ?
但不同的是,这里的MLVL将使用实际的等级(不含场景等级修正,不含金怪等级奖励)
% N5 _, _& ]$ M* c- `& c6 o2 c+ N6 o, s$ l* S' ~
3.4 将结果限定在 [5 , 95 ]区间内
. d4 y) i; K! y2 D: F8 c2 |6 z
! L& F; v# |8 i从上面过程可以看出,在非资料片里,实际怪物对你的命中率,将低于属性页显示的值0 v& E  h% E: Q' U2 X
以地狱大虫为例子,MPQ等级88 , 非资料片等级72 ,测试人物85级165防御3 C0 O; H% {' u' |" v. U
属性页显示为94%命中 = [ [2584*100/(2584+165)]*88*2 /(88+85) ] (2584 为 88级的ACTH*A1TH/100 *0.667 = 3874*110/100 *0.667)
  `- O/ B$ j8 d' J4 S& n* B7 w
8 L- r) u# z# K" e0 e! ?实际只有[ [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-11-23 04:05 , Processed in 0.063416 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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