冒险解谜游戏中文网 ChinaAVG

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

作者: shane007    时间: 2008-10-6 10:29
标题: [转贴] GF汉化详细教程[文件格式篇]
进行游戏汉化最开始的工作就是分析游戏的文件格式,找出要汉化的部分在哪个文件里,文件结构是什么样子的,应该怎么修改。
7 n. H$ A( C: u' Q' ?4 Y
/ Z, }  @! e) A" u汉化游戏主要是要找出两种文件及对应的文件格式:
/ |; H$ a' Z9 F! o0 m! q. Y% N, _3 Y5 G5 a7 j8 g% I
1。游戏的字体文件
3 P! [* e. B0 M( T/ L
8 @* G3 u3 F" w) D6 i! x2。游戏的英文脚本文件(就是游戏中的情节、对话部分)
- c) {  o/ E/ s9 d9 Y; ~# l
$ K7 Y+ F2 N; d& s* q* M5 s. w但是如何找,这却是一个难题。由于游戏厂商一般对自已出品的游戏文件格式都是不公开的,它们不希望玩家能随意修改游戏(这仅仅是一厢情愿罢了),很多骨灰级玩家还是能够找出游戏的文件结构,进而修改游戏。
# ]9 r' `7 C# Y8 r# P+ @
! j" j1 x: P+ t$ G  H1 y这样看来,找出文件格式主要有两种方式:
7 d+ G, Z  W/ E+ `  `5 l& J9 S# M7 S: T& k8 [
1.  搜索网上的资源,寻找骨灰级玩家,求得帮助。
% j! G  g/ Q! g2 H, L+ t
+ I6 X4 ^/ S  K1 k* }# s1 V2 r2 [& C2.  自己充当骨灰级玩家,分析出游戏文件的格式来,难度较大。 2 O/ z4 Q  w9 f9 d7 r" [0 ]
7 B4 w: }4 K8 ~* ]/ O9 z
幸运的是Lucas公司的游戏Fans很多,甚至还成立了一个专门的网站LucasHacks(http://scumm.mixnmojo.com)用来讨论怎么修改其出品的各种游戏。我所需要的游戏文件格式的文档全是出自此网站,从而为汉化工作提供了极大的帮助,节省了很多时间,在此表示万分感谢,向那些撰写文档的前辈们致敬。 , o" V5 @6 ^; T2 g9 W

/ _$ `- e) |6 X: b2 R  ?, T3 t0 q  
& O' a  s* |  C8 t. l6 B' B' j. T
% x7 o6 t1 [. j# D& e下面针对GF开始介绍用到的几种游戏文件格式
7 @9 d+ l5 a$ ]+ I* |+ S3 J+ p) D+ g% [! ~3 G
1..tab文件格式 0 k. p4 b6 }; `: d8 D
. u- |: P. R+ f
是存放游戏所有英文脚本的文件,文件内容是加密存储的,用一般文本编辑器打开是看不到任何可用信息。解密内容的方法是对文件所有字节与0xDD进行异或操作。
5 Q* l% e( r4 W, S: V5 W8 j- y: u以下是解密文件的源码(C#):
5 @4 |' J4 k0 `5 U- U
& A! l& _( `* R2 W1 M3 D5 e+ o! k7 X3 T; [6 l

; j$ Z; ^! V- M: J$ Pprivate void button1_Click(object sender, System.EventArgs e) ( Y- q1 j) q/ b. b
        { + ^- _1 ^9 J4 O* s) J; q! e& Y7 y
            // Create the reader for data.
! c8 y+ c4 g- L2 }% v; F            FileStream  fs = new FileStream("c:\\grim.tab", FileMode.Open, FileAccess.Read);
6 ~. v  ?$ ^  w& u4 T            BinaryReader r = new BinaryReader(fs);
& k- x# q0 K" ^% z! f0 d
" s( y  j/ M$ f! U( q% u4 O( q. F            FileStream fs2 = new FileStream("c:\\text.txt", FileMode.Create);
3 s; g! W  o6 Q/ W) F( N! i* T' O* c            BinaryWriter w = new BinaryWriter(fs2);
9 b+ r' p: S+ g1 C! g8 |4 C            fs.Position = 4; $ A6 b2 k& O1 Y/ l$ v8 B
            while(fs.Position < fs.Length)
& w9 N4 l9 m+ g1 [! O6 A& a& |            {
5 u  O0 b: r& b7 h) J" z( K                w.Write((byte)(r.ReadByte()^ 0xdd));
8 g4 H$ B* X" k% I) b7 o$ G            } - v* m- H4 t  C+ [: B  g
            r.Close();
- x, I# S. A" N0 R* B# M            w.Close(); . A' c5 V2 U8 S" @  \
            fs.Close(); 1 U( l% I) G. g
            fs2.Close();
' w& h8 Z3 `' S  F6 l" k
( S2 \4 q, ~/ F3 Q' m  z        }
. y7 p  A) ~2 S6 L: C# {& a& @1 a5 }6 [( F# R, y: u/ X
解密后的文件内容就是一般的文本,可以看到所有游戏对话都在其中。下面节选文件内容的2段进行分析: ( o& j8 k4 ^3 C, m3 L, I6 v; q
4 A2 s! `! d) J& m
' c/ `8 ]1 j! f5 Q2 X7 i' G* {: p
sito030  Oh yeah, yeah. Yeah. That is what I told him.
9 p  c+ b' |, G, |9 K) L$ R, X
, r- z5 S; h3 i6 msito031         Are you kidding me? 8 O, A) V: m" }3 x2 f5 l* g; ~8 |  _
, x. H9 ]: e* p) C
sito032  gave him the idea in the first place! - q% y4 x/ W; \: I- J! X8 C+ @

, f6 q# c, d  e: }( B可以看出左边是说话人的名称标识,右边是说话的内容,分割这两者的是看似一个空格,其实是ASCII码表中的制表符Tab,16进制表示是0x09。
9 l6 o+ m+ c( @
7 ?0 ^8 |0 l: S, Y3 Z* B0 o对游戏角本的汉化修改此文件的内容为中文就可以了,还有一点值得注意,修改完此文件后无需再对其反加密,只要将解密的文件保存成以前加密文件的文件名覆盖即可。应该是游戏运行时候会对文件是否加密进行判断
4 K  Y  c2 f0 O5 B. l" I- V. P" W: R1 ], W
2..lab文件格式 ( m4 q8 G" |! s2 v9 x  f' F

# s$ Z0 M; n# _* `- q/ c是游戏的资源文件格式,游戏所有的资源声音、图片、动画、全存于此。它很类似于常用的压缩文件的格式,如zip、rar,作用是把很多文件压缩成一个文件,需要用的时候再解压出来供使用。Lab文件也是这个用途,它把很多用到的声音、动画等文件放到一个lab文件中,供需要时调用。Lab文件不对文件进行压缩,只是简单地把所有文件头尾相连,保存成一个文件而已。
+ ]6 F6 t9 }5 A" Q; s) ~) B. u0 \3 E6 \+ {* U  V( l
Lab文件由文件头、文件偏移量表、文件名列表、文件物理存放块组成。以下内容选自LucasHacks的文档
4 Z  a5 f! C% X) C9 d% W* E, U  i
/ }4 V" l  ?) e- G5 ~3 H(1)    文件头
* K3 Z1 e3 O3 C! l6 G1 q( Q3 _3 @5 Q
  ! l7 @/ f5 p9 p
! T  A) R; K$ o
字段
: u- Q) G& @/ ], o6 B4 O3 [# }5 V 数据长度
7 ?  b" J8 q9 q1 f  _2 e 描述 $ n& ?: g4 w8 g" J9 Q! t

! i7 J. @  A* M6 oId
. B$ N! I! L. s Long(4字节) ; E* A: |9 U* C* l
文件头标识LABN 5 i, L" K8 q/ d, F, T. d/ N( u) T0 ]

' P$ _4 _& D, h/ ~% @Version
2 g1 `( A/ {+ e# L" Y Long(4字节) 7 _9 y# g9 f6 g( a# |0 v. E
文件版本号 1 _5 x+ H( z7 o) G9 y$ X

, [1 U5 S1 M6 ZFiles ! P  D5 K- C* B; Z" }& ^9 u4 |" x: l
Long(4字节) " B) a* L. _, Z( r2 {7 T
此lab文件内包含资源文件的个数
9 q5 Q' B3 B, z* _% | . l/ f4 r% I0 k4 p% q" h, m
a
. f* R+ P- q' ~" j9 e Long(4字节) ) w$ R4 s+ Q, b7 m! w0 q
未知 7 n2 {  \4 ^# h+ B9 V
+ k* o, K& r9 J1 F$ b
b / T8 m- _( b. d% }
Long(4字节)
' Z2 R3 Z% l' _ 未知
- b+ l. g' [3 u8 g
, z4 U  O* Z" M' u! Z  i( n0 M5 S2 b& ^8 e1 J+ f) u
(2)    文件偏移量表 & M: r8 V8 o5 M3 e

; j, `! z' y7 [* s  Z6 W4 f字段
  ?( d8 G6 U0 J 数据长度   \7 f" p% Z/ @3 N
描述 # D4 g# R, Y- A" r: T4 Y) \9 T# U
1 x, c: Z1 I6 p% B; q
Ofs 8 ]4 ]3 g4 S9 W' l
Long(4字节)
, n. @  Q8 D6 g7 q: c* s" Q 文件名偏移量,用来找到资源文件名称   k; k- J0 }2 s5 ]& I

