最近抽时间看了一下埃及3这个游戏,又有了一个挺大的新发现。
- v3 y& g4 o- i P以前我一直认为这个游戏是支持不解包的,但是一直没有发现正确的方法。 : U/ F, W6 `2 j% c
最近我再次研究的时候,我发现了一个以前一直忽视的重要文件 " v" |' p2 B* i. ~1 V( ?# o1 a
\datas\CMN\CMN\INS\Install.ins 0 ~/ l3 U+ O+ H3 m6 T$ B
6 y$ R: @& Q/ a* x# V4 Z
内容大致如下 ( u1 D4 \ K0 x* `2 a
SetGameVersion(1.0.0) ! |- @* k2 {4 J2 q5 Z+ A+ Y) |
AddBigFile("cmn_cmn.bf",0,1)
# S0 p+ o" a7 r$ Z a5 e4 iAddBigFile("cmn_med.bf",0,1) 7 T) [/ ?+ ^- j$ @
AddBigFile("loc_UK_cmn.bf",0,1)
* Q6 S& c* k5 g9 F) \AddBigFile("loc_UK_med.bf",0,1) 7 B: r* j. h4 I" P1 I
AddBigFile("cmn_cmn.bf",1,1) ( O1 @' l7 d h$ r
AddBigFile("cmn_med.bf",1,1)
. K# \1 A0 s0 g' p+ EAddBigFile("loc_UK_cmn.bf",1,1) ' t! s' |) g5 G' P: x n
AddBigFile("loc_UK_med.bf",1,1)
l G7 u Q. K/ T) uAddBigFile("cmn_cmn.bf",2,1) 2 Q/ k2 D1 N: @ h. S; v
AddBigFile("cmn_med.bf",2,1) , j# e* x9 i/ s4 r# e: y& }/ F+ }' d
AddBigFile("loc_UK_cmn.bf",2,1)
+ y/ ] ^3 B- LAddBigFile("loc_UK_med.bf",2,1)
1 T6 u) l* e) J$ O/ [AddFile("TXT\egypteIII.bin",0,1) ( {( v) ~: \0 }
AddFile("TXT\egypteIII.idx",0,1)
. [) c5 O; C/ c% C4 P, C3 g/ v$ o..... 7 l9 k1 h% S7 L* k$ h2 `# j
.....
( B" r: }$ J% H' f, ]& pAddFile("TXT\CINE_01.srt",2,1)
. P1 U$ ?1 ~0 u: N }5 x$ `! OAddFile("TXT\CINE_04.srt",2,1)
4 g8 W- C* S; F1 U0 WAddFile("TXT\CINE_09.srt",2,1)
1 _# w. p* M0 `9 nAddFile("TXT\CINE_11.srt",2,1)
! V3 C0 p2 u! o% mAddFile("TXT\CINE_12.srt",2,1) . }8 y+ u) P* k' A" F5 p
AddFile("TXT\CINE_15.srt",2,1) ( ]/ o& v1 \: S$ ?: `, A
AddFile("TXT\CINE_16.srt",2,1)
L! Z3 L" `% Y4 ]7 BAddFile("TXT\CINE_17.srt",2,1)
- Z1 ~, @8 L, {; oAddFile("TXT\CINE_22.srt",2,1) ) m5 I' I Z/ a6 {& F
AddFile("TXT\CINE_24.srt",2,1)
- C |4 R+ R. Y$ U" @AddFile("TXT\CINE_31.srt",2,1) * l$ n/ c* S+ A( }9 u
AddFile("TXT\CINE_32.srt",2,1) 7 }5 ]8 K$ M* B: K/ o/ Q U2 m4 F
AddFile("VID\Cine_01.hnm",255,0) % ~. E3 \: d3 a2 Q7 ?
AddFile("VID\Cine_02.hnm",255,0) _: f( I) V, N' Y
AddFile("VID\Cine_03.hnm",255,0) ; U' Z' z. E: H" {" ^! F& g
AddFile("VID\Cine_04.hnm",255,0) . @4 r: ~" R+ v! U% L# f
; _( H, U9 k& H
K1 I f2 Q5 C4 R5 b% y' D
这个文件的意思还是很好猜的:
+ N- l- Z/ y- x第1个参数是文件名
- }& B+ ?; ~$ p1 a6 V+ C/ {
, e9 c H2 \; y& [ g: q; T) J第2个参数表示读取源
0 G N) u$ _; \' a0 从cd1的bf文件中读取
$ h& e/ K6 A% u6 d$ ~1 从cd2的bf文件中读取
" {* a: v: |& c+ [3 y9 T2 从cd3的bf文件中读取
: j/ u0 b$ O% G# A9 G' Y255 从外置的loc相应目录中读取 , S0 }1 `* N2 f+ v0 ]# R
9 r" b' k) y- n# I3 {6 n u N
第3个参数表示从bf包文件中读取还是从外置目录中读取
! d* m+ u0 |0 s2 f3 ^0 从外置文件中读取
v: _1 w& ^+ X" k$ u1 从bf包文件中读取
: Y, o& J$ x2 E$ ~6 T
& {* s0 O4 M W; M, [1 ?这样的话,修改这个文件就可以使游戏免打包了。 * S f2 I* p6 r5 r) M) ]
比如,要使视频字幕CINE_01.srt等外置的话,可以把 0 b' M$ M& U, F. d- z
AddFile("TXT\CINE_01.srt",2,1) , F6 G0 z$ o% u7 W
修改为 8 M$ Y" g6 E* L# H' ^
AddFile("TXT\CINE_01.srt",255,0)
* W1 X5 c* @* ^5 F( z O
* P! e9 _( p5 T+ L这样游戏就能从外置目录中读取视频字幕并显示了。 ; p+ Z1 b1 I! v S% `" q( y) b0 k
这个外置目录是\datas\LOC\UK\CMN\TXT
/ Y% g1 e& }4 N$ `* ?- R- B对话字幕的修改也是类似的,暂未测试,以后更新。
% i' S1 i: z- ~0 h) Q8 j+ H% X) F) D' g9 J; s
附上抓图,以及修改后的Install.ins
" R) x. y2 w9 b7 T8 B) I+ H , x% G6 ?; w/ Z. T8 [1 ?
. l' x9 d7 `2 B u" s; A
-------------------------
2 p3 T# r6 e9 A; e# w7 ?* F2010.7.3 第2次更新
" W9 J1 e: }: K' g: i5 O2 J: m' o, u3 Q& j1 }
分析了一下字幕文件的格式,格式比较简单,我先把格式写一下。 ' M! F- q! _( L8 C- D% m
我准备自己写一个字幕文件的导出和导入工具,并能把肥牛生成的文件里的内容都给导入回去。
5 B% [; {: w3 P( K: y$ c v
* h! r+ Z' c% \* ^% X, `4 i* ~字幕文件格式如下
/ k& h3 x& r2 e/ H2 m2 G5 M2 N( d字幕文件版本号 12字节 固定为STRv02.00.00 7 M1 \3 S* D* h: l V
字幕索引的结束位置 4字节 真正的字幕从这个位置的下一个字节开始 " K$ @9 t; M& }: f2 l( w
字幕数 4字节 表明共有多少条字幕
, F" Q* I' c! v7 z9 b/ R
/ f( d2 P, H! q4 L/ E) H从后面开始每16个字节为1组定义1条字幕
+ D4 K. v; Q, Z6 E: W- |+ w1-4字节 字幕序号 & o2 ]' O( U+ u8 D( W5 Y$ \
5-8字节 字幕类型
1 k- {2 h9 H) {" w& F% U- ]6 G9-12字节 字幕的字节数(这个字节数指可见字符外加3个0x00的字节数,最后还有一个0x00不算) # w7 ?4 R7 {& S- r* o, q
13-16字节 固定为4个0x00
9 M& k9 ^' G2 H- K e; o9 T5 E9 b
附上原版字幕文件供参考 |