最近抽时间看了一下埃及3这个游戏,又有了一个挺大的新发现。 + k1 A x/ o, O7 A2 I3 g9 d
以前我一直认为这个游戏是支持不解包的,但是一直没有发现正确的方法。
6 O6 u. Y' {9 s) u$ V最近我再次研究的时候,我发现了一个以前一直忽视的重要文件
- z% Y l& B2 E/ W8 B\datas\CMN\CMN\INS\Install.ins
4 m* S& i: F) J9 Q$ I$ T" ^5 a5 n U% b/ V% x1 Y8 m7 {; X
内容大致如下
, e' T* R. ]& JSetGameVersion(1.0.0)
8 q( K" v4 F% n8 `- R& D; J" w1 U+ `AddBigFile("cmn_cmn.bf",0,1)
4 S/ y0 n s! N! z& Z8 eAddBigFile("cmn_med.bf",0,1)
+ |# M2 K% Q" h8 A) |AddBigFile("loc_UK_cmn.bf",0,1) $ l2 F# \! @9 @6 y H+ q. a2 L
AddBigFile("loc_UK_med.bf",0,1) 9 g& z) T8 T$ N) I5 v
AddBigFile("cmn_cmn.bf",1,1) * G* V7 A1 i& l0 X. ?. [4 Y! B6 L4 a
AddBigFile("cmn_med.bf",1,1)
: |7 T: C1 i8 WAddBigFile("loc_UK_cmn.bf",1,1) " S k) g& _. N4 \. l8 E
AddBigFile("loc_UK_med.bf",1,1)
; G6 M+ _0 ?$ _( ?AddBigFile("cmn_cmn.bf",2,1) / h* j8 P5 F1 B- K+ z; N9 F
AddBigFile("cmn_med.bf",2,1) $ ?0 j( w3 K6 L; j4 G! W8 j2 a( A
AddBigFile("loc_UK_cmn.bf",2,1) " b5 N( H5 m" ~& X. G
AddBigFile("loc_UK_med.bf",2,1) 7 P8 o; d0 b3 w1 L
AddFile("TXT\egypteIII.bin",0,1)
D p/ S; O; B" X( e7 g+ KAddFile("TXT\egypteIII.idx",0,1)
" |$ M3 l5 q. B' M.....
* O5 j! r, S- F/ o% k. Q0 @..... # `/ z" b! {. @7 R
AddFile("TXT\CINE_01.srt",2,1)
8 M* t- e) m: n0 IAddFile("TXT\CINE_04.srt",2,1) 0 F" h) p# V/ r
AddFile("TXT\CINE_09.srt",2,1)
, B) |, A" B; j1 C4 \AddFile("TXT\CINE_11.srt",2,1)
0 P. a% S( x+ K( Z3 K( ^AddFile("TXT\CINE_12.srt",2,1) ' E. ]4 ^' [ B
AddFile("TXT\CINE_15.srt",2,1)
a1 E4 k$ [2 `8 F# P S1 ^" yAddFile("TXT\CINE_16.srt",2,1)
7 c1 x1 h: D3 t/ @AddFile("TXT\CINE_17.srt",2,1)
9 W5 v6 ]& i! l9 y+ FAddFile("TXT\CINE_22.srt",2,1) 3 @" e+ f) n& W \
AddFile("TXT\CINE_24.srt",2,1) ; c0 E) Q1 u( l; P9 T! g
AddFile("TXT\CINE_31.srt",2,1)
6 a1 v- h H6 _. K1 aAddFile("TXT\CINE_32.srt",2,1)
8 A6 R I/ c% P8 D* VAddFile("VID\Cine_01.hnm",255,0) ' t g& P/ y# V4 i% d1 a
AddFile("VID\Cine_02.hnm",255,0) # R) L0 S3 L4 [# X) l
AddFile("VID\Cine_03.hnm",255,0)
( h9 K, ~: p/ ?% N6 ]" SAddFile("VID\Cine_04.hnm",255,0) 5 F" F8 C% ? \1 u9 G' p
4 d7 d2 f( O% v/ B
4 [# ?' }2 v; M. O这个文件的意思还是很好猜的: 8 f( d2 u: z. l3 E
第1个参数是文件名 : s: Z3 n% K6 a( o! ^
4 O K1 M+ |; r2 B" ~, \第2个参数表示读取源 5 |/ M6 o+ C5 ~. j. i+ o- \
0 从cd1的bf文件中读取 2 R) ]' F4 m: a, N& N7 z0 U
1 从cd2的bf文件中读取
! F6 i1 j5 z4 o' ]8 S6 B, t2 从cd3的bf文件中读取 ( C5 ]# a# x' w3 w2 M
255 从外置的loc相应目录中读取
+ h) y- F* q! F% o/ E) Y; i
9 _; V# q: N8 N7 |9 ]第3个参数表示从bf包文件中读取还是从外置目录中读取
; w6 h7 J0 R; v6 @6 g( M( A0 从外置文件中读取
! H* O+ J c0 i# n: r T1 从bf包文件中读取 6 m, I* D& V) Y! n9 u" T& C6 y
5 B0 w+ N8 m) N这样的话,修改这个文件就可以使游戏免打包了。 3 V0 e( @% X7 Z5 I W7 n! \# ^/ p7 c
比如,要使视频字幕CINE_01.srt等外置的话,可以把
. j l* ~; B) R, [& D; j# bAddFile("TXT\CINE_01.srt",2,1) " h# A, P( ?0 N, D: [
修改为
3 e" l u9 n; V, f) [2 }/ wAddFile("TXT\CINE_01.srt",255,0)
! i: a2 s3 [; ^" d4 [. j
1 y& E' M5 @. ?这样游戏就能从外置目录中读取视频字幕并显示了。 0 x, L- q% k T7 f" c+ s
这个外置目录是\datas\LOC\UK\CMN\TXT
) B+ _, {+ j' W, ^对话字幕的修改也是类似的,暂未测试,以后更新。
; d4 K. D+ N( V" X5 R" ~
9 p5 \% K. }+ ?& x2 k# |9 z, C附上抓图,以及修改后的Install.ins ; k& y F8 O0 r: H% K
% D6 [& N7 p4 D n
0 z& e7 I# o/ r+ v5 x4 c& z
-------------------------
9 N1 y. U+ H! R3 b: @4 x2010.7.3 第2次更新 1 N- @" z% V: E# W. D
) p5 M; ~ k# j2 u2 q
分析了一下字幕文件的格式,格式比较简单,我先把格式写一下。 " j' v/ F1 d: ]4 u
我准备自己写一个字幕文件的导出和导入工具,并能把肥牛生成的文件里的内容都给导入回去。
% d) m7 t N, U, {8 [1 x, b+ C& ?4 F- ^. X) H
字幕文件格式如下 3 W, H8 ?: J( j; v1 V- m8 a
字幕文件版本号 12字节 固定为STRv02.00.00
0 s2 w. m& ^ ]/ z' d9 F8 P字幕索引的结束位置 4字节 真正的字幕从这个位置的下一个字节开始 5 f& B! ?( n0 e' ~/ V1 f+ L
字幕数 4字节 表明共有多少条字幕
) d2 s, T+ q2 p: B. x: S' x0 c4 `4 P9 v; d) i! o; ^8 \
从后面开始每16个字节为1组定义1条字幕
/ R3 b, k2 V0 z2 @1-4字节 字幕序号 # e# i+ ]# K# z0 i
5-8字节 字幕类型
- G' g/ {7 V3 o7 l) B+ M& V9-12字节 字幕的字节数(这个字节数指可见字符外加3个0x00的字节数,最后还有一个0x00不算) 8 b8 l! P# P* }: {# a' r2 z
13-16字节 固定为4个0x00 0 q3 L9 Z6 [: J6 k# X8 X" s
5 b4 z2 r6 {. N; O+ Q3 |
附上原版字幕文件供参考 |