进行游戏汉化最开始的工作就是分析游戏的文件格式,找出要汉化的部分在哪个文件里,文件结构是什么样子的,应该怎么修改。
d+ s5 U1 O5 R5 Y- y* _! X% z7 j2 r: B. c
汉化游戏主要是要找出两种文件及对应的文件格式:
4 V8 ]7 I/ x8 }$ | T" S
- j) J1 Y; C [$ b8 p1。游戏的字体文件
8 e: Z+ ]; z& a2 N z/ t$ A
7 r# U. y- `9 N3 h @8 H2。游戏的英文脚本文件(就是游戏中的情节、对话部分) ; ^* I) z. }2 i5 t% `! E1 Y, J
1 \1 \$ k D2 L8 F但是如何找,这却是一个难题。由于游戏厂商一般对自已出品的游戏文件格式都是不公开的,它们不希望玩家能随意修改游戏(这仅仅是一厢情愿罢了),很多骨灰级玩家还是能够找出游戏的文件结构,进而修改游戏。 ( z2 S( X7 C! _- u' ~/ z5 L! l0 x
P$ K, A! p- e
这样看来,找出文件格式主要有两种方式:
, A; m- s! S& _* G
7 h$ K+ ]1 c D+ e& {' \1. 搜索网上的资源,寻找骨灰级玩家,求得帮助。
3 S! }4 w2 z) a
- {! \" l( a2 ?: h2. 自己充当骨灰级玩家,分析出游戏文件的格式来,难度较大。
& {2 l: C% K* W+ e8 p7 v; V* W2 E- h2 e X4 h0 b/ J
幸运的是Lucas公司的游戏Fans很多,甚至还成立了一个专门的网站LucasHacks(http://scumm.mixnmojo.com)用来讨论怎么修改其出品的各种游戏。我所需要的游戏文件格式的文档全是出自此网站,从而为汉化工作提供了极大的帮助,节省了很多时间,在此表示万分感谢,向那些撰写文档的前辈们致敬。
3 P$ i! [/ h! {2 V" U
% L" }+ I2 B( L4 q* | 0 I6 n) h8 |, X% S! o, g/ n
9 v" g( {; b/ D% s, J% o
下面针对GF开始介绍用到的几种游戏文件格式 & J$ I% y0 W# F. \
+ [; u, \# J/ G3 }$ h6 i1..tab文件格式 ( s1 e/ f8 w4 \; o8 l. x* s
/ h l6 ~7 s4 ]! ]: w7 ]是存放游戏所有英文脚本的文件,文件内容是加密存储的,用一般文本编辑器打开是看不到任何可用信息。解密内容的方法是对文件所有字节与0xDD进行异或操作。 " V1 |+ b/ c# q' ]
以下是解密文件的源码(C#):
( W% `8 `1 x2 J( ?
. [1 r# _( m8 e& ~# ~9 b3 y" ^
* K5 E0 T; |+ G. W7 O" \: h* S0 k9 T" g$ [
private void button1_Click(object sender, System.EventArgs e) 9 y( g0 h. `8 L; Y
{ + h. w, }, i' W& U7 V1 \
// Create the reader for data.
) F1 J6 S) Z A) n2 K FileStream fs = new FileStream("c:\\grim.tab", FileMode.Open, FileAccess.Read);
6 C8 r2 V& o8 h* E0 [# I$ `$ [ BinaryReader r = new BinaryReader(fs);
- f7 h; Z- Q) W& [$ I
, T9 j9 W9 x/ h6 _& B. K) h FileStream fs2 = new FileStream("c:\\text.txt", FileMode.Create); & B! e) Q8 `7 j, {
BinaryWriter w = new BinaryWriter(fs2);
; x" `) i1 _2 u( Z4 D1 F fs.Position = 4;
- s* U4 p4 N( q while(fs.Position < fs.Length) 9 ?* E8 S2 v8 X! ~4 w, k. ^
{ 6 A* b/ D; \/ ?/ F/ E
w.Write((byte)(r.ReadByte()^ 0xdd));
' t1 e- \" W. {0 v( r }
5 b' v$ Y+ J2 s$ [. f- j r.Close(); $ x" y' ?* y$ n' }
w.Close();
# p" z- t7 m) U; B0 B. z3 N) ` fs.Close(); 1 r2 Q0 M( C& K0 A9 E
fs2.Close(); ( q1 }1 B7 w2 }8 F0 X( K( G: |
1 i/ ^& T0 \; F. R5 Z2 x+ C } ' f. S# j! H4 P+ j
: D: e4 q: c# |. l, l/ E解密后的文件内容就是一般的文本,可以看到所有游戏对话都在其中。下面节选文件内容的2段进行分析:
" d' i# y! p! E0 v' [* S6 X% t7 S
% V+ V" O4 U2 A9 D; k/ \) [/ t8 `% G' x. `- I
sito030 Oh yeah, yeah. Yeah. That is what I told him. # s! n! c! ?" R5 t- e# v4 J
5 Q% f; t) S5 w! H) K/ b; ]
sito031 Are you kidding me?
8 V# c: s* [5 X4 W& F) M- t) D7 T4 B# H
sito032 gave him the idea in the first place! 7 ]0 x4 u* N. v3 J6 @* U/ i
( d" i6 i; g0 e1 L* d5 o( T/ |
可以看出左边是说话人的名称标识,右边是说话的内容,分割这两者的是看似一个空格,其实是ASCII码表中的制表符Tab,16进制表示是0x09。 3 o# h9 P' C w* f k! W9 ^: S
) x: u) o9 ^9 o f+ g. q/ ?对游戏角本的汉化修改此文件的内容为中文就可以了,还有一点值得注意,修改完此文件后无需再对其反加密,只要将解密的文件保存成以前加密文件的文件名覆盖即可。应该是游戏运行时候会对文件是否加密进行判断 . X) O7 z, Y! N* W/ G
0 `, \* d) E0 {4 \5 G2..lab文件格式
9 V9 r- ~- ?+ F2 R) H$ x( Z( \) s( k+ ~
是游戏的资源文件格式,游戏所有的资源声音、图片、动画、全存于此。它很类似于常用的压缩文件的格式,如zip、rar,作用是把很多文件压缩成一个文件,需要用的时候再解压出来供使用。Lab文件也是这个用途,它把很多用到的声音、动画等文件放到一个lab文件中,供需要时调用。Lab文件不对文件进行压缩,只是简单地把所有文件头尾相连,保存成一个文件而已。 " Z% L3 D7 K/ N9 z/ z& M# P0 @1 C
! R5 E7 ?6 a9 e* JLab文件由文件头、文件偏移量表、文件名列表、文件物理存放块组成。以下内容选自LucasHacks的文档 ( Y( |5 N! H* d3 k
0 z& t! q; _! v
(1) 文件头
0 j& O: x% I4 Q9 o9 T, N" p5 ^* _0 @2 U2 T* e. x
" U5 y |3 M& ^/ a% _8 X" E# f6 g3 A3 D
字段 , S' K& e1 c- @5 T J
数据长度
7 c `1 i* X/ F. c- C y 描述
% H& e n N2 u5 [$ C5 i 2 w/ F( b7 [& a9 Y3 M: m
Id
t3 F5 I" b' k" g% {+ G G Long(4字节) % C% K* J' F5 S6 |- h
文件头标识LABN
/ p+ N( p! E$ j8 a) X( H. W" E . a; a3 \! ^% O# |# N4 |, x
Version + H* c2 }4 C/ G3 t
Long(4字节) $ n, W9 X3 O; i7 ]. ^
文件版本号 2 ?; O7 S1 p$ s# C
4 K F& G1 J# s! m8 ZFiles
( R: v* Z, ]) Z4 ?6 I7 L& W Long(4字节) + D1 h7 l$ v6 F) U8 I
此lab文件内包含资源文件的个数 " u4 A; e: O( p9 A3 u, n
6 L) r/ g3 O @" h( Y: H: v+ o) ia
2 j: Q+ S: d8 @/ U# B I |" @1 H3 d# a Long(4字节) ( s; d+ Y! {/ D/ ~7 y' f
未知 8 k. ~0 L' O4 P8 z
/ u' Y: `+ P# J3 X1 U) \b
' R" I, \: v5 P" B: d% U/ `; | Long(4字节) ; N$ T5 c, D0 g- e
未知
|9 {+ k7 h* T* O7 M7 X) u1 h
4 l3 s( v' |) @" ~( L9 D, K5 d% R5 U( W5 g8 B
(2) 文件偏移量表
( f7 r; T" \6 x8 x3 p* V5 R) l& y& G7 s% z- b
字段 2 R1 S4 Q: j1 ?1 q9 r) a
数据长度 - [; {. P: S- w( g; V/ D
描述 * d$ t9 K: C0 A% V
* ]$ j; B0 Z) i$ s+ m/ eOfs
& R c+ z' _& I Long(4字节)
7 i8 Q9 a- _: x& i$ O% \0 U* @0 [ 文件名偏移量,用来找到资源文件名称 ) u r5 i* v4 Y# K: j
% g7 G) z4 u9 C$ Y! |Offset ; j: c. D" B+ d2 O' ~- k, Q6 R
Long(4字节) 9 H# [9 I: m! Q/ d" ~
文件偏移量,用来找到资源文件在lab文件中的相对位置 - p1 i6 i. z/ J4 b% b
" M5 R6 L+ x* p5 G. z3 F0 rSize " A6 |( H8 C: Y6 Y; [. N" b; H6 v( V
Long(4字节)
+ x, w- \- `, O 文件大小
0 s" R! A- h, v' ?& ^ 4 ^/ n7 O( K1 x, ? Q& A
U
$ Q5 _' v0 i/ b0 p, I. G) x" q Long(4字节)
+ p3 _# j+ v. }3 F6 e+ y I 总是0 " ?0 }' \5 `. l& H/ z
. a# J' M% i+ ~# [- `" v5 b# y8 L8 @$ e, o/ q. w
(3) 文件名列表
1 D7 o; f# ?' \
2 s. X( B6 d2 y" B2 A. ~所有在lab文件中的资源文件的文件名,每两个文件名中间用0x00分隔。 ) A y9 @2 J! R" S' h- v- c
+ C9 u% a' H1 M(4) 文件物理存放块 1 u1 \* g, |; H; ?9 f. I$ P
( v9 ~ W) v6 B$ s: K5 b, K* q所有资源文件在此块中存放,首尾相连。
% |1 }8 Y( d X( w
* r% e4 {* q' v) }附上一个lab文件,可用二进制编辑器打开,对照结构,加深理解。 % M3 M3 R: o! V; n7 B
0 a" e" s9 Z4 W2 ^Data005.rar # [ u- Z, L( |% v
) C7 P9 H8 v4 s) @9 d) O4 r3.Laf文件格式
- ?2 z' C# G6 ^. `8 T- s: M3 g' R- S: A0 e
是游戏的字库文件格式,将会在字库篇作详细介绍。 |