冒险解谜游戏中文网 ChinaAVG

标题: [转贴] GF汉化详细教程[文件格式篇] [打印本页]

作者: shane007    时间: 2008-10-6 10:29
标题: [转贴] GF汉化详细教程[文件格式篇]
进行游戏汉化最开始的工作就是分析游戏的文件格式,找出要汉化的部分在哪个文件里,文件结构是什么样子的,应该怎么修改。 ' M8 l3 g2 x7 _; K- d6 F+ _/ ?
& T8 ]$ }7 S3 ^, `& r6 A- c3 z* ~# Y
汉化游戏主要是要找出两种文件及对应的文件格式:
& ^" O1 H6 s- y+ _8 d6 o
. R& @: S( a( @4 ~  s! k4 V1。游戏的字体文件 1 z  z9 n) V, Y0 g( ?4 S+ z
* W9 b* w& N- o
2。游戏的英文脚本文件(就是游戏中的情节、对话部分) 6 G3 h! L6 l+ h

/ `7 t2 W( z; _9 R9 q但是如何找,这却是一个难题。由于游戏厂商一般对自已出品的游戏文件格式都是不公开的,它们不希望玩家能随意修改游戏(这仅仅是一厢情愿罢了),很多骨灰级玩家还是能够找出游戏的文件结构,进而修改游戏。 1 g! @, D* ~/ u6 w' R, j
4 @  `, }3 v& @- X9 d8 K& I
这样看来,找出文件格式主要有两种方式: ( q; z, X4 A0 _1 E: V5 m( b/ G( [9 S

  O) @. r# ^% U1 e) f1 ^1.  搜索网上的资源,寻找骨灰级玩家,求得帮助。 , t  o# ^: d# h- ]0 d6 N$ z9 M
( N+ E6 K$ N  k1 U7 d& _0 a
2.  自己充当骨灰级玩家,分析出游戏文件的格式来,难度较大。 + U# f/ N9 b* S( o: j# f
$ j  h$ y5 n) H
幸运的是Lucas公司的游戏Fans很多,甚至还成立了一个专门的网站LucasHacks(http://scumm.mixnmojo.com)用来讨论怎么修改其出品的各种游戏。我所需要的游戏文件格式的文档全是出自此网站,从而为汉化工作提供了极大的帮助,节省了很多时间,在此表示万分感谢,向那些撰写文档的前辈们致敬。   C5 L" ^5 k, k; V) [, H

) z  B; D4 y" k# `9 i  $ W# Q  N8 E+ S' z$ z, \, D
5 T+ X8 s- D; c1 [1 W0 S, S( Q! H1 N
下面针对GF开始介绍用到的几种游戏文件格式
: L4 a& e  W8 f- e- l1 U, C. F) V6 w. n3 ?: Q& D
1..tab文件格式
0 H4 Z# e/ O9 u+ b' [3 H; e3 T3 o# i5 V  ?& y& T+ ~+ P
是存放游戏所有英文脚本的文件,文件内容是加密存储的,用一般文本编辑器打开是看不到任何可用信息。解密内容的方法是对文件所有字节与0xDD进行异或操作。
: `( M0 M1 |# x5 z以下是解密文件的源码(C#):
# J1 E. U: ]" e$ G9 _. k5 r; G- Z; N3 V7 h. \3 o* b( l

( ~  V: I: ^  ]( \2 \, U" w
/ }- {9 T% f7 V$ Mprivate void button1_Click(object sender, System.EventArgs e)
  ^/ `" U0 `& S" R& v& ?        { * t7 i0 e0 A% S2 S! L( v/ k$ i
            // Create the reader for data. # Z/ v5 ?( x1 Y
            FileStream  fs = new FileStream("c:\\grim.tab", FileMode.Open, FileAccess.Read);
+ a" a( L1 R, V  c            BinaryReader r = new BinaryReader(fs);
; ]) c) v) b' r5 c8 U  `) [
- t" f; f' J0 t, I1 B- g! @6 w            FileStream fs2 = new FileStream("c:\\text.txt", FileMode.Create); # ^/ j  b5 ]# q8 u0 r* C% m6 |
            BinaryWriter w = new BinaryWriter(fs2);
