|
本文由virgol在2008年首发于TTBN。
- B* i) G1 u% {属性页显示的被怪物击中几率的计算过程
7 f+ u Q+ E/ W, ~* X, K, K; B7 y/ z$ k- r
以下所涉及的内容只针对 "怪物攻击你“时 属性页所显示的被怪物击中几率Tohit%,实际攻击调用的是另外的代码(大体相同,但细节上更复杂)6 X: |2 d5 f- j) K" D5 ~
( V# d r! \0 {; i; `( A" K8 |
Tohit%计算过程资料片和非资料片调用的是同一函数(代码位置D2Client.6FB38A00),而且不是一般的相同5 t; Y4 ~* B; s5 }; C6 T
, W: ]! d# b0 E4 d
以下是这个函数的主要流程:
8 E/ R/ ^8 m: [0 f4 k& }
2 S8 U7 y, _6 y2 m6 y3 j1 取人物属性页显示的防御值 DEF1,0 K; I: L5 o( J& Y! m- o B
取 ARMORCLASS_VS_HTH 值(一般为0)' l% i9 H+ {3 Q
最终用于计算的防御值 DEF = DEF1 + ARMORCLASS_VS_HTH ;
( v n0 q K9 v! ~( R- ^7 K7 s. }' R& ]; w& [" y: [3 C- i( I
2 获取怪物AR值,此值先记为 AR_BASE
# C+ l: [, S- K6 b(一个复杂的过程,最终取得的值为各种资料网站上能找到的怪物AR值)' _* Y S) F# E0 _5 t3 |" K
$ a6 s$ i* M4 r( S
3 将 AR_BASE 转换到用于计算的 AR ! ~ ~4 }3 G( d0 s
0 D, T4 m* W# Y+ H3 `3 S5 R/ O# ~& C判断monstats.txt中某一列的值是否等于1 ,这个列我估计是noRatio,不确定,但比较符合这个
# [2 l- C' K5 j! ]& Z等于1 的情况下 AR = AR_BASE ,跳到第4步; _+ p4 g; u4 A5 D
判断是否是资料片,资料片AR = AR_BASE ,跳到第4步$ r" U) E9 q) d# Z
判断是否在普通难度,普通难度AR = AR_BASE ,跳到第4步
y% B, f$ @. P( x1 H) U: f/ M. j! F不满足上述条件,继续处理6 @$ I) b6 g6 r! U1 E; l' N( ?, Z
先给出代码的处理方式3 T7 i4 M0 f) P. C, `9 n" `5 Y
AR_BASE×5 ,逻辑左移1位 ,得到值 AR_TMP
& U: C8 P: m2 E) i4 b% {让AR_TMP与0x88888889相乘, 取结果的高32位与AR_TMP相加,将结果算术右移3位,得到结果 AR_TMP2
1 E* k# j3 N; W* [0 M ]* {! E接着还有一步 将AR_TMP2与 AR_TMP2算术右移15位相加 取得最终用于计算的 AR , 因为此步基本对结果没有影响,我们将其忽略( a6 L5 m. I+ W
. b% d" Z. {6 v' ~1 A# |( \转化为近似的公式:0 {7 A7 R) I0 g- z$ A! l; d
AR = (10*AR_BASE+10*AR_BASE*(-2004318071)/(2^32))/8 ~= AR_BASE×0.667
X6 p' A6 T5 o; l: D# X# a实际计算过程中除法取整
# }: P% c6 W/ q4 x; _4 接着就是大家熟悉的Tohit%计算公式,但是原来的取整方式是错的+ P7 M; Y0 B' H7 X7 H
Tohit% = [ ([ AR*100/(AR+DEF) ] * MLVL *2)/(DLVL+MLVL) ]( U1 i* B9 K' _! R) H, X. ^" ~
其中 DLVL 就是自身的等级& `* O) y V, Z6 Z- ~9 \1 ^/ ?, i
MLVL 是怪物等级
7 D9 ?1 s0 ~" t1 v, k5 L8 j* o1 ?2 y- _+ j% b$ U
这里MLVL很关键,他是从mpq的monstats.txt中直接获取的!!资料片和非资料片一视同仁$ @; V% C6 X" N" [
也就是,对于资料片来说,计算Tohit%是忽略场景等级影响的,也忽略金怪带来的奖励等级
5 s, i+ O; B# C对于非资料片,一个72lv的大虫,计算Tohit%是按88lv来算的~~
1 s) z9 h5 {3 V! ~& ?9 ?同样,第2步取 AR_BASE 的时候也是按monstats.txt中的等级来计算的- \* H8 w7 W0 t5 g, I) |, ^3 N
0 s4 C6 s# K3 ^3 S4 d) X0 m" G
5 计算函数上面已经结束,调用后会再将结果限定到 [5 ,95]区间内
; U4 l( k5 v# x |
|