进行游戏汉化最开始的工作就是分析游戏的文件格式,找出要汉化的部分在哪个文件里,文件结构是什么样子的,应该怎么修改。 4 N2 \) ?% V" r
- s3 z% Q9 ~ X5 K: S& x) m
汉化游戏主要是要找出两种文件及对应的文件格式:
/ E1 K5 ? u/ u5 j: X( J5 j5 K6 Y4 j# N8 \6 I
1。游戏的字体文件
! g+ l; W8 I7 S/ Q7 D" e1 \2 M0 k- j* K M
2。游戏的英文脚本文件(就是游戏中的情节、对话部分) 9 Z. I& f% `# z$ M6 Q
8 g9 Q. {+ }' C) m- a
但是如何找,这却是一个难题。由于游戏厂商一般对自已出品的游戏文件格式都是不公开的,它们不希望玩家能随意修改游戏(这仅仅是一厢情愿罢了),很多骨灰级玩家还是能够找出游戏的文件结构,进而修改游戏。 e- l/ D$ g0 Y6 R- X( L- q0 J1 X
' G; B4 z; ~9 Z5 S! P& y这样看来,找出文件格式主要有两种方式:
. ~1 I$ |9 J; s+ D/ e) e2 B+ R3 B6 }3 h4 Q4 O3 Z
1. 搜索网上的资源,寻找骨灰级玩家,求得帮助。
& T& u5 ?/ h& E6 F
- q; i% r' ^4 X: r2. 自己充当骨灰级玩家,分析出游戏文件的格式来,难度较大。
2 Q& b2 r8 Z8 {. N6 S8 N4 [
. Q9 Y8 B5 T( d8 u5 p4 @7 u幸运的是Lucas公司的游戏Fans很多,甚至还成立了一个专门的网站LucasHacks(http://scumm.mixnmojo.com)用来讨论怎么修改其出品的各种游戏。我所需要的游戏文件格式的文档全是出自此网站,从而为汉化工作提供了极大的帮助,节省了很多时间,在此表示万分感谢,向那些撰写文档的前辈们致敬。
: I: U1 ?" v- a* @2 U5 M9 l! ^& b! w/ [, I" ]
) N4 w+ E; \4 e* t& `9 Z* i1 U! t$ X0 L
下面针对GF开始介绍用到的几种游戏文件格式
9 \+ u; h( `, c8 v' J! m
8 x6 u" u0 a! e3 w1..tab文件格式 + B Q: W. P: }3 ?0 T
# |% I* D5 Z+ } h+ {1 g6 B4 z是存放游戏所有英文脚本的文件,文件内容是加密存储的,用一般文本编辑器打开是看不到任何可用信息。解密内容的方法是对文件所有字节与0xDD进行异或操作。 " M0 N: m% I* B: V$ {
以下是解密文件的源码(C#):
+ @: C# a. y, _0 f5 m$ x9 e. ^, F3 f* w, F0 n# S
! @ J6 o. l1 b! Q0 D* A L- ?2 Q! e
5 X5 ?, `$ f4 I6 z! q
private void button1_Click(object sender, System.EventArgs e) 2 j3 n5 Q$ D; h: n* t4 {, U# H: \
{
% Z5 X8 J' F% v9 N // Create the reader for data. $ K- { E5 g6 Q9 G, z
FileStream fs = new FileStream("c:\\grim.tab", FileMode.Open, FileAccess.Read); $ j1 O! g5 x4 n' o
BinaryReader r = new BinaryReader(fs);
/ B0 U: X& ^5 L# ?1 b& u) {6 g % E+ s6 B" F) S& x5 a
FileStream fs2 = new FileStream("c:\\text.txt", FileMode.Create); ( c, A1 S5 S0 A" M
BinaryWriter w = new BinaryWriter(fs2);
" h1 M8 T: a( X: `# t# c+ R- d fs.Position = 4; 5 K, G5 v& [/ _6 v5 O3 O
while(fs.Position < fs.Length)
4 ?2 j! ], I7 `1 M { ! I& |8 z+ M4 ^4 z, d
w.Write((byte)(r.ReadByte()^ 0xdd));
( q o$ W! A: f, Z; ^' ^. e, i, W }
! K9 l8 F- A5 P6 D r.Close();
% `7 K6 L6 j( Q( @& l4 _- d w.Close(); ( T8 I$ K O) u" F k" O3 ~' ^+ I- M
fs.Close();
) l0 ^+ @7 R, B" ] fs2.Close(); 9 y4 p B/ ^" @+ }6 o! J
( B& I) T# Y/ u1 j% A6 K
}
$ n& Z. p! P6 c9 k- C% B9 H5 V9 B# a6 s
解密后的文件内容就是一般的文本,可以看到所有游戏对话都在其中。下面节选文件内容的2段进行分析: 2 W+ U r3 {2 F% k' M, F
5 I7 @7 }% r/ a1 |" t/ v {9 ?4 S( ^4 ~3 D+ n
sito030 Oh yeah, yeah. Yeah. That is what I told him. 2 a. c: z: q/ S9 _9 H
5 z: | w0 p$ ^5 @. lsito031 Are you kidding me? * p; t5 C/ v4 B! q$ k
$ R/ X% I8 ` c c7 P$ d9 hsito032 gave him the idea in the first place!
6 B% K8 V) W( y( U% l( G% U; u3 E; w/ w: M
可以看出左边是说话人的名称标识,右边是说话的内容,分割这两者的是看似一个空格,其实是ASCII码表中的制表符Tab,16进制表示是0x09。 1 L5 w$ s( D2 s4 r/ J; @) c
" |& z2 a+ y9 B; a. e" k
对游戏角本的汉化修改此文件的内容为中文就可以了,还有一点值得注意,修改完此文件后无需再对其反加密,只要将解密的文件保存成以前加密文件的文件名覆盖即可。应该是游戏运行时候会对文件是否加密进行判断
, }9 [9 N6 s+ P4 C3 f2 T
# |# W; ?; H) r2 C& ^1 t; Y2..lab文件格式 , {- I$ T) u6 h5 g" B
! m( U8 d* m+ y7 g; }是游戏的资源文件格式,游戏所有的资源声音、图片、动画、全存于此。它很类似于常用的压缩文件的格式,如zip、rar,作用是把很多文件压缩成一个文件,需要用的时候再解压出来供使用。Lab文件也是这个用途,它把很多用到的声音、动画等文件放到一个lab文件中,供需要时调用。Lab文件不对文件进行压缩,只是简单地把所有文件头尾相连,保存成一个文件而已。 * y4 i( O6 x& c2 G2 ?3 q2 O& j: S
- n. a9 R$ `8 o9 a6 E* n. \7 GLab文件由文件头、文件偏移量表、文件名列表、文件物理存放块组成。以下内容选自LucasHacks的文档
w) j' R* g; M9 _/ R$ _3 @$ ]+ D1 ^& C0 Y$ ^9 N7 K% t1 s
(1) 文件头 ! @2 r& R, \9 y3 U' }
8 i4 ]2 c9 `$ P
/ x* G8 b& A; f X- c3 d9 l
2 v* X6 }' M2 `- m# Z9 L8 t* o5 J字段 - R W# B, J& R/ L2 c" n; v- h' b
数据长度
* H0 {, C# x* ^+ n7 P 描述
+ {% {+ C; d8 h5 h+ a
) K7 ?0 `' P; p" }: w! R. qId + @. W/ }% o6 E' I, S. d
Long(4字节) / W& ?" V7 W+ H6 I
文件头标识LABN 3 y* S3 N( k: d1 z2 R
( U: S; [8 e* k4 p
Version
" ^! j& u1 Q' Q* j: k5 e Long(4字节)
$ `- Y# |, c; }. X$ o5 Z8 @ 文件版本号
; W w B& v: F4 _. [
0 W. ?! Z9 s% S" @: l9 }/ OFiles
2 z, r$ m \5 { Long(4字节)
9 B$ O, \* ?9 p 此lab文件内包含资源文件的个数
0 @% X! C U) H6 g ) r9 X( U" g t1 }2 k$ F
a
/ d# x6 C7 k) T- s) u9 K& s Long(4字节)
+ q. t$ x9 C0 N8 U 未知
$ k! T. X) ]: r4 D % w7 b1 {# K: A. n
b
" ~% u' E& r9 {' }! I3 V: Z$ I Long(4字节)
8 U) Q/ x l4 z* b; x; M 未知
1 Y9 c* R# u! w4 K# a- n
, A/ E; B/ a f" ` b \: ?" z
^0 D% @( u; [5 t(2) 文件偏移量表
. t! L s' z) ^
, F2 H+ s& O3 w! Q1 J# X. k字段 F7 g- n* F! X! y
数据长度
( G7 K, x( P d5 k2 V& H- i 描述 5 ~3 e& q0 g1 T! i4 E' ~
5 d; `/ ^* j! r; E# S
Ofs
) p1 S- \3 e! ~1 u/ L Long(4字节) 3 I- E8 n9 I8 f& y
文件名偏移量,用来找到资源文件名称
1 g2 L V: o' W% O$ v
, x, i$ U2 L( C8 C* GOffset " J) J8 X8 z& @# l: d0 f4 `4 P( Z
Long(4字节)
* U, K8 O2 ~: G. B$ | 文件偏移量,用来找到资源文件在lab文件中的相对位置 ) ^; g6 t4 x6 R5 Q3 j# ?6 w
]7 T2 v; P0 B/ u" m
Size ( G6 _/ H( @7 M) M; _
Long(4字节)
2 ?% I' `+ a3 O8 s8 Q" ]3 D+ E 文件大小 ! ~2 P% ?6 n; g5 |$ f/ p4 M
( p3 u1 H+ g( E. lU , Q8 r: y' j; J$ ^: Z
Long(4字节) s1 l$ @6 |& X+ a4 k
总是0 ; [: D$ X3 Y/ _5 D, F
8 {' o4 R4 k: |, I) J/ N2 L
U+ c( d+ b7 ]2 F, X1 _
(3) 文件名列表 ' o. u* U" u) B7 w( t! c4 h" ?
2 l3 C5 o1 T0 a, \9 \ ]所有在lab文件中的资源文件的文件名,每两个文件名中间用0x00分隔。
; K# z: x m+ Y8 I! ~
. S/ C4 k4 ?+ ~* R& t4 H4 m(4) 文件物理存放块
9 j. \& M) Q9 l6 t( ?; ~3 m- R" E* u( O" u! h
所有资源文件在此块中存放,首尾相连。
1 a# Y) m+ |! q8 ], A; B& R( Y0 y! ^7 x+ d' A3 f( J/ F9 [( W
附上一个lab文件,可用二进制编辑器打开,对照结构,加深理解。
" X- _5 M) d; r1 p- F; _/ ^4 Z5 N4 t4 c) T: a- j/ W) y
Data005.rar
l C4 j% U; |) q0 _+ J% M
: u$ z- s N$ ?" @( U! }3.Laf文件格式 8 a, Z+ K D0 Y4 j% q
5 s' x. o6 E, j1 X! T; x
是游戏的字库文件格式,将会在字库篇作详细介绍。 |