|

楼主 |
发表于 2020-1-15 02:00:50
|
显示全部楼层
Skills.txt By Nefarius" X$ A* F3 `% i& K
7 N- u8 X' r, B$ F4 ?) G6 v4 z
很长一段时间以来(1.00直到1.09)Skills.txt只是一个很小的文件,其中仅含有很少的一些内容(主要是技能使用了何种动画,传递的参数以及造成的伤害等),其他部分都由硬代码去折腾了;然而到目前,虽然各种技能作用的方式(函数运算)仍旧写在硬代码中,但其他的所有效果都可以在该文件中找到对应内容并加以编辑,包括何种技能调用哪一个函数来实现;于是该文件成为了D2中非常复杂的,几乎是最大的文件之一:它包含了256列,也就是MS Excel所支持的最大数量;本引导文件并非旨在为每一列的功能都提供一份100%精确的说明文件,并且这也是不可能做到的(因为有些列的功能非常依赖于其技能函数的数据库实现方式);同时该文件也不会对其中的功能实现语法给出过多解释:Xeno就这些语法以D2特有的分析方式写过一篇非常全面的引导文件,因此这里没有必要重复 X8 Y' ~" m1 Y% A
( h9 K& `7 @! |. m一些概要类设定( A9 u% [# n" B4 S: Q3 B$ M
Skills:技能ID指针,用于CharStats.txt,Missiles.txt,MonStats.txt,SkillDesc.txt以及Skills.txt文件本身,用来引用该技能;这个ID指针同样用在AutoMagic.txt,Gems.txt,MagicPrefix.txt,MagicSuffix.txt,QualityItems.txt,Runes.txt,SetItems.txt,Sets.txt以及UniqueItems.txt里,但在这些文件中系统的分析机制存在bug:带有空格符的技能名称不会正常表达,所以在这些文件中最好使用技能的实际ID数字而不是此处的ID指针;另外请注意不要让两个技能拥有相同的ID值,否则除第一个技能外所有其它技能都将被系统无视
; f2 k8 Q0 R+ u* n! p7 b, `) Z; o
ID:技能的实际ID值,亦即ID指针实际指向的值,这里的值不可重复;游戏允许最多可以有32767种技能,但不是所有这些都能被表达在物品上,除非去修改ItemStatCost.txt文件的相关内容;另外,编码属性(CTC属性以及聚气属性)所支持的ID最大值只能到1023;注意这里有些ID是被硬代码所引用的,所以不要在文件中随意移除某些技能/ o) a/ |" l0 d
, G$ x' T. v6 k. ^9 \* BCharClass:该技能属于哪一个角色类型,此列控制着该技能使用何种DC6图标库中的哪个技能图标,以及该技能将得到哪些与技能有关的属性的加成(例如+亚马逊技能等级等等);所有角色必须拥有相同数量的技能,否则仅拥有技能数量最多的那个角色可以进入游戏,其他角色将出错(因为游戏为每一个角色存档都准备了相同数量的技能状况存档空间,因此拥有技能少的角色存档将被看作是损坏存档);要避免这个问题可以给技能少的角色随意指定一些其他的技能,即使它们不出现在技能树上,并且无法使用也无所谓;此列留空则表示该技能不属于任何角色
. X9 t% K) g+ t6 o' n* t; i6 y) C+ k$ u4 {
Skilldesc:ID指针,引自SkillDesc.txt,控制着该技能在角色面板上所关联的外观,例如技能图标文件,技能上的说明文字以及其伤害/准确率如何显示在角色控制面板上;千万不要将同属某角色的两个技能指向同一外观,否则将导致崩溃. R; A8 N$ {. C& m6 u
! u9 Y: ?* O* W1 d) L
一些服务器端的技能运算函数- v: U9 T# Y7 }' C
以下这些函数在1.00-1.09版D2中均以硬代码表的形式出现,而1.10版的Skills.txt文件为这些函数索引提供了软代码修改功能;这些函数是各个技能的核心内容,它们控制着该技能的各种特性:例如该技能会改变何种属性、使用何种算法、是否使用程序代码硬性规定的参数,以及某飞射物的发射方式等等诸如此类7 j* t Q6 w$ {
SrvStFunc:服务器端发生函数,当你右击鼠标或者Shift+左击鼠标以使用某技能时,在服务器端运行的函数
2 w$ e$ W* c& F
! S) B/ a7 Y, a* D* s9 y- m: O2 k8 zSrvDoFunc:服务器端终止函数,即当服务器端的发生函数运行完毕后启动的一个结束函数,假如你的鼠标始终保持按下状态,那么该函数可能被不断重复调用抑或周期性的调用. M2 a; a; I0 W+ K. l( n- v
1 [/ a: h' N) V( o9 p, `. o
PrgStack:聚气技能会用到的一个布尔值,1 = 其聚气效果可以叠加(例如焰拳、雷电爪、寒冰刃),0 = 每次使用该聚气技能都会覆盖掉原先的聚气效果(例如凤凰攻击);因此假如将凤凰攻击的该值设定为1,则游戏中可以同时释放凤凰攻击的三种最终效果# O8 q- z7 B( O! [" e( c
4 [3 ~8 H: i! E$ g) X/ fSrvPrgFunc1:使用最后一击来释放一级聚气时服务器端所运行的函数
W* q1 |* `9 D+ N1 @6 _SrvPrgFunc2:使用最后一击来释放二级聚气时服务器端所运行的函数
8 f1 r4 H* z2 z* o" ~SrvPrgFunc3:使用最后一击来释放三级聚气时服务器端所运行的函数5 y- v! y' P! }7 @, y P4 \
+ j# ], O& z6 l. a, X4 D: o# R
PrgCalc1:一级聚气时服务器端函数所使用的运算式(该列也用于震波网络和刃之怒,因为这些技能的实现函数会用到它)
+ R9 L v5 R; S0 J( q' JPrgCalc2:二级聚气时服务器端函数所使用的运算式
; C# b* _6 o+ s8 H2 C. xPrgCalc3:三级聚气时服务器端函数所使用的运算式# ]: I. J y7 X; P7 m
: w; b; X" ^' p. E# w" c7 ]$ UPrgDam:与硬代码规定的某些递增属性相关,1 = 与PROGRESSIVE_DAMAGE共同作用,2 = 与PROGRESSIVE_STEAL共同作用,3 = 与PROGRESSIVE_OTHER(该属性未使用)共同作用,4 = 与PROGRESSIVE_FIRE/COLD/LIGHTNING共同作用;要想增加新的递增属性就必须扩展该处所链接到的相应函数列表 h% Z; J- z+ ]9 u3 G2 i5 ^ M
6 }7 y3 F. ]6 _/ c5 q) T
一些服务器端关于飞射物的设置
2 @% m- M; I6 [) X$ b% O4 \以下这些列控制服务器端该技能发射出的飞射物种类,这些与玩家在屏幕上看到的那些飞射物不尽相同,但客户端的飞射物设置必须与此相匹配,以避免玩家在游戏时遇到一些尴尬的问题:如果双方不匹配的话游戏并不会出错,但会出现一些怪异的事情比如被隐形的东西击中或者看到什么怪物莫名其妙的死亡……
K5 B+ \3 \" M; y( u- B |! r8 l) e
SrvMissile:该技能的服务器端发生函数运行时出现的一级飞射物,但该飞射物并非由此函数产生,亦即发射此飞射物与服务器端函数运行是两个相互独立的事件' `/ C, i: k* ^6 i. {' _# g1 Z
6 ]1 c% v' X% q4 c1 a& n3 `
DecQuant:此处为一个布尔函数,表示是否该技能每次运行发生函数时都会减少其所使用到的物品/弹药的数量:例如对于炮轰技能,假如此处设定为1,则每次炮轰都会消耗与其发射次数相同数量的箭矢
M; B$ p0 ]: [: _1 Z$ x# B- m( M
Lob:也是布尔函数,1 = 该飞射物将采用抛物线轨迹发射,0 = 采用直射方式;抛物线形式的飞射物将会在其接触到鼠标点击处的地面时立即消失;在这里设置为抛物线形式的飞射物仅仅是视觉效果,假如其本身的性质并非抛出类型,则其真正伤害敌人时仍旧使用最初的方式,例如直线杀伤等;相关内容请编辑Missiles.txt的内容) z- |& f5 r0 a8 T9 y. ~
' {7 `9 {; z; uSrvMissileA:服务器端发射的第一种二级飞射物(该飞射物的作用方式将取决于该技能的服务器端函数)
$ j( n, y# `3 o- J0 @; X% CSrvMissileB:服务器端发射的第二种二级飞射物(该飞射物的作用方式将取决于该技能的服务器端函数)
* Q" n _. q# \5 S) kSrvMissileC:服务器端发射的第三种二级飞射物(该飞射物的作用方式将取决于该技能的服务器端函数)& ?/ x' @, a( d! v& g9 W
' l0 O" {/ O3 m6 ^+ y" P: ^一些由服务器端控制的修饰图像
! v8 T& z6 `# r' q/ H+ t0 X9 r" M3 H; HSrvOverlay:各技能修饰图像一般由客户端控制,但仍有一些由服务器端代码控制的修饰图像,主要是服务器端终止函数运行时,加于敌方身上的效果,包括加于敌方身上的近战效果,不同怪物所受到的技能亮化影响(如内视会使怪物身上出现闪烁光芒)、诅咒效果以及天堂之拳下落击中敌人的部分;该处引自Overlays.txt中的ID指针,在服务器端终止函数运行时,此处的修饰图像起作用' |3 ]5 b) p* E9 z
/ N' f/ C) N' F6 s
光环/诅咒/亮化效果相关设定
& `$ q7 L3 u B( X5 d) h9 n以下列不一定都要被光环/诅咒/亮化技能所使用,例如,有些技能会在某个范围内自动搜寻受到其影响的目标,以及一些区域效果魔法也会使用到这里的设置
5 G9 n. U. ]: MAuraFilter:此处是一个二进制筛选参数,用以描述何种单位会受到该技能的影响;这里的筛选参数对各种技能所筛选出的作用目标也是不同的,很大程度上它取决于服务器端的该技能函数用何种算法去自动找寻其能够作用的目标;此列用于大多数在其作用范围内自动找寻目标的技能,以下是一些技能在该处的值:
6 Y4 _ i8 {% S$ k0001000010110000011 – 内视、嘲弄
2 ?' q; e7 e/ C0001100010110000011 – 慢速箭
0 Z. B' m6 q9 _, M8 C0001010010110000011 – 闪电之怒、信念、龙卷风0 g) ?$ {6 g9 ` x6 d8 O
0001000011110000011 – 静态力场' |0 k% O% F$ ?/ m: b, ?1 B
0000000000000000011 – 伤害加深、削弱、攻击反噬、偷取生命、衰老、降低抵抗(可作用于Boss)' `; V: p [( H" o
0000000000000000010 – 微暗灵视、恐惧、迷乱、吸引、残酷吓阻(不可作用于Boss)( i" P) h8 t; F
0010010000000000011 – 力量、祝福瞄准、活力、反抗、抵抗火焰、抵抗冰冷、抵抗闪电、救助、专注、净化、狂热、祈祷、刺针、防御诅咒、鲜血诅咒7 x' L0 K ]! \$ [
0010010000000000001 – 冥思' B& N: b# t5 ?: `- s
0001010011110000011 – 圣火、神圣冲击、飓风
% O6 z5 m9 _- B. V+ ]1001010001010000011 – 神圣冰冻' l9 C/ S. `' S% e. n
0001110011110000110 – 庇护所0 q8 O6 U" A0 C! P f, H
0001010010110000111 – 天堂之拳3 H# y' v8 a9 y# W" ?
0000001000100000010 – 救助% L% M7 U2 ~9 k" J8 f7 V: m J
1100000000000000000 – 战嗥. |' M7 N( J7 {' [. N; B* i2 n9 Y: _- W2 t
0001110000000000011 – 魔影斗篷7 P J' H0 g2 {7 Q
0001000001110000011 – 心灵爆震、刃之怒3 l# x; T% W: i( e- {4 ^
0001000011100001011 – 寒冰刃
1 `* n3 D( X' n9 F6 A+ c- ]0010000000100000011 – 橡木智者光环、狼獾之心光环、棘灵光环
( l t! \1 T) n+ V9 n7 U# T8 ~ [( \+ F% s4 c% k
AuraState:该光环/诅咒/亮化技能(事实上对于任何技能都适用)施展(使用)后使其施展者(使用者)本身所处的状态,被强化技能强化过的单位也会处于此状态,这里的值引自States.txt中的ID指针(需要注意的是最好不要有某几个技能的此值相雷同,否则,当这几个技能同时作用于某角色时,该角色的状态将不可预知)6 H/ r& H& ?# }; `* @8 R4 }7 [
AuraTargetState:该光环/诅咒/亮化技能(事实上对于任何技能都适用)施展(使用)后使其被作用者所处的状态,这里的值引自States.txt中的ID指针(需要注意的是最好不要有某几个技能的此值相雷同,否则,当这几个技能同时作用于某单位时,该单位的状态将不可预知)
* s, ^, d" \' o+ q+ c, a! ]) l
3 o% J( g9 Z4 |. P1 w( \; K3 bAuraLenCalc:此处支持填写数值或者表达式,用以控制该光环/诅咒/亮化技能的持续时间(以桢为单位);不过真正的光环类技能不使用此列,它们是周期性刷新状态的
# E% q1 [# D, M: W1 YAuraRangeCald:此处支持填写数值或者表达式,用以控制该光环/诅咒/亮化技能的作用范围,有些其他种类的技能也会用到此列的定义,例如闪电之怒,用于计算释放出闪电球时的感知范围和杀伤半径
9 v' |# U# W( T) s9 O3 T
1 x V" n1 r! K& V. K: G3 r; H, q4 aAuraStat1-6:该光环/诅咒/亮化技能所能改变的属性,这里的值引自ItemStatCost.txt中的ID指针" L/ e' J% k, d! V
AuraStatCalc1-6:与其前一列相对应,表示该光环/诅咒/亮化技能所改变的属性的具体数值,此处填写值范围为-2147483647到2147483647,范围之外的数值将采取循环计数
U4 L% s" E! w& h. e ^
- c1 h4 y N IAuraEvent1-3:此处表示何种事件发生在该光环/诅咒/亮化技能的施展者/实际使用者身上时,该光环/诅咒/亮化技能会做出反应,这里的值引自Events.txt中的ID指针
! ^& k; O( Q6 Y u KAuraEventFunc1-3:此处与其前一列相对应,表示该光环/诅咒/亮化技能对相关事件做出反应所运行的事件函数,所有事件函数列表请查阅相关资料,需要注意的是这些事件函数中的大多数在被技能调用时都会有些小问题0 e$ c1 U, q: G
R# C9 i: d; Z' t8 f
AuraTgtEvent:通常无用;该列功能与AuraEvnet列相仿,但作用于技能的被作用者/ c3 n, h: S# O% Z
AuraTgtEventFunc:通常无用;该列功能与AuraEventFunc列相仿,作用于技能的被作用者" c# h9 J, u7 P4 R* a+ D
. Z& G( H7 U( E5 }8 q+ S7 C$ y3 ]" E- @一些技能的被动属性设定; P1 r8 x: r+ P$ K$ l$ S
某技能是否是真正的被动技能要取决于其Passive列的布尔函数值是否为真,真正的被动技能当然使用这些列的值作为其属性,如果不是真正的被动技能,则以下这些列的值被用于服务器端的函数运算,用以计算该技能的所谓“第二被动加成”,这些列会成为前面光环/诅咒/亮化技能列的扩展属性,或者被用来计算召唤物的属性,等等8 {1 f! z- f) X. \1 ^
PassiveState:这里表示处于该被动技能作用下的单位所处的状态名称,此处值引自States.txt中的ID指针(最好不要有某几个技能的此值相雷同,否则,当这几个技能同时作用于某角色时,该角色的状态将不可预知)2 y8 Z( e2 y$ D. w8 r; r
" d0 h) \! T% `, _PassiveIType:此处填入ItemTypes.txt中的ID指针并与其相对照,用以判定使用何种物品时可以获得该技能的被动属性,用于武器支配技能等(此列值不会对非武器支配类属性起作用,换句话说,它仅对passive_weaponblock,以及六种passive_mastery_XXX类属性起作用);武器支配技能的参数并非固化于硬代码中0 V; i, O2 B! _/ ~, U
1 ?4 d$ h* }9 Z" sPassiveStat1-5:此处说明该被动技能定义了何种被动属性,这里的值引自ItemStatCost.txt中的ID指针
2 J( p: \% m) B- r4 CPassiveCalc1-5:此处支持数值或表达式,与其前一列相对应,用以说明各属性的具体值;此处的值范围是-2147483647到2147483647,超出该范围的值将采用循环计数8 C8 d7 T; W+ `, n+ F* ?
3 n0 g9 g& ]4 N) G1 j( n9 sPassiveEvent:通常无用,与AuraEvent列的用途类似5 x3 R4 J7 [+ p* C [$ V1 U2 M( W
PassiveEventFunc:通常无用,与AuraEventFunc的用途类似
' v, o0 m$ y; K b" U9 ~# e$ g5 D& j2 {( v% O3 Z+ ?$ Z( T' b6 K" b5 l
一些召唤技能的设定
1 Z: E$ A/ W) F. K) \' r/ R附加于召唤物的特殊属性可以通过MonEquip.txt/MonProp.txt文件或AuraStat/PassiveStat列进行设置8 K3 z% z( F# r! C
Summon:此处说明该技能召唤出何种召唤物,这里的值引自MonStats.txt中的ID指针# b& q5 T# N- U' x4 Z2 |# h
! w5 S, H+ K. tPetType:此处控制该召唤物属于哪个组,其效果包括屏幕左上角显示的图标,该召唤物是否能与其他召唤物并存(例如多种石魔不能共存),以及该召唤物的行动方式等等;这里的值引自PetType.txt中的ID指针
; J( t% J! s. c, T/ P+ E z5 _
/ r* \) N, ~! n! b! P$ ZPetMax:此处支持数值或表达式,表示一个角色可以同时拥有多少个该召唤物,留空意为无限制: }- }7 }, h# x& V4 B
6 b e5 u% O' K* B) N4 o
SumMode:当你召唤出该召唤物时,其使用的动画模式;例如假设要召唤一个僵尸,并且看起来像是僵尸从土里爬出来的动画,则这里应该使用S1;不过很多情况下这里使用NU(无多余动画,突然出现)为好,因为大部分单位没有与S1相匹配的动画
6 |- D% j" ]: I, q; ?4 l7 S4 G3 D
SumSkill1-5:此处控制该召唤物所能使用的技能,但事实上多被用来为召唤物提供一些方面的加成(例如增加火蛇的伤害),某召唤物是否使用该技能完全取决于其AI设定;在召唤物所能使用的各种AI里面最好的当数ShadowMasterAI,而NecroPetAI则完全不可用(其定义于硬代码中);另外召唤物所能使用的技能也可以在MonStats.txt中定义
2 p% ]: w4 ?6 y, l, I, ~' v( m' H" x$ ?+ t5 `. ]$ {3 a' W2 H
SumSk1-5Calc:这些列与其前一列相关联,支持数值或者表达式,用以控制各召唤物所使用的技能等级$ E3 R/ t9 |+ t: r
: [9 s6 U: t* ?; K9 D0 @+ `SunUMod:该列非常出色,它可以使召唤物获得金怪的属性,这意味着使用这一列,你可以使你的召唤物拥有闪电强化或者灵气加强属性;这里的值引自MonUMod.txt中的ID值;在这里给召唤物赋予的属性效果比起真正的金怪要差一些;另外当你取消召唤时,这些召唤物的名字将以随机金怪的名字显示3 m% S' P \% I3 K' \
| l: j N, m* U. `7 p7 s( E
SumOverlay:当召唤物被召唤时所显示的修饰图像(显示于召唤物而不是召唤者);这里的值引自Overlays.txt中的ID指针6 i( g. V5 F% t. T+ W
: |$ Z1 B7 k( y5 D一些声光效果设置$ \ o. a1 B7 {7 w" q
列名中带有Sound/Snd的那些是与音效有关的,其值引自Sounds.txt;列名中带有Overlay字样的列与显示效果有关,其值引自Overlays.txt
: e& ~ r! [# iStSuccessOnly:布尔函数,用于控制当施展技能的动作被敌人的攻击而打断时,是否继续播放完该技能的施展音效和视觉效果,1 = 继续,0 = 中断
7 K4 Y7 H% B9 C3 U. p1 C4 H& T9 G6 G: H
9 @( n1 w+ {5 V/ ~( a! F+ S- v' NStSound:当该技能的发生函数运行时,游戏所播放的音效,无视使用技能的角色类型 ?4 i# Y h* G% ]* [
StSoundClass:当该技能的发生函数运行时,游戏所播放的音效,该音效只有当CharClass列中规定的角色使用该技能时才播放,以避免出现一些不合时宜的声音! U: `+ b) m1 L5 @
StSoundDelay:一个未知布尔类型函数;一个合理的猜想是1 = 当该技能发生函数运行完毕后开始播放音效,0 = 在该技能发生函数运行同时开始播放音效
1 ?/ t! Y6 y# ~, s# |" a
+ ~! K$ _9 w2 o$ ]8 ?: H; r1 `( D. }WeaponSnd:当该技能的发生函数运行时,该布尔值控制是否播放使用该技能时身上装备着的武器的相关音效,1 = 播放,0 = 不播放
7 j% c$ E# v: W; w) A! G! Y5 o. u6 E9 a* e; c; e
DoSound:每次该技能的终止函数运行时,游戏所播放的音效,对于白热这样的技能而言,该音效将在每次挥击落下时播放
- u; @4 ^7 C7 k: v* D6 B8 R( FDoSound A:此列及下一列的功能取决于该技能所关联的终止函数,其控制范围涵盖了每次攻击后的特殊音效,以及召唤出的召唤物音效等各个方面
8 Y' c( L2 Z5 u0 s+ FDoSound B:此列及下一列的功能取决于该技能所关联的终止函数,其控制范围涵盖了每次攻击后的特殊音效,以及召唤出的召唤物音效等各个方面! K$ M& x. c6 {4 x+ [8 \
; d, t N- E" Y( D
TgtOverlay:该技能的终止函数运行一次之后,为该技能的攻击对象所做的修饰图像;对于白热这样的技能而言,这意味着第一次挥击将不会为其攻击的怪物做修饰图像,而之后每次挥击都会修饰之
v9 E' v; _7 y0 ITgtSound:该机能的终止函数运行一次之后,游戏播放的音效(发自被攻击者);对于白热这样的技能而言,这意味着第一次挥击后不会播放其攻击的怪物的声音,而之后每次挥击都会播放
* N5 o1 g7 j! O0 U! Q
( z0 d8 ?4 O- ^1 g jPrgOverlay:此列功能取决于该技能所关联的运行函数;对于聚气技能而言,该列显示的是对该聚气技能聚气图形的修饰图像,对于其它如飓风之类的技能,该列控制的是该技能激活时的修饰图像9 m8 m/ J5 l$ a8 m9 @* i: E
PrgSound:与上一列的功能类似,取决于该技能关联的函数,它用于播放每次聚气的声音或者飓风激活时的音效,等等3 L2 z6 z3 _5 b7 T
- W% o% [) g) F% F
CastOverlay:当某单位使用该技能时所关联的修饰图像;该修饰图像当且仅当该技能被成功施展出来之后(并非技能发生函数运行,而是该技能的相关代码开始运行)绘制
0 W! N1 r9 |$ V& c0 P! x5 ECltOverlayA:这列通常与CastOverlay列的功能相同,但取决于该技能使用何种函数. q X6 a4 N1 M7 I9 v% p
CltOverlayB:这列通常与CastOverlay列的功能相同,但取决于该技能使用何种函数
: c1 `! `& H! D5 {1 Y4 j
% v" o; S, g1 A( D2 G1 `8 m一些客户端的技能运算函数
1 g! {. r9 B1 v& G' Y. A这里的函数在1.00-1.09时期都是由硬代码规定的,但1.10中被放置在了txt文件中;服务器端的运算函数将决定显示在玩家显示器上的内容,因此最好保证服务器端运算与客户端运算的同步,否则有些技能的实际效果将与其显示效果完全不符6 p+ W2 u8 C5 b# @; R
CltStFunc:客户端发生函数,当你右击鼠标或者Shift+左击鼠标以使用某技能时,在客户端运行的函数
( F. F( I& c) |: f6 w: ^$ e
7 x- Z# ^8 c& ], M2 |CltDoFunc:客户端终止函数,即当客户端的发生函数运行完毕后启动的一个结束函数,假如你的鼠标始终保持按下状态,那么该函数可能被不断重复调用抑或周期性的调用9 i: c8 x( Y6 \# s( a7 x
% O* K& V( [' _: P) _/ t% BCltPrgFunc1:使用最后一击来释放一级聚气时客户端所运行的函数, `$ E: c8 N6 V% E0 R( Z& L5 i
CltPrgFunc2:使用最后一击来释放二级聚气时客户端所运行的函数( q# D/ |# V6 D8 \& x9 V
CltPrgFunc3:使用最后一击来释放三级聚气时客户端所运行的函数
% ]: R) w( I, G) _0 g4 |5 D0 _! S
0 |. D J2 m4 d' T客户端的一些飞射物设置: @( d5 p: g) O* G: w+ v
以下这些列控制客户端该技能发射出的飞射物种类,这些并不依赖于服务器端的相关代码,但服务器端的飞射物设置必须与此相匹配,以避免玩家在游戏时遇到一些尴尬的问题:如果双方不匹配的话游戏并不会出错,但会出现一些怪异的事情比如被隐形的东西击中或者看到什么怪物莫名其妙的死亡……3 N( I" F3 S0 T' X3 w4 k2 P
, e4 g- s' R8 C; }9 j& v
CltMissile:该技能的客户端发生函数运行时出现的一级飞射物,但该飞射物并非由此函数产生,亦即发射此飞射物与客户端发生函数运行是两个相互独立的事件
. ]; V: X4 d8 E5 x5 A9 \
% u& T- U# l0 g/ T2 Y# ^CltMissileA:服务器端发射的第一种二级飞射物(该飞射物的作用方式将取决于该技能的服务器端函数)
5 k& u/ ~0 V6 Y. i- ~CltMissileB:服务器端发射的第二种二级飞射物(该飞射物的作用方式将取决于该技能的服务器端函数)4 N$ a; A& l9 I9 d. o' H
CltMissileC:服务器端发射的第三种二级飞射物(该飞射物的作用方式将取决于该技能的服务器端函数); u' H( f) `/ Y
CltMissileD:服务器端发射的第四种二级飞射物(该飞射物的作用方式将取决于该技能的服务器端函数)
8 Q& R4 q* |, u$ b9 ?4 n5 b- E& q D% j8 l
客户端技能计算
% x! W6 P! z9 b* ]0 C! PCltCalc1-3:这些列用于客户端的技能函数中,以实现一些特殊的功能,具体何种功能则取决于其函数的作用;这里支持数值或表达式;! n) f' k( X+ l' o- ]% g& i
. ^# Z( T8 j* T* d杂项设置I8 J2 c$ M$ v$ m# p8 x
Warp:未知布尔函数值,仅用于几个瞬间移动的技能,但改变它的值对技能效果没有影响4 e, }3 B; p; l6 \
8 w$ F1 I: I) y2 f6 P& r$ [
Immediate:布尔函数,控制当激活该灵气时其效果是否立刻应用,1 = 是,0 = 否,并且取决于该技能PreDelay列的值;一般来说为角色提供某些属性的灵气此项为1,某些对怪物起作用的灵气(如信念)此项为0! |% ?7 { E$ l9 m
0 r2 k' B+ D( u7 c* m% NEnhanceable:未知布尔函数值,该值并不影响某技能从物品中得到加成,因此似乎无用
1 O8 _; ? ~( c6 l+ c# f' x$ Q( W8 L4 [' q# |
AttackRank:此列控制当该技能用在某怪物身上时,它会做出什么反应;例如被元素伤害光环击中的怪物是否会反击,等等;该值越高,怪物针对该技能的攻击进行报复行为的几率就越大,0会使怪物无视该项技能
; v9 o( H3 m+ ]* L" g6 ]& L& `( b3 L+ o0 Y* n5 Z d. T# [
一些技能对于装备的使用限制
) x, O6 P* V$ X- l4 Y: N! L! YNoAmmo:该布尔函数控制角色是否需要弹药以使用该技能,该列值与DecQuant列共同作用以定义一些飞射性技能的属性,例如魔法箭,此列值为0,则不需要弹药亦可发射! T: v* ^0 s& N5 u3 _/ m, F# ]
, q6 U' a6 l$ ?% E: D# |
Range:此处是一个选择函数,有四个有效选项,控制着角色该如何施放该技能:
1 \- G2 G9 y0 _None = 无任何限制,属于法术类. V, _: p. `0 F- d6 T/ n/ H; H
Rng = 该技能属于远程攻击技能(标枪技能、弓和十字弓技能)
! g% k! j1 t5 u! b/ p: k, zH2h = 该技能属于近身攻击技能(如重击、牺牲等). d+ a: R/ w% s- j& Z7 k
Both = 该技能可被远程攻击使用也可被近身攻击使用' Y$ P# S! X4 {/ B
6 @7 t2 H0 G, [2 O+ U
WeapSel:此列控制使用该技能时应当如何用装备进行攻击:& ^4 T( A+ M% J' [7 L# \3 a
留空 = 该技能无须特殊途径去操作(即默认的右手拿武器)& `8 [- B1 T+ F0 q7 E
1 = 必须使用左手武器! U- Q8 e0 s C, U/ H
2 = 可以使用左手/右手/两把武器$ g7 ]* ~1 Y0 q6 r" \
3 = 必须使用两把武器: g3 G6 {0 j" i4 W2 j3 e
4 = 不使用武器
7 D2 B7 S2 q! L: c5 Y _; U, O注意:4已经被硬代码限制,仅用于盾击和一些踢击技能
6 S/ `+ E0 g& z8 `* r; ^8 ~7 E) n
IType1-3:使用该技能所需的物品类型(仅限角色的右手装备),该值引自ItemTypes.txt中的ID指针
0 i. w3 \# ?. N8 ?% W f( |3 D+ v! {. }2 K) s, n
EType1-2:禁用该技能的物品类型(即使该装备也出现在允许使用的列表中也会被禁用,仅限角色的右手装备),该值引自ItemTypes.txt中的ID指针$ g4 D Q- H5 z d. b. s2 K
4 ]7 T8 l/ B, ]( }7 b8 S+ rITypeb1-3:使用该技能所需的物品类型(仅限角色的左手装备),该值引自ItemTypes.txt中的ID指针
$ G# x2 r- I% Z- c3 J
/ K9 e: |& ?' o! [) M2 o# J- t5 i- n6 rETypeb1-2:禁用该技能的物品类型(即使该装备也出现在允许使用的列表中也会被禁用,仅限角色的左手装备),该值引自ItemTypes.txt中的ID指针7 N7 L) t4 b! M: d, H$ u: B" I
6 Q/ T3 @0 d) I( ~& i8 b一些动画设置
@4 s: B5 ?- |; `! E7 G, N, BAnim:角色使用该技能时游戏播放的动画模式,关于角色动画的详细列表请参考PlrMode.txt文件,一个例子:SQ代表顺序动作(Sequence);此处也定义了角色施放某技能的速率是以IAS计算还是FCR计算,对于顺序动作而言则决定于该顺序动作将使用何种动画(这里有些模式例如GH,一旦使用将导致游戏崩溃,因为这些模式无法被技能所使用)9 |3 X! ^# D" F* `) q0 n/ F3 K5 B$ l5 ?
4 v9 A: ]6 {- Z" L1 O
SeqTrans:此列显然是个无用参数,也许本意是想定义角色在开始某顺序动作之前的动画模式,但实际未作用: F7 D# N% F; M! Z' M! B
0 B/ |7 Z: h/ X3 z* f
MonAnim:本意是怪物使用该技能时游戏播放的动画模式,但怪物一般都使用MonStats.txt中定义好的动画,并且怪物无法使用角色的顺序动作动画,因此这里仅用于刺客的影子大师和影子战士——这两者使用刺客本身的动画;假如这里为影子大师和影子战士设置为xx,则它们的顺序动作也将使用MonStats.txt中定义的动画
+ l. i( X6 c, T: ]
, v$ y; `' \# G3 `8 }SeqNum:这里是该技能使用的角色动画播放顺序的ID,前提是Anim列值为SQ;与怪物顺序动作不同,角色的顺序动作仍旧定义在D2Common.dll中的硬代码表内;以下是这些顺序动作ID(每个顺序动作都有其匹配的角色类型,但有些可匹配多个角色类型):& Q, [% _, t/ [$ i$ e4 h
0 = 无顺序动作(使用此ID则施展技能的动画将在进行到一半时出现错误)
) |, ]0 D* X L0 U5 T1 = 为戳刺技能使用
3 a* y) s g: f7 ^; W' c2 = 一个比较简单的顺序动作,起初用于牺牲(某些武器上会闪现光芒); V, h" B# C1 T; N3 m
3 = 未使用的顺序动作(直接使用施展动画)
[9 d- x" a# Z4 = 为冲锋技能使用
5 S* b) Z5 G2 x8 [5 = 未使用的顺序动作(以前被用于用剑的圣骑士)
& h8 T- Q2 w Z6 ^6 = 为地狱火技能使用1 v" W# }8 I) y
7 =未使用的顺序动作(直接使用施展动画)5 I" M8 b; K+ _3 ]! a2 v4 j# [) P
8 = 为刺爆技能使用2 O, U; R' z, `, |
9 = 一个简单的顺序动作,起初用于击退技能(有些故障)
( ^9 I* O# s7 X10 = 用于旋风技能) r9 S/ j8 I# I$ g" |: ?
11 = 用于双手挥舞技能
- Z# U- D* {; g o. R- e) o$ _12 = 与6相同,用于闪电/连锁闪电技能8 q. } x: E8 m- |# w
13 = 用于跳跃技能
5 b5 G' f6 F( B# R+ j; ]8 T1 P14 = 用于跳跃攻击技能
8 C+ Y# E2 k8 O7 [3 v' ]5 ]2 m: |15 = 用于双手投掷技能
% y) N8 i$ k' g* K C16 = 用于双爪攻击
* w5 p- F Q. c7 ?2 [17 = 未用到的一个刺客顺序动作% D' W* T( f: Y# @6 ` Q
18 = 用于极地风暴技能' }0 ]5 U* k. a1 K' }7 {
19 = 未用到,起初用于龙爪技能. p; [: A. v; m# }0 Y2 c8 b
20 = 未用到的一个刺客顺序动作0 ^# x4 H6 w& }4 G5 o+ X
21 = 用于飞龙在天技能. h$ b" Z6 K/ H$ l" F' U. _
22 = 未用到,起初用于各种变形技能0 W8 }$ S: s( O' [
23 = 用于刃之怒技能
, E4 a5 I7 }7 }- h编号为24以上的顺序动作仅出现在DLL文件中(事实上已证实的顺序动作编号已达到41,并且还可能有更多)
% q! l2 e' N) O/ F$ e$ q* ?$ m
- X) q3 q1 D- z5 \' \SeqInput:这列用于调整顺序动作循环时的间隔时间,一个例子:地狱火技能此处设置为100将使游戏在两个地狱火放出的间隙暂停;它的单位看起来像是毫秒而不是桢,这里的数值过小将使游戏顺序动画播放时跳过一些桢(仅客户端)
9 e- R' [; A0 Y# [4 _& E' J7 K1 }, b
Durability:未知布尔函数(它不能调整某技能的持续时间,应该与顺序动作有关,因此为了确保安全请不要随意修改此值)
5 X, D7 [$ X9 r2 E7 d8 C$ f6 r2 ^UseAttackRate:未知布尔函数(与动作速率并无关连,在游戏中也不起任何作用,目前看来更像是以前版本的残留参数)' z* r5 H) L; p% a
* \8 G, ^* x" \+ O7 V一些关于瞄准敌人的设置2 ?" ~ c( x; K
看起来以下这些列的含义非常直接非常有用,但很遗憾,事实上不是这样的;某技能何时以何单位作为攻击目标主要取决于其技能函数,而这里的这些参数只是次要选项
3 M4 W3 F3 e% y7 g
+ ?8 r# |' D. U; j2 ELineOfSight:这里看起来是个二进制标志选项,但游戏仅仅用到了一个位:100;它控制着该技能是否可以在角色视野所及的地方施展,而不受地形限制;举例而言,对于某召唤技能,这里设置为4(100)则意味着你无法隔墙召唤某生物,如果设置为空则不可以- R, [, W7 T& s O: O r
1 G- S: y1 _) h, j/ r7 ?, C
TargetAbleOnly:未知布尔函数,坦白的说这个值似乎是无用的8 H* ~; e6 @, T8 M: W. N4 _! F2 X
SearchEnemyXY:未知布尔函数,此值经常与前一列值取逻辑与,看起来也似乎没什么用. A9 ]% n" [2 d3 ]
* Y C; U; e2 j! XSearchEnemyNear:布尔函数,用于控制该技能是否可以自动找寻目标(按下Shift+鼠标左键,然后你的角色就可以不停的自动杀人直到你松手……并且该技能对于尸体相关技能也会自动寻找尸体来施展……);这个值可以对任何技能起作用,所以请不要滥用,否则它将使D2变得太简单太简单,一进游戏你甚至用不着瞄准,只要随便按下鼠标然后……% B4 ]4 H( G, S* ~
: v7 a: L' X* Z& t+ \: e" o
SearchOpenXY:布尔函数,当设定为1时,该技能将以地图上的空白处作为其打击目标(具体打击何处当然要取决于该技能产生的效果半径,如火墙、陨石、暴风雪);系统认为两个单位不能同占一块地图(飞射物也是单位的一种),因此如果某种此值为1的技能效果在某个已被占用的地图块上产生,则游戏将不显示其效果,另外如果释放该类型技能的地方没有空白地图块,则此次技能施展也将失败5 k, I- w& s' z& s& q; }& Y0 E% {
! H/ v C% {8 Q' t9 Z2 O$ n7 Z8 NSelectProc:该列与下一列共同作用,用以控制你可以利用何种尸体,有6种不同选项:
; w! d+ M, F; @ P2 q1 j1 = 为尸体爆炸技能所使用
7 o6 H; Q H/ q+ b4 w2 = 用于召唤骷髅和召唤骷髅法师
# e1 l3 R: t5 l. w7 l5 R0 W. |: J3 = 用于复活( b5 p0 K# h% n* z) u' J$ l, C5 r6 r4 d
4 = 用于寻找药剂
. G1 j: J1 ~2 A0 v7 A; V2 U1 a5 = 用于寻找物品9 d+ X7 R B5 y3 c: [4 K- _
6 = 用于残酷吓阻
- s3 P# a# q& ?该值功能并不完全,有其硬代码规定的内容,例如将复活的该值改成1,则仅能使金怪的尸体显示高亮,但不能施展复活技能
# m# G- l3 R, N6 j$ r8 \* p5 S9 O+ N3 D
TargetCorpse:布尔函数,用于控制该技能是否可通过点击尸体而施放(并不控制技能效果是否对尸体起作用,而只是控制鼠标点在尸体上即可施放该技能,如同指在怪物身上那样;想要其对尸体产生某些效果请编辑其技能实现函数)
4 g+ j4 ~$ M6 HTargetPet:布尔函数,控制该技能是否可通过点击召唤物或者雇佣兵而施放(并不控制技能效果是否对雇佣兵或召唤物起作用,而只是控制鼠标点在雇佣兵或召唤物身上即可施放该技能,如同指在怪物身上那样;想要其对尸体产生某些效果请编辑其技能实现函数)
: X" c1 _5 _2 s6 `! P, ?TargetAlly:布尔函数,控制该技能是否可以通过点击其它玩家而施放(并不控制技能效果是否对其他玩家起作用,而只是控制鼠标点在其他玩家身上即可施放该技能,如同指在怪物身上那样;想要其对尸体产生某些效果请编辑其技能实现函数)% K! G1 Z+ E7 l7 v) g
TargetItem:布尔函数,控制该技能是否可以通过点击地上的物品而施放(并不控制技能效果是否对地上的物品起作用,而只是控制鼠标点在地上的物品上即可施放该技能,如同指在怪物身上那样;想要其对尸体产生某些效果请编辑其技能实现函数)
2 j% e) ?# G& H
: b; Z/ x" r: {+ Z. LTgtPlaceCheck:布尔函数,用于复活怪物的技能,但目前不清楚其具体用途
9 f' _/ j0 L/ w& W1 p9 i. H# T- K5 d$ b: N% s2 v
杂项设置II
% H" z5 n- [3 a4 I' S6 E. k% X2 EAttackNoMana:布尔函数,当该角色施展该技能时突然没法力的情况下是否能够以一次普通攻击来代替之,1 = 是,0 = 否
$ H4 b, ]. E5 x# T* Q3 V1 Q* H* H% M. D
与物品事件相关联的一些技能设定2 C8 ]; c4 Q) W' n3 R: Y% z
以下列的参数仅当物品上的CTC(Chance To Cast)事件函数引发该技能时,用以决定该技能效果的作用规则;这些参数不会影响到正常施展的技能效果;但是,它们之间的区别非常小以至于几乎看不出,所以该部分内容仅作参考(已验证一部分)
/ l- F4 e" g! V- v. l2 q. _8 PItemEffect:服务器端的引发函数,这里控制当该技能被CTC属性触发时所调用的函数;留空意味着不调用任何函数,并且该技能也将不会被施展;一般来说这里的值最好取1,但有两种特殊情况,这里取36时将使该技能由敌方发出而不是物品装备者,另外这里还可以取151
% w7 f+ b& x. G1 ?7 TItemCltEffect:客户端引发函数,用以提供前一列所说到的CTC属性触发函数,这里以10和96分别匹配前一列的36和151函数8 B0 {/ M# c* E% s% K
+ E% Y7 P& c! w1 G9 l
ItemTgtDo:未知参数) W* \+ _* Y* _$ y
ItemTarget:选择函数,功能不明,似乎是某种技能目标选择机制:默认为0,但有些特殊的目标选择函数会用到这个值;1被用于强化技能,可以为友军施展;2被用于传送,用于选择某随机的空白地图块;3用于尸体爆炸等技能,类似选择尸体;4用于自动追踪类飞射物,如白骨之魂和天堂之拳' ^) @$ S9 q3 S3 \* V
! [. r( [) x& g8 rItemCheckStart:未知布尔函数(仅有九头海蛇和骨牢的此列为1,其余均为0,貌似是在发生函数运行前进行某种检测)
+ n0 {- | [, W9 O$ K& BItemCltCheckStart:未知布尔函数(貌似与上一列的功能相近,仅有两种尸体爆炸技能的此列为1,用于检测发生函数运行是否成功,从而绘制相应的图样,以防止技能运行不成功但出现些不合理的图像): P% z& M' `0 ~
7 ]$ s# m x1 f* ~+ g: Y
ItemCastSound:当技能被物品事件触发时,游戏所播放的声音,以区别于普通技能施放的音效,该列值引自Sounds.txt中的ID指针/ p, Z- Y5 `% N7 O- A9 ^8 N2 T
ItemCastOverlay:当技能被物品触发时,游戏所显示的修饰图像,以区别于普通技能的修饰图像,该列值引自Overlays.txt中的ID指针! I2 z, P' ~2 n5 @* d, J
* C: X h. a, `, p: z一些技能点数设置和技能需求等级设置6 V! M) C- b) D% H6 {
SkPoints:此列用以说明每升一级该技能需要多少技能点数,支持数值或表达式
# m6 c# L1 l' P/ ]" H8 J4 n+ w2 K7 O( o; q+ W
ReqLevel:将点数投资到该技能所需的最小人物等级$ S: T: l9 h5 L4 [, }) }
MaxLvl:该技能可通过投资技能点数所达到的最高等级(技能的实际最高等级(包括物品加成等效果)将由Experience.txt中的MaxLevel列控制,亦即实际最高等级等于人物等级)
7 H( {" t' _$ |8 M Z$ `. O9 k% m8 g- s1 Y
ReqStr:将点数投资到该技能(仅限制第一个投资到该技能的技能点)所需角色的力量值,该功能始终有效,但不显示在游戏界面中
7 H0 U1 d0 j/ D3 b8 i2 ?% F- tReqDex:将点数投资到该技能(仅限制第一个投资到该技能的技能点)所需角色的敏捷值,该功能始终有效,但不显示在游戏界面中
3 U- U% T% ]( g6 \ReqInt:将点数投资到该技能(仅限制第一个投资到该技能的技能点)所需角色的精力值,该功能始终有效,但不显示在游戏界面中% U* C: r5 }8 A! O) J
ReqVit:将点数投资到该技能(仅限制第一个投资到该技能的技能点)所需角色的体力值,该功能始终有效,但不显示在游戏界面中
3 ^" l9 U% i% q6 a
% U- E0 F8 _" a& A1 H! f; qReqSkill1-3:这三列表示要投资该技能所必须先投资的几个前提技能,这里的值即为各前提技能的ID指针(Name列值) h/ R4 S: Z" v0 N3 O. |/ g
4 ]. {4 n+ c, H$ v- x* d, E' j
与状态有关的一些限制
5 E$ `) c U- `8 L4 QRestrict:选择函数,用以控制何种状态下该技能可用:0 = 仅可用于人形态,1 = 可用于变形状态和人形态,2 = 仅可用于后面三列所规定的状态下
8 {3 Q: w- s, h4 j9 c8 _" Z$ |
) u Z8 a8 y, r% o1 ?) O+ A$ wState1-3:此列控制该技能将受到何种状态的限制,当且仅当前一列值为2时有意义,这里的值引自States.txt中的ID指针
7 @3 H3 [2 s: W( `8 }7 q) t9 w3 a, X! S+ q
技能延迟设置
- R# ?: A' ?9 \4 H1 L, FDelay:该列支持数值或表达式,用于控制角色使用该技能之后有多少桢的技能延迟,此外该列还决定了在技能延迟状态下有哪些技能是不可用的:此列值不为0的技能均无法在技能延迟状态下使用;一般来说技能延迟状态始于该技能动画开始的那一桢,但如果技能在施放过程中被别人的攻击打断,则技能延迟计数器将重置0 U; J7 d- z: b( \$ \8 A6 ^: f
* t; o: m9 L5 t5 y% z! s
杂项设置III% G' V" W6 `' ^
LeftSkill:布尔函数,控制该技能能否出现在左手的技能菜单中(有些技能是无论如何设置都无法出现在左手技能菜单中的,特别是各种灵气;此类的还有各种诅咒和召唤技能) | S& Q% Y& V0 N4 {( O
! D+ d9 w$ C$ O% V5 j
RePeat:不明布尔函数,该函数与一些技能共同作用,用于重复调用其技能终止函数,直到玩家松开鼠标按钮(例如地狱火技能);但不能确认该值对于函数的具体影响
) I3 A+ F: R& D. m
) o- B6 ~9 i6 W. k' j$ hCheckFunc:该值包含一些ID值,以调用一个特殊列表中的函数,但其真实目的未知(看起来像是当技能主函数运行结束时调用的一些额外函数:1 = 所有使用弹药的技能,2 = 投掷(不包括亚马逊的标枪技能),3 =左手投掷,4 = 左手攻击,5 = 各种卷轴和书技能,6 = 双手投掷,以上,貌似是多人游戏中用来刷新某物品的数量)
4 [( b( m7 r7 e6 j1 R) k; ?' v2 h
. m' C- z8 I$ w4 E2 s" H关于法力需求的一些设置
2 ~6 `9 z% _, Y( b$ g这部分内容包含了各技能的法力需求,以及各技能如何消耗法力;为了不使这些解释变得复杂,这里给出一个各技能耗费法力值的公式,代入各列值进去就得到最终的结果;要知道各个值的具体含义以及公式中EffectiveShift的值请看以下的引导文件内容' s4 o2 l$ M- h% o/ m, R
法力耗费公式:$ v5 a$ S0 O) u& q
法力耗费 = max((Mana + LvlMana * (技能等级 - 1))* EffectiveShift,MinMana)
$ c/ b" R$ ]& q# u% H2 }. N$ i% A2 W/ f4 B) J& d% m/ m
NoCostInstate:布尔函数,与前面一些状态限制列有关,控制角色处于变形状态时使用该技能是否无需法力值,例如用于德鲁伊处于狼/熊形态时变回人形,而不需要耗费法力& Q7 P1 z. K- B
# G6 F- |2 ^# Z6 S* BUseManaOndo:布尔函数,用于控制该技能是否实时消耗法力,通常这个值是无用的,但:假如使地狱火技能的该值为1,那么点击鼠标时将会耗费一些法力,此后即使一直按住鼠标施放地狱火,也不会使法力减少,直到最后把鼠标拿开时,技能终止函数运行完毕,于是本该在施展时就耗费的所有法力现在一下子就掉光了……
: y! e1 Y. }9 U# r m4 c$ p8 B" z6 Z! F0 L. l5 l
StartMana:施展该技能所需的法力最小值;角色的法力值小于此时其技能图标将始终显示为红色,但该值与角色施展该技能所需的法力值无关
4 L" i C6 k) i
' M! m' E8 n6 C- k. |3 A; n) uMinMana:施展技能所耗费的最小法力值;这主要用于某些随技能等级升高法力耗费减少的技能,以免施展该技能所耗费的法力过少
% s2 C0 J7 w. G. F, x0 Y4 }6 `9 O9 h$ g2 J% T0 g; N }. h
ManaShift:该列控制该技能的法力耗费值计算精度(亦即计算单位),法力耗费值最大精度可以达到1/256(因为法力值在程序代码中也以1/256为存储单位);内部代码中这只是一个简单的移位运算,但是为了不至于描述过于复杂,这里列出了一份表格,用以列举ManaShift值与EffectiveShift值之间的转换关系,同时也便于理解7 u% M1 u: [( ^
ManaShift EffectiveShift
5 q+ j, p- d$ N! T4 t0 1/256 = 0.0039025* l/ k6 |1 n; n3 i- ^
1 2/256 = 0.00781250. P3 j) ]% L( @( }
2 4/256 = 0.01562500
) l. h. f# s; \: Q/ p3 8/256 = 0.0312500" u1 \: _8 p) I) O1 a- G
4 16/256 = 0.062500
: `- }$ h, d) N5 32/256 = 0.12500) s+ k) ~2 t, L0 d" M* P9 P
6 64/256 = 0.2500
% w0 F( A7 D) J: E/ z1 E1 K% S0 g J) {7 128/256 = 0.500
3 K, ] J2 c# v5 X0 `9 m0 K8 256/256 = 1.008 P" z& M: i- }* I
9 512/256 = 2.00$ O- A; g+ k# r! ^8 m! \" `
10 1024/256 = 4.00
+ `8 v4 x; d" h% w1 {6 p6 }2 T' i# w- H- ~7 `: L, w
Mana:技能在等级为1时所耗费的法力值,需要乘以EffectiveShift值才是真实值
( s3 l: [9 J' m" I5 K
2 E5 P/ T) E# t# b+ |6 PLvlMana:技能每升一级耗费的法力值增量,需要乘以EffectiveShift值才是真实值
! J2 \7 F$ t1 Q5 Q& a5 r7 r% {% \: @1 @% a! g( l* h* j
一些杂项设置IV3 J* a. h. l7 k4 ^1 x2 B: D
Interrupt:布尔函数,用于控制当角色在施展某技能过程中受到攻击时,是否会中断此技能,亦即该技能是否为不可中断技能
; s( }/ i1 u& S) [: S& {0 a& {! t
7 C$ F$ w% I! u- n+ e! O k2 jInTown:布尔函数,用于控制该技能是否可以在城镇中施展;但在城镇中技能的伤害是不被计算的,并且技能也不会放出任何飞射物,因此仅用于某些非攻击性技能(注意光环类技能此处必须设置为1,否则游戏将出错) E$ v. w, H- l/ H
/ Z6 z; J* M4 `) D" c0 K. KAura:布尔函数,判断该技能是否光环技能;这里控制技能按钮的颜色,光环类技能按钮的底色是金色的,该列还将引用PerDelay列的值1 W+ r# r) N* z9 K+ a+ b) u
- R( S2 w: I9 I+ }7 i+ A: [, iPeriodic:布尔函数,判断该技能是否周期性技能;与上一列作用相仿,会引用PerDelay列的值以决定该周期性技能的运转周期;则在该技能状态的持续时间内,每隔PerDelay所规定的时间该技能函数就会运行一次;目前该函数用于刀刃之盾和雷云风暴技能
q& a: l3 F8 w% U+ Q7 h
! b X. i% X( i6 P+ {PreDelay:此处支持数值或表达式,控制光环技能或者周期性技能所使用的时间间隔;对于光环技能,每隔这段时间后都会对范围内的其它单位重新赋予一次;对于周期性技能,每隔这段时间之后都会重新运行一遍该技能的代码;此处的值以桢为单位
1 v/ s' D2 N! V9 X% m$ z' @0 Z+ y6 M5 ` W- P7 k: g
Finishing:布尔函数,控制该技能是否可作为聚气技能的最后一击技能,如果将某聚气技能的该值设定为1,则该聚气技能将无法施展
7 s, j" ] K/ g' d/ O; w$ a# g+ p( d6 q$ f* i ]' J' S- s: c
Passive:布尔函数,控制该技能是否是一个被动技能(从而应用前面定义于被动技能列中的相关内容),被动技能图标不会出现在左手或右手的技能菜单中. T9 f9 r6 Q! O# [( t
0 H+ c" a0 ~) L/ W: C
Progressive:布尔函数,控制该技能是否是一个聚气技能,若将某聚气技能的该值设为0则该技能将无效(聚气效果将在出现后立即消失)
! I1 B6 x$ Y5 W" I. ?* V8 n l; V
: M( E% Z" u1 o9 hGeneral:未知布尔函数(仅用于通过CharStats.txt文件规定的几个技能,但在游戏中什么效果也没有)7 }; H' o* y/ H. q
/ h. G; N" B: ]: q$ [& X$ t
Scroll:未知布尔函数(仅用于Books.txt文件中引用的几个技能,但在游戏中无实际效果)) q0 J3 S% R+ H7 A* r6 Y ]! D4 ]
* ^1 T" |2 l3 |- K" S: v! R服务器端技能计算及其参数
3 f6 ] H' D! x) X! m1 K, i8 uCalc1-Calc4:这些列控制着服务器端技能函数所直接调用的计算式,其功能是通用的,计算结果将被应用于最终技能函数效果的实现;如果该技能指定发射一些飞射物的话,其函数也会用到这里的计算式;这里支持数值和表达式
; Q C5 g/ O4 e0 N7 T+ D
6 `, l! A0 P9 sParam1-Param8:这些是需要直接传递给技能函数的特殊参量,或者是在SkillDesc.txt文件以及这里的计算式中所要用到的参量;这里仅支持数值8 P$ g k6 a* T$ M+ q5 c. p
. l+ k3 q% y+ L5 g
杂项设置V) d) S. z/ \' y3 }- Z
InGame:布尔函数,控制该技能是否允许出现在游戏中,0 = 游戏中不会出现该技能0 ~1 A3 P4 w$ \) b' W
5 G. y, R& d! l; s5 @攻击准确率的相关设置/ P }" k+ \5 o Q8 n
这部分内容将对各技能提供一些攻击准确率加成,但这里有Bug——所有对飞射攻击的准确率加成都无效,特别是对所有的弓箭类技能;这部分对准确率的加成按百分比计算而非数值
* Y% V. D1 ~- pToHit:该技能1级时对准确率加成的百分比1 X. f( \! w5 n$ S
) [3 |3 D. E/ B
LevToHit:每升一级,该技能对准确率加成的百分比增量
, f% \, {* \. ]% Q, ]" c2 \0 X
9 T$ s7 t: k8 j6 _4 ZToHitCalc:这里支持数值或表达式,用于最终计算该技能对准确率的百分比加成;当此列的数值不留空(不等于0)时前两列的值将被游戏无视,单看该数值/ K' ]) h& r4 t/ x, X( V! u
$ ^) i' R: Q) Z, e一些特殊攻击方式的设定3 p+ x E" @9 {3 [
这部分内容除HitClass列之外依旧很神秘,它们用于为每次该技能成功的攻击附加一些特殊的事件8 O! d9 p C$ G/ p
ResultFlags:二进制选择函数,用于该技能每次成功击中敌人后,控制一些特殊事件的产生;以下是两张参考表格,一张表示各个技能在此处的值,另一张表示各个二进制位所代表的内容;以下表格中的值均为二进制,请自行进行二进制/十进制的转换& S l! i5 @4 Y7 ?( v
技能列表:
# n: {4 i% Z3 V9 i) H. l8 q: \: l" G000000000000100 – 用于因碰撞而破坏掉的飞射物+ S$ d: d7 d# c' G( [5 z5 t0 ^
000000000000101 – 用于心灵传动、Diablo冲锋、投掷药瓶
1 x8 j% s7 |" h S3 A100000000000001 – 用于钢铁石魔、圣火、神圣冰冻、神圣冲击* I, ]' P$ w4 ?# ~1 Z; d
000000000001000 – 用于盾击、重击、灰熊盾击、跳跃击退以及Radament Holyboly技能, j: F3 q9 d" C: ]( T( ~* @
000000000001001 – 用于心灵爆震、地狱陨石碰撞(火焰之河场景掉落的陨石)6 i& e2 j( z& p- c4 X
000000000010001 – 用于庇护所
7 I; s3 r! T" o' ?" k/ b# n8 T9 O6 M000000000000001 – 用于狂犬病、飓风、攻城兽的践踏技能
5 i- |6 g4 X; W f/ P. X& A) N- g000000000100000 – 用于刀刃之盾技能5 D- v/ D5 V' r) [8 ~5 Y8 ]
二进制位列表:
; Q8 l. t8 r( \9 k000000000000001 = 1 – 未知
6 R0 N& M3 _0 @6 `) {000000000000010 = 2 – 未知' h8 _$ I1 R# i+ Y0 I& T
000000000000100 = 4 – 未知
! ^# }5 B2 c( M n/ b: p# R. o: U000000000001000 = 8 – 击退
# T! r3 j5 x" W( r4 w000000000010000 = 16 – 无接触情况下伤害敌人,也许忽视目标防御' Q# @# H, u, K8 r
000000000100000 = 32 – 未知! c. ?0 g0 f" J' h. O7 x
000000001000000 = 64 – 未知6 T! |( b. E0 J" j& P6 I
000000010000000 = 128 – 未知+ L" B! U* k5 ~6 j, {2 ]+ Y" J, c
000000100000000 = 256 – 本次攻击不造成伤害
- U6 f% s C, |: {000001000000000 = 512 – 如上+ n3 T. S5 e/ |0 u: E9 ~
000010000000000 = 1024 – 未知! ~' F" t% {: Q8 _; E
000100000000000 = 2048 – 未知
% A3 F+ h( B$ n& H" b; W001000000000000 = 4096 – 未知: D& ]! g' c$ {7 b( R
010000000000000 = 8192 – 未知3 m, `/ V* B9 p# T+ a8 {
100000000000000 = 16384 – 未知" L5 L3 W3 W: I6 {, W1 Y: N
- _* }6 c0 l1 k7 s- K7 V3 V3 u5 f
HitFlags:二进制选择函数,但其功能未知:* N4 C9 f+ Q4 X5 j( I1 X6 ?7 ^: Q
10 - 心灵传动,狂犬病,飓风以及其它在其爆炸范围内造成伤害的飞射物3 `5 x" u' J3 C3 c" {4 f8 n
4 h1 E8 V0 N+ U! ^# v4 ?
HitClass:攻击类型,控制当该技能成功命中敌人时所播放的声音,以下是一些已知的HitClass值:5 |) Q3 y0 j0 [. [' v$ A" z: w
2 – 飞斧类音效: F3 M$ T. s% a, }4 U% x, W
3 – 刀刃之盾音效3 E m3 \9 o, A
6 – 标枪撞击音效
, F5 S9 l" r2 x7 O3 D8 l* y10 – 箭矢撞击音效7 | K$ a) q' ^9 R. x q
32 – 火焰烧焦音效1 k8 X/ F; ^$ K
48 – 冰冻音效
1 `7 P* x. n/ g* F2 M$ W4 b64 – 闪电打击音效$ Y& K- b- p8 L9 {
80 – 被毒素(瓦斯药剂)击中音效0 K; B3 k1 j+ Y1 k5 ?2 I5 C% L
96 – 击晕音效+ F' A/ v. d0 x$ D/ B0 l+ f2 p
109 – 心灵传动音效; q* u" x& b7 a- P# |) D( b
112 – 重击音效& ~& h* l7 A) m# k
141 – 攻击者收到反伤害音效; U- k! i2 c- x3 q2 B, j. F5 z
157 – 庇护所音效" ?- \% g' ~, ?6 K2 M2 w: X. H
176 – 普通毒素音效! `: U0 C1 `( e
, o! h% Z* G6 `9 ]
杂项设置VI: q% ~& P3 E: N; {+ K
Kick:布尔函数,作用未知(看起来像是调用踢击动画的技能设置,但对其它技能均无效)
, F' u; W; f9 ~1 R3 N7 W# F9 v- B( j$ W# F
一些与伤害有关的设置
" }; c1 ] ^9 X; E5 ^以下内容表明该技能如何造成伤害,许多技能也会用到前面的Calc列中的计算式来计算其本身的加成伤害值;下面是一个比较精确的计算公式,用以计算该技能所造成的伤害值;公式中EffectiveShift的值请阅读下面的文件引导内容
x* @0 ~* s/ e& D# n: J伤害计算公式:* e" m- D+ F/ k# y
MinDamage = ((BaseDamage * SrcDamage / 128) + (MinDam * EffectiveShift * (100 + DmgSymPerCalc) / 100)) * (100 + EnhancerStat) / 100, C: k w/ L, o% d$ ^
MaxDamage = ((BaseDamage * SrcDamage / 128) + (MaxDam * EffectiveShift * (100 + DmgSymPerCalc) / 100)) * (100 + EnhancerStat) / 100
: ~+ |. V, W5 ?0 G) m& f! K8 s/ a0 O* v. ]" C1 N
其中
1 n# z4 S9 q4 ^' @$ EBaseDamage是已经被该技能在前面Calc列中加成过的伤害值(元素伤害和物理伤害以及其它伤害类型请分别代入整个公式计算,而不要混为一谈)
* Y$ e9 a! I8 r2 d1 {0 J* E! bSkillDamage是所有由技能提供的非武器伤害加成值4 _8 {7 F( B' s9 J- c) N! T$ U
EnhancerStat是可以总体提升该伤害类型的属性(例如增加X%火焰伤害属性)9 V+ w4 s6 k* Z' J p3 g
+ L& Z0 E h! A) R; X# ?
HitShift:该技能提供的非武器伤害加成精度(单位),伤害值最小基准单位为1/256(因为生命值最小基准单位也是1/256);内部代码中这只是一个简单的移位运算,但是为了不至于描述过于复杂,这里列出了一份表格,用以列举HitShift值与EffectiveShift值之间的转换关系,同时也便于理解/ l: R1 i6 ]& o* M3 E+ Z
HitShift EffectiveShift
$ |1 n0 h2 F( R; [0 1/256 = 0.0039025& d, @9 N5 X8 D. W
1 2/256 = 0.00781250
( s, d1 ^+ U" E: P/ T& E% F$ F2 4/256 = 0.01562500
! p+ e6 {. e) F4 }/ k# {# c3 8/256 = 0.0312500
/ W5 t1 S: l# \2 f9 v( g3 ~7 p. q4 16/256 = 0.062500+ `# L6 ?: h. T1 m. a
5 32/256 = 0.12500
/ O% H( l$ | ?$ y6 64/256 = 0.2500: m' A h3 Z9 L. A" _7 R6 ~
7 128/256 = 0.500( R# T$ n3 L! ^. D( X9 R8 X
8 256/256 = 1.00" C6 Y+ s5 \. r6 `) E9 X% |0 u% a; r
9 512/256 = 2.00
7 e8 q7 _7 O7 V `/ z S10 1024/256 = 4.00
0 d2 }& e% B+ K4 {" |% G) m! d
4 z& l- E0 z+ [/ r- n; m5 ^; j) \SrcDamage:此列控制多少百分比的武器伤害将转化给技能,这里允许的最大值为128,128代表100%武器伤害转化给技能,96代表75%,64%代表50%,依此类推;一个例子:普通攻击伤害为1000-3000的角色,如果某技能此处值为66,则其使用技能的伤害值变为515-1547;这种惩罚应用于所有的伤害类型(也包括生命和法力偷取效果,因为它们也被当作是某种伤害类型看待),但各种伤害类型所受到的惩罚效果是区别对待的# g7 F( F5 s' m7 S7 f7 ~( E: w
& T7 b* h5 r. r2 r4 p
MinDam,MaxDam:该技能1级时给予角色的最小/最大物理伤害值增量,游戏是否加载这个参数取决于其技能函数的实现方式,不过大多数技能函数都会加载. Z* Q p( R" u- G
& P O! y3 N& r2 j) [+ j
MinLevDam1-MinLevDam5,MaxLevDam1-MaxLevDam5:每升一级该技能的最小/最大物理伤害值增量,LevDam1用于技能等级在2-8级时,LevDam2用于9-16级,LevDam3用于17-22级,LevDam4用于23-28级,LevDam5用于用于29级及以上;游戏是否加载这个参数取决于其技能函数的实现方式,不过大多数技能函数都会加载
1 j2 C) T4 M# [6 U( e- }; f5 X+ u4 S1 p0 }$ Z0 E: V5 \
DmgSymPerCalc:该技能从其它协同加成技能(按百分比加成)中所获得的物理伤害加成,该值作用于SrcDamage惩罚之后;这列值支持数值或计算式 C1 U& D+ h* ?& o" |4 o
/ x" s2 O9 h) D& }0 J1 h4 a
EType:该技能所造成的元素伤害种类,此处值引自ElemTypes.txt中的ID指针;同时这个值还控制着该技能是否从+X火焰技能之类属性中受益' P0 h; b" d+ h+ h J* T5 E5 N
4 A4 H7 B% M! B7 W
EMin,EMax:该技能1级时给予角色的最小/最大元素伤害值增量,游戏是否加载这个参数取决于其技能函数的实现方式,不过大多数技能函数都会加载( H# |" V) I; \7 h. K" G
0 K6 T% p2 \% @9 U4 L [EMinLev-EMinLev5,EMaxLev1-EMaxLev5:每升一级该技能的最小/最大元素伤害值增量,Lev1用于技能等级在2-8级时,Lev2用于9-16级,Lev3用于17-22级,Lev4用于23-28级,Lev5用于用于29级及以上;游戏是否加载这个参数取决于其技能函数的实现方式,不过大多数技能函数都会加载
7 m( G+ r0 j* \0 x" p
/ P: B0 L+ ~3 ]9 C- G8 ?" A2 wEDmgSymPerCalc:该技能从其它协同加成技能(按百分比加成)中所获得的元素伤害加成,该值作用于SrcDamage惩罚之后;这列值支持数值或计算式
' n( [3 |9 n, A( n6 ~1 \/ W, x8 }8 w- O
ELen:假设该伤害类型有持续时间参数(击晕、毒素、火焰燃烧、冰冻等)的话,该列值即为该技能造成元素伤害的基础持续时间;这里的值以桢为单位;要注意的是火焰燃烧伤害并非火焰类型的伤害;游戏是否加载这个参数取决于其技能函数的实现方式,不过大多数技能函数都会加载
, ?! R; s Z* ?, n
! x, X" C; q) t0 E2 Z9 X; X: P$ @ELevLen1-ELevLen5:每升一级该技能伤害的最小/最大持续时间增量,LevLen1用于技能等级在2-8级时,LevLen2用于9-16级,LevLen3用于17-22级,LevLen4用于23-28级,LevLen5用于用于29级及以上;游戏是否加载这个参数取决于其技能函数的实现方式,不过大多数技能函数都会加载
1 ^/ ^+ A6 j+ c/ }& x9 S: H4 y1 T( V5 K, _; E! ~% a
ELenSymPerCalc:该技能从其它协同加成技能(按百分比加成)中所获得的持续时间加成,该值作用于SrcDamage惩罚之后;这列值支持数值或计算式
8 I8 E* \( z2 \1 _3 l& l1 z( W+ j5 ?. `" b. h$ b
AI相关设置% w8 n. O1 ]5 T6 X( R, ^' _; L6 z
AIType:该技能如何被影子大师及影子战士所使用,以及如何被第三幕的雇佣兵所使用,包括法师的寒冰装甲等* L6 y; {5 y* u3 V: P% ]& i# Y8 @
AIBonus:此处增加了影子大师的AI中使用该技能的可能性- \( U. v9 J* U, U. m. m1 f% v) O
- b! ?- D, Z' J) _/ p ?
物品价格相关设置
4 ~& o" [ J, R4 KCostMult:此处控制其上出现+X该技能属性的物品价格的乘数,这里可填写最大值是1024,过大的值将被系统无视
8 E B& a: `1 y: v3 ICostAdd:此处控制其上出现+X该技能属性的物品价格的增量
! @ J6 d9 J, S. y/ L2 S |
|