进行游戏汉化最开始的工作就是分析游戏的文件格式,找出要汉化的部分在哪个文件里,文件结构是什么样子的,应该怎么修改。
+ ~$ {% {; i- x# U& b1 `1 x- s6 ]. ?" x
汉化游戏主要是要找出两种文件及对应的文件格式:
0 y2 e* {$ S" \$ o; Z
; U; C) ]/ R- b+ f3 @- E5 A1。游戏的字体文件 3 o; n% v# e, A$ o, o @6 K4 \# s
$ q3 B4 i% W6 z! O3 v
2。游戏的英文脚本文件(就是游戏中的情节、对话部分)
) T* q! C3 w' N2 F1 {6 B9 i9 Q6 y g- \
7 [4 U7 a' z5 @! D" j0 ^* ~: J$ ~" t但是如何找,这却是一个难题。由于游戏厂商一般对自已出品的游戏文件格式都是不公开的,它们不希望玩家能随意修改游戏(这仅仅是一厢情愿罢了),很多骨灰级玩家还是能够找出游戏的文件结构,进而修改游戏。 1 Y: ~' v8 s) N4 |2 U! k. [
2 H; n; y' Y7 C# v0 {4 V! {- o! u这样看来,找出文件格式主要有两种方式:
( T* u- Y6 G$ r! x& q3 E
4 b) v( r! @: K1 X% d- w1. 搜索网上的资源,寻找骨灰级玩家,求得帮助。 5 F9 c0 J5 P# d; A
# E+ a* K6 m/ `. _5 T2. 自己充当骨灰级玩家,分析出游戏文件的格式来,难度较大。
0 ~" A# S. v. c( U ] h- R% n% U _/ H! `# N
幸运的是Lucas公司的游戏Fans很多,甚至还成立了一个专门的网站LucasHacks(http://scumm.mixnmojo.com)用来讨论怎么修改其出品的各种游戏。我所需要的游戏文件格式的文档全是出自此网站,从而为汉化工作提供了极大的帮助,节省了很多时间,在此表示万分感谢,向那些撰写文档的前辈们致敬。 " W" e. I3 }3 O8 J
& ?! t# k0 U. G! V* Y; Q
# m. F( v5 `' ~( n+ M3 G7 d
% `, c9 Z/ ]: y- D下面针对GF开始介绍用到的几种游戏文件格式 % d0 m7 k! u- w) r0 V! m
: u. U' d; k8 e( Q7 Q
1..tab文件格式 8 I8 Y1 E" u# B# z7 p
0 s$ }6 t, R. N4 Z a5 }! ]* _
是存放游戏所有英文脚本的文件,文件内容是加密存储的,用一般文本编辑器打开是看不到任何可用信息。解密内容的方法是对文件所有字节与0xDD进行异或操作。
1 c$ \; c* W7 g0 `以下是解密文件的源码(C#):
, B5 E5 q3 [4 j# ?# g5 W: m0 p7 [6 {# J
9 Q; Y5 \# Q" ~- E5 J9 R
. c( D5 @7 t# m% E3 y' f; P+ x; cprivate void button1_Click(object sender, System.EventArgs e)
0 \' Y( ~6 f0 Z {
/ M, P( }) t/ v9 k // Create the reader for data.
! O2 m# i9 V0 D! J: g FileStream fs = new FileStream("c:\\grim.tab", FileMode.Open, FileAccess.Read); 5 z+ h0 { p& _* F! e
BinaryReader r = new BinaryReader(fs);
: g/ Y& u n' h4 r U5 h
; U* ~0 \9 |9 N K1 c FileStream fs2 = new FileStream("c:\\text.txt", FileMode.Create);
0 V- I& Z5 E! d0 ^8 f BinaryWriter w = new BinaryWriter(fs2);
1 |+ l$ S- q, }; @0 l! A( T4 Z fs.Position = 4; $ y8 s- t( T X4 T* Z2 h7 B
while(fs.Position < fs.Length)
8 p. h/ _ M* j1 [ {
7 @7 h5 u1 [2 E( w w.Write((byte)(r.ReadByte()^ 0xdd)); 4 F) L7 h8 F" z+ e; t7 z3 K' K
} Z8 ^. J3 E+ ^; V& o
r.Close();
4 V _) r2 d1 S7 j: h/ Z w.Close(); 9 D1 {1 i, w7 ^) {; h' A" E
fs.Close();
' Z0 n. |, f2 ?/ c- X5 U0 D fs2.Close();
5 W1 G/ }$ R- C2 Y5 `/ M6 U7 O
! q, D3 x% N6 g. e) B: w2 P$ t8 t }
3 R3 w9 ~0 a3 N; K; p$ L
9 ^( Q0 n! h, b* ]! p解密后的文件内容就是一般的文本,可以看到所有游戏对话都在其中。下面节选文件内容的2段进行分析:
+ [" m' ^7 a4 O/ q$ K5 b( |$ }$ J4 h' n3 f" x) W6 G
2 u! ^; p/ d* ~sito030 Oh yeah, yeah. Yeah. That is what I told him. : `' T& S- Z# s! L# a4 G9 ?* H
3 e$ e4 }6 i4 O# ?$ ?! J
sito031 Are you kidding me?
1 {' U3 h9 R' e1 z6 Q7 P5 K; W1 V% C& w
sito032 gave him the idea in the first place!
. U; P' o/ `* ^% n
% ~& w A3 `! h5 k) z) c- D可以看出左边是说话人的名称标识,右边是说话的内容,分割这两者的是看似一个空格,其实是ASCII码表中的制表符Tab,16进制表示是0x09。 ' U/ c( r1 h# J2 Q. g; |" o
9 m) C7 o% r. V7 O对游戏角本的汉化修改此文件的内容为中文就可以了,还有一点值得注意,修改完此文件后无需再对其反加密,只要将解密的文件保存成以前加密文件的文件名覆盖即可。应该是游戏运行时候会对文件是否加密进行判断 % o: i3 O% D0 x& e
0 f9 c& z1 q3 v, x. m# j; t8 I) u% U2..lab文件格式 % x; Q& ~! X3 m
5 J' h7 _9 c" i4 [( h是游戏的资源文件格式,游戏所有的资源声音、图片、动画、全存于此。它很类似于常用的压缩文件的格式,如zip、rar,作用是把很多文件压缩成一个文件,需要用的时候再解压出来供使用。Lab文件也是这个用途,它把很多用到的声音、动画等文件放到一个lab文件中,供需要时调用。Lab文件不对文件进行压缩,只是简单地把所有文件头尾相连,保存成一个文件而已。
+ N& }9 U) g5 o" \* \8 ?: H
/ A& w7 f% z/ e( [' Z6 NLab文件由文件头、文件偏移量表、文件名列表、文件物理存放块组成。以下内容选自LucasHacks的文档
# d$ F, Q% r% \2 o# `( U" F
3 W4 d e) q4 e) b(1) 文件头
$ d7 W! x2 E9 S$ `6 o; x' `9 U# R T3 F( R& T; |: e+ L
5 C, b* P6 F9 U. L1 A8 `! [9 E. g8 d" [, Q0 l+ s% |" P
字段
1 j" J4 V% g9 Y: V 数据长度
$ r/ u& x% _- H" z7 Q# W 描述 ; i% _1 c- x4 f% y% n
- U" k1 w6 `- w+ I' V$ y; l
Id
( `! R& y4 W8 L" J; }8 ?" l Long(4字节)
9 F/ g8 a. B' M. ^+ n ~: e( v 文件头标识LABN / B" N4 H3 O+ q! V
, e( t" \( c6 `! v
Version 4 a7 m/ @- n3 |/ n' P
Long(4字节)
! D1 D$ E, Z* \ 文件版本号
' P. H" |8 S1 b5 j# z+ x) c2 O& a v
2 d: t( Q o, n* c! B' d6 t2 aFiles ; E1 Q$ `0 c" B' S4 Z+ X
Long(4字节) / d- b1 h! J0 O% B" h
此lab文件内包含资源文件的个数 % I Y8 a$ a+ q' Q" H# r2 O
% Y; h1 O% r) B+ F$ W
a
" Z& d! e6 B. j# |# b* p5 f Long(4字节)
) t: i1 E r9 _! s, Q% i6 A 未知
9 c8 W' d: A4 N; b# S1 Q9 S8 A7 \
6 A/ k. r! l: l5 @b
; l4 l2 `6 B% g! J( f1 f Long(4字节)
`! v" t( P: E 未知
9 E* n6 a3 x/ p ' x! K& e8 t! }6 @# z
) c; u: i, q n) v. r
(2) 文件偏移量表
$ a) ?& U$ ^5 e% Q# {# p! m
' e, {, h) }' m. Z; u- r1 v字段
2 ]( X+ D% Z6 | S* ]5 J 数据长度
' g* p+ L4 E [. Z 描述
4 |. T" x. z0 B, ]. n4 S
7 f% p6 P9 V4 l$ i- aOfs
. l* `% z9 E" j, Z4 U* {* A! Z Long(4字节) ) \' j. l1 W# Q% R O+ m
文件名偏移量,用来找到资源文件名称
; l. X4 g: y/ b6 R1 _ z
$ O4 c V; y1 [2 P; b5 Z8 dOffset
& a% Z7 L. p3 o- T% l Long(4字节) 0 S% ?7 B2 D( @9 P3 h
文件偏移量,用来找到资源文件在lab文件中的相对位置
9 ?* _! G' e- l
8 L! Q6 n8 I8 D$ V0 fSize + s: O- F6 t2 [3 D0 i O8 n
Long(4字节) ! J9 j, A: m/ ]% k
文件大小 ! ~4 C4 X9 B, T7 J5 T
: e. E. G- T1 I! lU
. U! [) E" o% n3 u; H) R: \7 B Long(4字节) 1 a- B- Y$ t; }2 B( i3 b5 c
总是0 4 i0 P9 Y. Y! t) _4 v% J R
7 q$ F/ g, J4 y
# ^2 |0 r/ G8 K4 U- ~9 P(3) 文件名列表
, c7 G" K; Y8 R8 L5 R! ~% i: E* R0 ~
所有在lab文件中的资源文件的文件名,每两个文件名中间用0x00分隔。
. p! O* J' C2 \% e; {" i% z: x1 k# R4 L0 U" m2 O
(4) 文件物理存放块 3 i) D) W4 b. k/ Z
) J7 A* n! T1 `& `3 T- u( o) g5 c
所有资源文件在此块中存放,首尾相连。 9 F& o; j A7 z" Z" a- Z# W
! ~# M; Y) l- t8 H6 r% U附上一个lab文件,可用二进制编辑器打开,对照结构,加深理解。 & ~" G' W4 I1 O( B. ]/ Y
, q# @0 C) z( G* S+ u" V9 GData005.rar
' e% B" Y9 O8 f. ~: H m) M1 `1 Y$ [2 T1 z4 A6 `
3.Laf文件格式
4 k$ k7 k6 w9 p+ j& v/ e: a* z( z5 D1 d4 ^! G+ u- l
是游戏的字库文件格式,将会在字库篇作详细介绍。 |