最近抽时间看了一下埃及3这个游戏,又有了一个挺大的新发现。
% l* t* u( @& f# A6 p以前我一直认为这个游戏是支持不解包的,但是一直没有发现正确的方法。
! R* |5 K; j4 \5 w- |最近我再次研究的时候,我发现了一个以前一直忽视的重要文件
9 J2 X+ V2 d) G% N5 j J) q2 J' \\datas\CMN\CMN\INS\Install.ins
6 J, c- X' a3 ?$ h, K: U* I
5 e9 ~+ @: b1 s+ ~& p$ [3 Q内容大致如下 + \- B) a0 r8 P% n
SetGameVersion(1.0.0)
5 Y3 W3 @( N. K8 m" `" x3 @AddBigFile("cmn_cmn.bf",0,1) * [8 H9 p9 O( \% V& {: G
AddBigFile("cmn_med.bf",0,1)
* C( F- j* V# \AddBigFile("loc_UK_cmn.bf",0,1)
+ _( B( y6 T! k- wAddBigFile("loc_UK_med.bf",0,1) . M8 G* a$ n, M5 E
AddBigFile("cmn_cmn.bf",1,1)
7 P& o, Z1 w! {7 j1 eAddBigFile("cmn_med.bf",1,1) % ^# F: @: v5 c# n
AddBigFile("loc_UK_cmn.bf",1,1)
3 s b [& b. Q z0 ]AddBigFile("loc_UK_med.bf",1,1) 8 K% V$ h, s: N
AddBigFile("cmn_cmn.bf",2,1)
4 v4 C8 w/ R1 H' x6 rAddBigFile("cmn_med.bf",2,1)
8 i: h9 \' _1 u2 v$ x; GAddBigFile("loc_UK_cmn.bf",2,1)
( C/ ], S w, w& M; J. ~8 B1 Y* aAddBigFile("loc_UK_med.bf",2,1)
4 w* W! r. ^/ UAddFile("TXT\egypteIII.bin",0,1)
% ] E: M- L2 F5 IAddFile("TXT\egypteIII.idx",0,1) 7 ~' q/ H, B3 H/ n
..... ) G$ @0 Z$ [# @$ C# B& B9 _
..... . [2 l* l$ l% f4 `- R8 f
AddFile("TXT\CINE_01.srt",2,1) 2 z9 g) x% ?% S) i
AddFile("TXT\CINE_04.srt",2,1)
8 R# T# V+ Q9 J) n2 D' }AddFile("TXT\CINE_09.srt",2,1)
9 t1 }; Q* O! gAddFile("TXT\CINE_11.srt",2,1) a/ }9 p, I5 g/ a9 c' t1 l2 i- N
AddFile("TXT\CINE_12.srt",2,1) 1 a7 g% l" I7 _8 c9 z+ c ~
AddFile("TXT\CINE_15.srt",2,1) 6 i {5 d" Y. c- P4 V6 |
AddFile("TXT\CINE_16.srt",2,1)
' S% w5 A( W' i2 X; A) i7 ?( a6 PAddFile("TXT\CINE_17.srt",2,1)
: C" x2 S/ v" ~/ {8 pAddFile("TXT\CINE_22.srt",2,1)
- m8 @1 x$ ]) m- O Y( ` eAddFile("TXT\CINE_24.srt",2,1) ( r# g, t7 x9 ` u V
AddFile("TXT\CINE_31.srt",2,1) % L6 n( Y" b! P8 o& B5 y: r" N
AddFile("TXT\CINE_32.srt",2,1) 6 b- f: H* R" Z q2 }
AddFile("VID\Cine_01.hnm",255,0)
) u9 @+ w4 Y2 H0 j- E4 J+ ]AddFile("VID\Cine_02.hnm",255,0) / o3 N! \/ ]' a
AddFile("VID\Cine_03.hnm",255,0)
" s" o/ Q( ?5 v& GAddFile("VID\Cine_04.hnm",255,0)
6 ?8 A1 k1 r2 A# w2 r2 x7 I# W7 C p- @* C- Y i% i: K
! ^3 }) f, ?& q/ H
这个文件的意思还是很好猜的: / r" }$ W; t$ k2 a
第1个参数是文件名
" m8 N4 A& z2 h0 b5 L3 m5 a; ^& j5 b2 ^6 Y! S6 ]' m1 _$ c
第2个参数表示读取源
$ b/ K1 Y6 n7 W d. N, s' Q; D0 从cd1的bf文件中读取
3 s7 G& s7 Q8 A& @% j9 p1 从cd2的bf文件中读取
2 p! F" k4 n/ j7 @2 从cd3的bf文件中读取
' N4 s0 c1 ]. v255 从外置的loc相应目录中读取
* H0 s5 R- J6 w+ H4 M, b- h
2 k# ^1 C; ^( O& N/ S第3个参数表示从bf包文件中读取还是从外置目录中读取 / [2 a) s+ a+ ^+ m
0 从外置文件中读取 1 E4 |; G% g2 p
1 从bf包文件中读取 " K1 ~ Z/ [ U2 e2 f
8 O0 V; `- I3 D$ [这样的话,修改这个文件就可以使游戏免打包了。
7 t& R: o8 d9 }+ F6 Q比如,要使视频字幕CINE_01.srt等外置的话,可以把
" L! q y+ G; G' a) b$ hAddFile("TXT\CINE_01.srt",2,1) 4 X* K3 Y4 Y* @5 k# G
修改为 $ ~/ K% Q: f, E! \4 D; k
AddFile("TXT\CINE_01.srt",255,0)
& ?. J. f0 h# ~( b& r. v A' b+ m: U' B' M# H& T; L" A1 L( ]$ r- s9 y
这样游戏就能从外置目录中读取视频字幕并显示了。
* j" h% W6 P. z0 n这个外置目录是\datas\LOC\UK\CMN\TXT 1 ~/ U9 _! n% s& q+ R9 \) U
对话字幕的修改也是类似的,暂未测试,以后更新。 ) J9 G' G$ s/ ?; W3 e& x
: Z7 g; C0 R/ M1 U! r- |附上抓图,以及修改后的Install.ins
( p p7 W }2 O& @! @% c- m; z ) v5 l2 F# p: u6 S; G
- O4 ~& D( p% ?9 U2 ?5 f1 y4 f-------------------------
' F7 o; W# l7 a. M2010.7.3 第2次更新
' k0 V7 T* l, ~8 V' R9 l0 p% \: p/ M; _/ D
分析了一下字幕文件的格式,格式比较简单,我先把格式写一下。 / l" s, F* K5 H- F2 X
我准备自己写一个字幕文件的导出和导入工具,并能把肥牛生成的文件里的内容都给导入回去。
# v; {0 } J' U5 a9 K W) B3 ]
" i/ B, N$ u( n4 F8 ?( u字幕文件格式如下
3 f- V/ ?. e8 t, z+ d字幕文件版本号 12字节 固定为STRv02.00.00
( _: c7 }, Q$ c4 s8 _8 u9 f3 U7 D$ {字幕索引的结束位置 4字节 真正的字幕从这个位置的下一个字节开始
2 u; J0 I! q4 t# p字幕数 4字节 表明共有多少条字幕 ]$ ~. m9 W4 d0 t6 r6 y
/ r: O l3 d6 K2 M& s8 g从后面开始每16个字节为1组定义1条字幕
0 }/ n$ E0 {8 |3 W0 o% ] l) c1-4字节 字幕序号 # |' o. D! B% ~# q
5-8字节 字幕类型
- I- q$ F) u4 K$ q( H$ ^9-12字节 字幕的字节数(这个字节数指可见字符外加3个0x00的字节数,最后还有一个0x00不算)
; h% n& }/ S# a% d3 q) f; B13-16字节 固定为4个0x00 ' M! v- d) }) [$ h
8 `9 r# [5 f. w! \3 B0 h6 C2 l
附上原版字幕文件供参考 |