进行游戏汉化最开始的工作就是分析游戏的文件格式,找出要汉化的部分在哪个文件里,文件结构是什么样子的,应该怎么修改。
. O9 q0 W* E+ A3 ~
( u9 z) w3 S7 D- x$ e8 t汉化游戏主要是要找出两种文件及对应的文件格式:
% D7 w+ \- t0 j7 @7 b0 f
9 g$ \ V4 w/ [- T1。游戏的字体文件
- y- Z2 h1 Q9 c
8 N* f E1 I* n8 B9 k# o2。游戏的英文脚本文件(就是游戏中的情节、对话部分) * e9 T' z% |9 L p {: W( X/ `1 w1 _
5 J- f# q1 C8 ~5 S* a但是如何找,这却是一个难题。由于游戏厂商一般对自已出品的游戏文件格式都是不公开的,它们不希望玩家能随意修改游戏(这仅仅是一厢情愿罢了),很多骨灰级玩家还是能够找出游戏的文件结构,进而修改游戏。 ( p U2 Y9 B, i: ]
" W- f! G- J, M( r) I; @: s
这样看来,找出文件格式主要有两种方式:
% b# K* B( T$ q3 x0 d6 R/ w5 l5 B U. n4 m. ]* c
1. 搜索网上的资源,寻找骨灰级玩家,求得帮助。 & X6 e1 m! ?/ B" M
6 n# U0 g/ I; Q- n( o$ q2. 自己充当骨灰级玩家,分析出游戏文件的格式来,难度较大。 0 L2 E/ g+ |) A0 Z
0 E# g2 }% _2 E# u+ T幸运的是Lucas公司的游戏Fans很多,甚至还成立了一个专门的网站LucasHacks(http://scumm.mixnmojo.com)用来讨论怎么修改其出品的各种游戏。我所需要的游戏文件格式的文档全是出自此网站,从而为汉化工作提供了极大的帮助,节省了很多时间,在此表示万分感谢,向那些撰写文档的前辈们致敬。 % ]- {8 y& O- T" d, ^' W
, I$ K. F9 m. ] 1 I/ C# h/ d M, X- C+ r: Y
8 u4 U& C" |& X' P$ Y8 w
下面针对GF开始介绍用到的几种游戏文件格式 - i8 w: h, ?$ {" J, o. S* f
! c; b Y! j3 Y; g* c4 x6 ^1..tab文件格式 ) o" N. U/ f& ?3 t( a1 w) c8 U
. n \: D* a" g V- g6 }6 Z' T
是存放游戏所有英文脚本的文件,文件内容是加密存储的,用一般文本编辑器打开是看不到任何可用信息。解密内容的方法是对文件所有字节与0xDD进行异或操作。
- V0 }: V! V; I+ R8 z4 }3 }以下是解密文件的源码(C#): 2 j7 f& {4 F" a; q" Q: q0 A. g2 ]
0 H4 N2 `, k* \' {
. N# m; o& S' U2 I1 Z: }
& A, ?6 [1 R* c1 iprivate void button1_Click(object sender, System.EventArgs e)
% }8 @6 F. m, l. m {
8 [! ~! P& D. ?; l7 b3 ~% } // Create the reader for data.
. E5 b- b8 v! O k8 Y9 A FileStream fs = new FileStream("c:\\grim.tab", FileMode.Open, FileAccess.Read); 9 ?/ q( P5 ]" v1 b$ h
BinaryReader r = new BinaryReader(fs); 1 n. @+ o( j0 v" o5 \
. d* Q- t; a) h5 S FileStream fs2 = new FileStream("c:\\text.txt", FileMode.Create);
' |3 x8 p0 x# p& m BinaryWriter w = new BinaryWriter(fs2);
4 F$ I/ k: {7 O6 e: {' Y fs.Position = 4; 0 M; k$ Z9 p2 M8 J* a% h9 J
while(fs.Position < fs.Length)
7 c4 x' g& x0 V4 v( a$ o9 M {
- g* F; g/ ^6 W9 X U5 G w.Write((byte)(r.ReadByte()^ 0xdd)); & M1 k7 p& V1 W% u8 L- |" {) p
} $ ^/ B- D6 w! v- m! t. J5 H* [; Z
r.Close(); , |5 z9 g6 b8 e) z
w.Close();
* G: K5 w. R% B fs.Close(); x/ N$ E4 r, Z& V4 l1 Z5 `
fs2.Close(); . n( L% A$ D; w! t% ?2 ]% n- g4 j* d
( f& R( I. y( c) z) Q3 F! w' N8 W
}
; F; z: H& y ?8 ]: Z; s s
: L" S4 O! r2 ?% }+ @解密后的文件内容就是一般的文本,可以看到所有游戏对话都在其中。下面节选文件内容的2段进行分析:
. y& A* k! E5 E8 z# E& a4 _) z4 c( D# [
+ C- q2 n% D7 u; T& osito030 Oh yeah, yeah. Yeah. That is what I told him. 5 @: ]) L0 T5 l2 K2 d
5 x2 H' ~4 V1 t: k2 }; h
sito031 Are you kidding me?
, _2 p- V4 a) N4 d
1 B; I& S- v, \9 msito032 gave him the idea in the first place! 2 [ z; V9 w$ ?1 c) E
; H& v5 F3 V9 B: J. a
可以看出左边是说话人的名称标识,右边是说话的内容,分割这两者的是看似一个空格,其实是ASCII码表中的制表符Tab,16进制表示是0x09。 4 Q) h: D1 t* A: v0 u/ M/ W
w+ d& E5 n) i2 k- p/ u# ^+ f
对游戏角本的汉化修改此文件的内容为中文就可以了,还有一点值得注意,修改完此文件后无需再对其反加密,只要将解密的文件保存成以前加密文件的文件名覆盖即可。应该是游戏运行时候会对文件是否加密进行判断
- u, [5 ], M3 z" E4 x4 n4 c: V# Y/ o3 ], o P* p
2..lab文件格式 1 h ?! e" w1 O% a/ U4 Z
+ _& d) l, l6 N' }/ h
是游戏的资源文件格式,游戏所有的资源声音、图片、动画、全存于此。它很类似于常用的压缩文件的格式,如zip、rar,作用是把很多文件压缩成一个文件,需要用的时候再解压出来供使用。Lab文件也是这个用途,它把很多用到的声音、动画等文件放到一个lab文件中,供需要时调用。Lab文件不对文件进行压缩,只是简单地把所有文件头尾相连,保存成一个文件而已。 ' @/ o( N* g. a4 I" r
% J0 t& l2 m6 u
Lab文件由文件头、文件偏移量表、文件名列表、文件物理存放块组成。以下内容选自LucasHacks的文档
j- X5 k8 L8 H% @5 H% R3 _! n; C& d% I. ~6 I
(1) 文件头 " T7 U* k1 l9 c3 j2 z2 I7 N; S
/ ?& s4 U9 @5 T. q
& l {6 g. q' r9 Y
; ^) m( o7 ?7 G字段 ( z- R$ G8 X1 T; U# a
数据长度
7 v4 g& _1 g$ ^2 B 描述 5 W; B2 W! P) o9 R& Z/ n+ N
+ U' o$ O, M% r8 M' o
Id
& @+ @ @ o% |1 K6 V2 s. K ]! w6 Q Long(4字节)
$ Y* z' {' [ |% ?& g 文件头标识LABN 1 |) Q/ |. b: T I
2 B) l' E& x+ g% c2 M! L4 V: L6 L
Version
$ K6 W/ b9 }1 O: l% p Long(4字节) 1 k5 F: G0 u7 z9 @3 u
文件版本号
2 w8 G+ e7 B, [& j! H1 R) N% p% i
0 v; t+ S" V9 r5 J& X- W+ tFiles
9 F# I5 P' y B Long(4字节)
( X* d) b( q$ S# y7 |2 d 此lab文件内包含资源文件的个数 / c; X4 r' q5 d' Z( d
% _; u+ |1 _: \7 b2 Fa
; O( g" B% N' c% Q1 T Long(4字节)
! Q/ ]1 N f1 P+ {: u1 N7 s' p 未知 _+ Q7 z e, l
_: a5 M( C6 N8 b* ^' ub
/ ^) x* o' M* `: b5 ? Long(4字节) 5 J# y3 h6 r' M5 Y
未知 - `" E7 s- C, q' U' T1 {% O$ q! f
/ a1 C6 T X) z3 n
9 A5 P; l* o( ]4 ?/ X(2) 文件偏移量表
1 l- }( R( x; ~& p$ h8 p( B5 S0 B7 q8 ]3 w
字段
- f8 t) @: G0 ~( C( y. Y: G) R2 L 数据长度
6 N8 X l9 c5 n6 Z) d C 描述 , I$ ]8 @$ g! Y. `# M' m
0 N& t( q% N4 tOfs
( V' {9 ~ J' b! j4 F7 z Long(4字节) ) L2 k, |6 \" V% m
文件名偏移量,用来找到资源文件名称 # |$ ]! o9 {+ L4 y4 ^
9 o; [6 P, l; _8 H: S9 r7 _9 A
Offset 1 D4 J9 c- v+ |8 j0 g* R' \2 o
Long(4字节) 4 u" c: n q6 q) U
文件偏移量,用来找到资源文件在lab文件中的相对位置
$ h2 c' J8 G" ^1 k$ W7 v
/ R+ i$ r1 i: c% DSize : z I' K$ m, y) E: h- b+ m* X
Long(4字节)
! W4 w- O; f5 v7 {8 N6 F$ L0 T 文件大小
" v5 u) \+ O$ A 4 x6 k0 p/ Y4 `7 A6 J* A' t5 F
U
! y# O* D L" w0 b; I9 y Long(4字节) + j; ]) x" J/ h, ~* T1 t" H
总是0
8 [( y, H5 L; t1 V9 H
( R( |4 s0 d1 V1 p/ b7 }, s! l
7 O$ G) n/ ^1 R7 Z5 ], s( N(3) 文件名列表 1 }; q8 n7 z) A7 n4 E
4 f5 ~/ Y" b) z! T5 h+ M所有在lab文件中的资源文件的文件名,每两个文件名中间用0x00分隔。
) j! ?& Y. e( W# M- q; `+ T" o& |% F/ d6 \
(4) 文件物理存放块
, S& i2 k& f0 {, c: V
- ?$ v3 a5 C& Y& R% K- T" M8 C所有资源文件在此块中存放,首尾相连。
/ T* M" C3 L, ^0 f) M% t0 K# N7 @, m1 D; d
附上一个lab文件,可用二进制编辑器打开,对照结构,加深理解。 # x7 |, V* b8 L% q7 A
' o0 v$ E! {" u% X$ _Data005.rar 5 ]$ _2 o2 X0 w" F8 ?
* `# k; e- X. A5 l. X$ N
3.Laf文件格式
5 m9 J9 E+ a! K s1 ]2 U3 ~1 ^% t m9 L8 L# J: m$ a
是游戏的字库文件格式,将会在字库篇作详细介绍。 |