进行游戏汉化最开始的工作就是分析游戏的文件格式,找出要汉化的部分在哪个文件里,文件结构是什么样子的,应该怎么修改。
) l. P' G9 l$ E# _% p' Y% _* S5 J7 t. L4 I0 F% j1 T( o
汉化游戏主要是要找出两种文件及对应的文件格式:
) o* X. [( g8 @
1 B5 m% H0 b0 E2 A' y1。游戏的字体文件 5 D$ K$ E$ S0 U: P( ]" @7 w) q8 }
J2 w0 U& \! b& A- t- s. k( V- e- ?2。游戏的英文脚本文件(就是游戏中的情节、对话部分)
0 L, y( h/ Q1 ]- w1 M. |# t& O
9 n' X0 B0 o8 Z3 I但是如何找,这却是一个难题。由于游戏厂商一般对自已出品的游戏文件格式都是不公开的,它们不希望玩家能随意修改游戏(这仅仅是一厢情愿罢了),很多骨灰级玩家还是能够找出游戏的文件结构,进而修改游戏。 " Q' P S) L/ c. M& H$ x
) h. G$ T) Q, B0 M ?这样看来,找出文件格式主要有两种方式: 1 P, [* Y3 p5 t9 a( A; t" Q
$ K' j" [, k# q. A' g
1. 搜索网上的资源,寻找骨灰级玩家,求得帮助。 ( h- g4 k$ ?3 B2 c, B, [
: L7 x2 R$ c' \# S0 E# G8 {" D& U4 Q2. 自己充当骨灰级玩家,分析出游戏文件的格式来,难度较大。 4 A- W4 f, C# z- F! d+ S7 N# H: d- M
( f( {+ A# m4 c. W9 ?
幸运的是Lucas公司的游戏Fans很多,甚至还成立了一个专门的网站LucasHacks(http://scumm.mixnmojo.com)用来讨论怎么修改其出品的各种游戏。我所需要的游戏文件格式的文档全是出自此网站,从而为汉化工作提供了极大的帮助,节省了很多时间,在此表示万分感谢,向那些撰写文档的前辈们致敬。
. D6 n R% C0 ]/ f7 E/ A) o) V
0 n7 \. k/ n4 ^: R6 V5 i/ |
- c( R ?9 _+ n, Q6 i2 M
* \1 r" L& Q" L# _. M7 r9 N下面针对GF开始介绍用到的几种游戏文件格式 ) Q+ d6 _0 }3 C: ^) v
" d# h. H% y& Q4 x- k4 g
1..tab文件格式
+ }5 H; d4 |9 c, x% ?0 o% ~* k6 ~. p8 `* b8 i' V
是存放游戏所有英文脚本的文件,文件内容是加密存储的,用一般文本编辑器打开是看不到任何可用信息。解密内容的方法是对文件所有字节与0xDD进行异或操作。
6 u! V" b3 P% m6 J) ?6 z以下是解密文件的源码(C#):
2 Y' R( m% P! l7 s( h4 J$ e
! I1 q; d7 J0 _' z+ [
; `) W+ P- J4 P5 m4 {+ H' `* X" ?$ d: ~
private void button1_Click(object sender, System.EventArgs e) 6 `3 ]# m0 t5 X0 q. F" I
{ a" r3 B3 F# `( x+ k
// Create the reader for data.
) V0 @9 d- h7 C. l. u FileStream fs = new FileStream("c:\\grim.tab", FileMode.Open, FileAccess.Read);
+ G. @1 h. H' G" J8 E5 C BinaryReader r = new BinaryReader(fs); , f- {# T- ?3 P1 q3 `( H2 g: @
( T. S9 ?% T" g" S
FileStream fs2 = new FileStream("c:\\text.txt", FileMode.Create); / S5 e% T0 F$ q
BinaryWriter w = new BinaryWriter(fs2);
8 [4 _3 @8 O% V5 |2 W fs.Position = 4; . T0 ]# ~: M1 s% U7 X
while(fs.Position < fs.Length) $ Q8 Y2 \' a: t& ^
{
& F M# f( ~2 c* j w.Write((byte)(r.ReadByte()^ 0xdd));
: q7 J$ g6 f3 w+ q9 U } 8 j0 u: q& n# a3 Q l
r.Close();
! L. Y' b$ y' l+ ?& L! O3 H( O o. Z w.Close();
6 P8 G! _2 X, s- ? fs.Close();
" T4 g! s9 N& w; r4 ?. l1 o7 _4 s fs2.Close(); % X# W; E. G5 \1 d2 V
7 ?/ a6 H# K7 E2 E; Z* f+ l
}
8 J) R/ K+ K* o9 Y
* r5 {# j4 i d' C解密后的文件内容就是一般的文本,可以看到所有游戏对话都在其中。下面节选文件内容的2段进行分析: 9 v) `+ d( I5 d
% E! O. w- F$ x2 N# N: j1 ~
; `2 n, W6 ~ W, l3 K4 m; G. o; [sito030 Oh yeah, yeah. Yeah. That is what I told him. 7 P% W, X# j0 c `* t
6 j$ z9 Y! ?$ E* A: K- e! @sito031 Are you kidding me?
# N/ q' z3 W4 {9 m9 n0 b& `" M9 ~8 M% s5 B1 Y7 L, L
sito032 gave him the idea in the first place!
0 T# M7 Z9 c" T: T1 i' i0 @! {" V/ F* }, J, S: t4 p
可以看出左边是说话人的名称标识,右边是说话的内容,分割这两者的是看似一个空格,其实是ASCII码表中的制表符Tab,16进制表示是0x09。
4 b3 m, X9 r" }* f
/ `& R) W+ F8 \$ D对游戏角本的汉化修改此文件的内容为中文就可以了,还有一点值得注意,修改完此文件后无需再对其反加密,只要将解密的文件保存成以前加密文件的文件名覆盖即可。应该是游戏运行时候会对文件是否加密进行判断
/ j9 P# s/ q0 | P& z8 L. `( O7 x m: t" x- b
2..lab文件格式 * f7 a5 O/ h, F6 p; [
" E+ }3 ^( F) z/ p& V" H* t4 Z( b是游戏的资源文件格式,游戏所有的资源声音、图片、动画、全存于此。它很类似于常用的压缩文件的格式,如zip、rar,作用是把很多文件压缩成一个文件,需要用的时候再解压出来供使用。Lab文件也是这个用途,它把很多用到的声音、动画等文件放到一个lab文件中,供需要时调用。Lab文件不对文件进行压缩,只是简单地把所有文件头尾相连,保存成一个文件而已。
" d0 |6 X/ O* Y- Q7 S. t ]+ f, a( K6 R& b2 v) L
Lab文件由文件头、文件偏移量表、文件名列表、文件物理存放块组成。以下内容选自LucasHacks的文档
8 X0 {, P9 d- F9 d& b, T |" ^8 h2 x
(1) 文件头
4 E1 V: x5 N" L+ n# `/ R7 `5 Y Y; y, Z5 s2 L1 I& L. B1 K
/ Z, o; {1 H( l
+ }) t- Y! H2 C字段 + ~. A* ~; }# W$ k$ E
数据长度 % E2 B- N* k& R+ g* V
描述 7 l( p) j- K$ ]# ]
7 o4 C4 m2 Z. C7 }
Id
4 C' z( z. s6 {4 c3 e4 q Long(4字节)
$ y& @9 J( z# e8 L 文件头标识LABN $ a% q9 `. W" X' G1 o: L' T$ z
6 Y6 ~* l0 \+ A4 w
Version
* c& U& d! b8 T9 x7 | Long(4字节)
+ W6 V. y9 b9 z1 s* m* U5 F 文件版本号
~, p5 K; x$ u: F9 r2 [ x
2 b. [% P) {! V( d+ ~" K UFiles , t! G8 ^, o: M0 S4 n8 p
Long(4字节) 3 x- N3 D* [7 C9 c( E4 o
此lab文件内包含资源文件的个数
% f+ P4 G7 q {
: ?2 s: {0 S L) da 4 a0 K/ C2 k4 d* Z5 Q& N
Long(4字节) " U: v4 P7 X7 a$ v# M% P3 X h, i {
未知
4 n% @( V& Y7 J+ ?6 C0 Q 1 A, y0 ]8 a: l1 s
b 0 r* j; o, k% v
Long(4字节) * c! K( A7 v; y4 p( y2 H8 F9 u
未知
* z' ^% ?) g9 l3 |+ P2 ]
( J: |( `/ c k8 Z* J2 P7 P0 y2 O' q, a' y4 [- j
(2) 文件偏移量表
# V* H4 O9 v( ?: M: p4 m5 U0 m2 {1 W. C
字段 * u" m# Y4 E, h" \2 \
数据长度
5 m H3 S; Y5 {' S* O 描述
. l; M- n- [! L$ k C0 f$ X2 v: y 4 o( ~2 _' `: ~; f" d
Ofs $ S3 K6 k6 ^+ h1 B9 W$ T" ^
Long(4字节) * C- x' k9 T- m7 c9 Z+ [- O
文件名偏移量,用来找到资源文件名称
* w1 @2 ]3 A" e. k6 d4 E* z1 b9 J
3 I' |6 _4 w) ?% ~8 n8 M4 h3 POffset ! C( K. m* ?9 b
Long(4字节) # W. |( {" O$ G5 w
文件偏移量,用来找到资源文件在lab文件中的相对位置
& ]( C; p9 m& z& s 3 @. D3 Y, m( P8 _
Size
5 g; n$ y4 J* W) T# j8 v0 A+ x1 `7 N Long(4字节) # c- | w. R3 | r
文件大小 9 u3 l: F5 O, G+ R) R
7 u2 _2 O% f6 C) _1 o+ O# C! lU ' r, H) Z* D0 Q* ]" n& q$ W- p, s
Long(4字节) ! o- `& u; n4 k- L
总是0 1 y( J" [+ f9 k6 R' |( x
4 [: m+ D$ }0 c$ Q' c% E J" N6 |% N& C* W+ t
(3) 文件名列表
2 q2 U- o- G- X7 N0 r1 `7 K5 G9 ] i. x$ k5 k
所有在lab文件中的资源文件的文件名,每两个文件名中间用0x00分隔。 , n0 t$ o I( V
9 [4 u" @# I; S2 @( K% \5 X(4) 文件物理存放块
: e) c2 h, y) g& x! \7 u& y5 v5 @) y# m6 Q6 O) }8 s4 ~2 i
所有资源文件在此块中存放,首尾相连。 6 A) H: p: _( h8 M b
/ \5 d( u! O7 }. _* T. k0 L附上一个lab文件,可用二进制编辑器打开,对照结构,加深理解。
4 ~6 @/ Y1 K! G' F3 J- k
7 f+ p) K5 v; b1 Q9 b# iData005.rar ; p! P9 b$ U- @* y! l j2 B: \
! r( z1 D9 g0 W7 ^: ~0 ~6 Z
3.Laf文件格式 3 J/ D8 }3 H, Y/ P
- p2 I/ q2 ?' t7 ?3 I G) L- @是游戏的字库文件格式,将会在字库篇作详细介绍。 |