: ^" n* [& y# H) g0 Y            fs.Position = 4;
: X( B" [1 n; x- U1 C1 g4 Y            while(fs.Position < fs.Length)
  [7 ^6 n  X6 y2 [            { 4 \$ P. j# t! _1 k& T( F& T
                w.Write((byte)(r.ReadByte()^ 0xdd));
" A+ ]. l2 o/ C  K( H1 H            }
9 j; D# Y# K0 U3 c; K            r.Close();
# K7 r6 a5 W" G  ~3 w- p            w.Close(); 8 `+ m' d8 t  G, j9 X/ l! ^+ a
            fs.Close(); * V; d  o% J: K2 l* r6 e9 n
            fs2.Close();
' N) x' z- K. V1 R6 j! {
$ W  C6 j; y& L: e9 t        }
* Q7 t5 |/ I! R! _- q% t1 c2 V9 _5 p! Z: c
解密后的文件内容就是一般的文本,可以看到所有游戏对话都在其中。下面节选文件内容的2段进行分析: 5 h: I; R% Y1 a6 f
6 ^( O" M. Q. x2 r, O! E- B: [6 w

, h  F" s3 s! c/ k" ?$ ~sito030  Oh yeah, yeah. Yeah. That is what I told him. 8 y6 W8 q; q  [5 F5 \1 V  J

' \2 d6 G0 `) _sito031         Are you kidding me? 4 u1 p0 P5 T& c$ p# u) S0 N! a" h

9 _# `0 F% K1 n" l- M4 ssito032  gave him the idea in the first place!
7 ]& E. W& l' ^& a- z8 I$ y
' p; v3 k' g" m* B可以看出左边是说话人的名称标识,右边是说话的内容,分割这两者的是看似一个空格,其实是ASCII码表中的制表符Tab,16进制表示是0x09。
! n, x8 j! @# u. w* {" ^3 H( R. u8 R
对游戏角本的汉化修改此文件的内容为中文就可以了,还有一点值得注意,修改完此文件后无需再对其反加密,只要将解密的文件保存成以前加密文件的文件名覆盖即可。应该是游戏运行时候会对文件是否加密进行判断
% D! Y' m* C8 U, |! E  d1 ]  C& V/ G- L
2..lab文件格式
% P" U. k! g* w  h% _0 F( }6 ?+ [& k- m* Z. k8 V
是游戏的资源文件格式,游戏所有的资源声音、图片、动画、全存于此。它很类似于常用的压缩文件的格式,如zip、rar,作用是把很多文件压缩成一个文件,需要用的时候再解压出来供使用。Lab文件也是这个用途,它把很多用到的声音、动画等文件放到一个lab文件中,供需要时调用。Lab文件不对文件进行压缩,只是简单地把所有文件头尾相连,保存成一个文件而已。 " Q4 L  G% r* G6 N' e
3 h' X6 }! Z! A3 e0 e
Lab文件由文件头、文件偏移量表、文件名列表、文件物理存放块组成。以下内容选自LucasHacks的文档
2 [1 k# v" \( X3 Z0 U6 ^4 B2 X
3 C) f7 T' v! u2 B6 W2 ]% `' K(1)    文件头 ; ^9 D8 s% I; q0 j# G; ?
& U7 @# s7 R0 l6 H
  / H! r# K! o; _8 T5 u' \
  s0 H3 K7 y; U. X6 {+ P
字段 & h/ J% e% b% m5 H2 x/ r3 b
数据长度 ! ^/ P( h3 b$ ?* K
描述 , Z& |# v( _. g! T. P

; P% i' X# a" [8 }  K' _& NId % T7 v! G3 D' Y2 `7 e
Long(4字节)
, L# U" n! r! |+ {. J7 h) L 文件头标识LABN 5 v- D  c5 E7 k* |

& Y5 G1 d/ S  _; R$ l. ?2 h! H& j( iVersion
' D# Z" s' P! p" X7 ] Long(4字节) 6 m+ e1 g) h! D4 r  |0 z" x
文件版本号 3 v" ^! X6 @+ h5 K0 q
) x- a9 x$ f' T0 u4 ?3 X! B: ]
Files
3 L' p3 X3 O* q, S2 B! M9 U Long(4字节)
+ O  Z* y1 o: B8 k& v 此lab文件内包含资源文件的个数
9 ?- b" b- Z' D2 {" H+ y6 ~
0 M( l: q6 P/ Y9 ~' O8 p% Oa
. R6 r$ W4 U0 h1 l Long(4字节)
: ~: I8 v* r+ @) s1 I% ^" Q, U  | 未知 ( o- V% d# }1 r7 Z& ~1 L
; Z- ]7 ~. U( r
b # F( U0 i$ R& G3 K2 e$ L
Long(4字节) " {0 k, `$ }6 R, q4 e4 k- Z( F
未知
/ v8 W0 `- @% h: O ( H: E: u/ R3 }) P, Z- J0 I

/ ?8 m9 A) g/ R; D/ k(2)    文件偏移量表
1 {" {9 l5 d$ u/ b3 }! @3 d* H. o$ F& W3 z, g$ R
字段
3 N8 @4 o& M7 j- Y 数据长度 ; E) i% J1 k. I: Q
描述
0 h7 Y) O! Q, I) r' C1 B4 Y - N; k  {0 e: |' ?! F1 _
Ofs ' G% D) S& Z- {
Long(4字节)
% i+ y5 F$ Z: z" J( s/ j 文件名偏移量,用来找到资源文件名称
  f" s7 X# @4 l+ Z8 M& M 7 n1 z" D( N& G0 U/ S
Offset 8 E1 n( p; D3 a1 s* m3 k- l
Long(4字节)
, d1 D" r  p* ^& H6 K 文件偏移量,用来找到资源文件在lab文件中的相对位置
7 X9 |1 G; ^' U: m1 R' w; e 4 \2 a" n  p- a4 A4 q
Size / Z! z3 p+ _( W) \& e6 b" K9 |
Long(4字节) 0 M/ l6 a. r) E, ~9 t0 g- E. Y
文件大小
$ r. p- M# ]/ }: h- J- d9 b* ^5 \ ' Y) [5 y! K- k$ S
U 1 C! s7 [0 ?1 y9 O
Long(4字节) ( x; p& v4 k; b0 a8 V4 F
总是0 - w4 r8 P4 Y; a. C1 w; v+ X

4 {* I/ U, w1 ]( d& D5 F  \6 a. u/ X. h/ s* y
(3)    文件名列表
: \& A+ i! j& s0 k; _
" N" B5 V  u1 `7 p9 s* s/ M8 M所有在lab文件中的资源文件的文件名,每两个文件名中间用0x00分隔。
6 f. V- a& O9 j5 O+ |7 d2 ^; u' C
(4)    文件物理存放块 4 V5 S+ k, Q0 J9 K: ^/ h, L
. T: C5 F2 }9 Q% p/ k+ P7 r! u
所有资源文件在此块中存放,首尾相连。 ! E# h* O+ {4 l% i3 C$ |

$ G9 u' v; `6 H0 k/ N% l3 ^# n附上一个lab文件,可用二进制编辑器打开,对照结构,加深理解。
) E% `$ D" W" E8 D# ^
) G* V* g1 d( N0 x( ^+ D9 eData005.rar
. Y) B% i4 b6 P  @
* W) d3 c. \6 N4 N. S3.Laf文件格式
/ U3 l" s) F8 G6 G( N4 d- \1 d& h8 W
是游戏的字库文件格式,将会在字库篇作详细介绍。




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2