|
0 X d6 S" F" T
游戏内部文字显示
5 p3 A0 u0 B# R4 g6 g) E2 P7 L0 a4 k! E
Diablo2是面向全球玩家发行的,但是由于使用语种的不同,会导致很多玩家对于英文版的D2玩的痛苦不已并且还是一头水雾.这就造成了玩家的流失,为了使不同语种的玩家都可以享受到D2的魅力,暴雪制作了不同语言版本的D2(比如德语,葡萄牙语),而实现这一关键靠的就是TBL文件.& M$ w4 h" d; u* J# ^& ]' u
( V8 t* M- g: b# \0 A
TBL文件的作用就是对游戏的角色,装备,怪物,技能,任务等等方面的描述和翻译.描述,就是指的各种介绍性文字了,比如技能的名称和作用;装备的需求和属性;任务的引导和奖励;以及各个NPC的开场白.至于翻译,就是靠着不同的TBL文件,将以上这些描述性文字转换成其他语言的介绍,以便各国的玩家都可以在短时间内快速熟悉和上手,消除语言上带来的隔阂.: h. |) K. }& {9 B4 {) g
* W) i. r& y M1 r4 ^, f7 z+ T9 f+ Gtbl文件究竟是如何运作的呢,下面分2个部分来介绍.; F/ O6 p( z5 |3 H2 g8 R+ ~ `
3 z- ~2 E+ \" g* O8 `# }
一 TBL文件的组成结构+ t5 I# \) d3 F8 ?
以string.tbl文件为例,它有四个主要的组成部分:4 S, A0 `4 s) u: v' c
1.标题,这部分有21个字节的长度.
5 A; `; k7 c+ }% R0 T3 U2.每项包含2字节的数组,这是下一个表的索引,它的作用是按编号查找字符串.7 [: B% S8 u% g& L$ b6 v. l
3.hash值,每项包含17个字节,是关键的指针和有价值的字符串.字符串的排列顺序由hash值决定.它可- O9 `4 F- m! q
以通过关键值来查找字符串.
; y) B$ g& }0 R: k8 J! V7 I4.各自的实际字符串.
6 A* ?5 f' S" ^6 m! Y1 B9 v- n; @. A* ]% H$ `/ O
二 TBL文件的调用方式
: z( t% n; W- I# H+ L; T7 S" D要调用TBL文件的描述性文字,首先字符串的大小写要严格对应,否则显示的往往是"一股邪恶力量".调用的关键性名称存在与各个txt文件里,以skill为例来看:! a+ k: K/ [ @. E
skillname### - 正如你所想的,技能的名称.; \* w/ J+ a: P
skillsd### - 简短描述,被用于鼠标左右键上的技能描述.
: U& X% a, I5 E7 ~4 m! D' wskillld### - 详细描述,被使用在技能栏里的较细致的描述.
7 A( f Y9 B2 N$ zskillan### - 属性栏里显示伤害部分使用的技能名称.
" p% q/ @6 R4 a; |/ FstrSkill### - 用来构建弹出窗口上显示的或长或短的效果描述.
6 m- O; M) g2 f+ }- b# L: o. b5 V
6 ?$ h) {: | E% \首先每个TBL文件都会被分配到一个指数模块.游戏由此确定使用哪种语言,并根据该语言来查找正确的TBL描述性文件.在此之后,string.tbl被首先读取,然后是patchstring.tbl,最后是expansionstring.tbl.
1 N, H! O4 Y) K8 G. w# C$ N* x7 e1 }9 W/ k
总体来看就是字符串的索引合并到一个大表,过程如下:$ q) _" U: t: P" Z7 {0 u
1.从string.tbl,分配索引值为0000h - 2709h(0到9999).预期不会出现重复的字符串值.' C- w- V) l g: q6 w; m1 [; e
z% @' j1 h" F# `% k) M2.从expansionstring.tbl,检查已经加载项的字符串值.和string.tbl中重复的字符串将改变到更优先级版本的字符串索引指针.任何不重复的字符串(这是其中的大多数)将被分配索引值4E20h - 752Fh(20,000至29999).3 @1 j0 V: N9 Y/ ?) g1 h4 F# L
2 R- @, h3 Q V; _0 M$ N S) @% C3.从patchstring.tbl,继续检查前2个TBL文件已经加载项的字符串值.重复的指标将改变到更优先级版本的字符串索引指针.任何不重复的字符串将被分配索引值2710h - 4E1Fh(10,000至19,999)。 j7 f- v6 x$ n( W. |
7 Q8 e. g2 }/ \
TBL文件优先级从小到大为string.tbl<expansionstring.tbl<patchstring.tbl |
|