& V! ?! S: {% h: }8 [& N5 K) _3 N" WOffset
4 I! `& \. S8 {: S3 p7 S Long(4字节)
4 j7 x. ]6 Z3 T( E1 U 文件偏移量,用来找到资源文件在lab文件中的相对位置
! A, S8 U' W9 C: i- R% Z& D" i' @$ j: Y - z5 @2 |" Y1 T6 K
Size ; s" I+ N6 Y8 o* H- a7 X
Long(4字节) 3 r5 N* v8 P: P
文件大小   ?1 K, u4 B' ?" y
- X# G7 c6 L( P6 O' c
U
2 {( j' j# \! U' y7 M Long(4字节)
4 y7 L! c' M' A 总是0 ; t) h" C8 }9 h5 {2 t
6 p* S! \. [. ^* K+ s3 E4 S- _1 D

. @2 f4 R7 p/ ]; p; h$ U(3)    文件名列表 / _4 {' c: ]" o# [+ f& u% f
% l3 n# A3 w# A
所有在lab文件中的资源文件的文件名,每两个文件名中间用0x00分隔。
. T! K4 h/ c# j+ A$ y! ~( Y2 E
' O" Y6 F- \' r/ `( K1 C) D5 d(4)    文件物理存放块 - M& s) r: w* {2 S5 W* `
/ c+ `# _; B" Z/ b9 }: ^( ?2 a( L: h
所有资源文件在此块中存放,首尾相连。 * g, o0 @- X3 \/ m

% E& I& U# S9 u9 o! c附上一个lab文件,可用二进制编辑器打开,对照结构,加深理解。 2 u+ C$ s1 \2 A; u7 K- r' [0 [
. K( N" e8 \) B3 n) @- U
Data005.rar
$ E/ R8 |7 ^/ o9 p: G
8 _0 S' q$ f9 c  z8 K/ i# n3.Laf文件格式 - H& }) w4 K; S6 V# \' m1 r9 R
6 [0 v$ _4 u. ^3 h
是游戏的字库文件格式,将会在字库篇作详细介绍。




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