最近抽时间看了一下埃及3这个游戏,又有了一个挺大的新发现。
. f- ~2 M6 a9 E `, ]% d$ Y, K( i3 M# d以前我一直认为这个游戏是支持不解包的,但是一直没有发现正确的方法。
, U' {% W Q6 W [, z- `9 `2 U/ _# e2 g4 h最近我再次研究的时候,我发现了一个以前一直忽视的重要文件
1 F+ r8 l+ M4 y2 |\datas\CMN\CMN\INS\Install.ins
* i- e. k6 _% v1 a: V. o( h3 l6 U; _& S3 b9 Y
内容大致如下 & e" o9 j! c! Z8 v+ F9 `7 `+ ?
SetGameVersion(1.0.0)
! ]5 u2 R# ?4 n# R& y6 H' V: W4 OAddBigFile("cmn_cmn.bf",0,1)
8 J) I" W( r. {: l) oAddBigFile("cmn_med.bf",0,1) ' X0 V$ I6 ]0 y$ T( t6 s6 o' `; Y+ ]
AddBigFile("loc_UK_cmn.bf",0,1) " n! r H5 Q' w2 X0 _+ E3 d0 E
AddBigFile("loc_UK_med.bf",0,1)
s# j& y" ^; _5 f6 o/ N KAddBigFile("cmn_cmn.bf",1,1) : F# W5 a" M1 H! I* z# Z
AddBigFile("cmn_med.bf",1,1)
i) u0 K# a% j6 A" IAddBigFile("loc_UK_cmn.bf",1,1)
& ~5 V4 a& }( pAddBigFile("loc_UK_med.bf",1,1)
+ g. p8 C2 I6 l; JAddBigFile("cmn_cmn.bf",2,1) 4 }" V1 ~' o P/ W4 |
AddBigFile("cmn_med.bf",2,1)
* {' x- ^' V5 r* `5 U8 Y6 YAddBigFile("loc_UK_cmn.bf",2,1) 5 d7 H+ ^# L# Y$ J7 I2 q
AddBigFile("loc_UK_med.bf",2,1) : |) T" e3 h( K4 t8 x
AddFile("TXT\egypteIII.bin",0,1) 7 N2 }- W) x+ F9 G
AddFile("TXT\egypteIII.idx",0,1) 2 Z1 M% f6 c: F0 m! n
.....
) G8 O6 c3 m( k9 S" d7 X3 e.....
+ Y6 _' A: @7 D0 \+ ~$ }AddFile("TXT\CINE_01.srt",2,1) % ?% @, I; o( X# V7 ]/ ?- @
AddFile("TXT\CINE_04.srt",2,1)
6 N3 x% A! b* v" S7 M. q+ TAddFile("TXT\CINE_09.srt",2,1) 4 }& X. G3 G N) X: C1 |7 I# \
AddFile("TXT\CINE_11.srt",2,1)
/ d3 c9 N7 I. V9 w$ F- rAddFile("TXT\CINE_12.srt",2,1) ' P" O5 i& x6 c/ E. F4 J6 C
AddFile("TXT\CINE_15.srt",2,1)
6 @/ |% [; m( j, z$ |AddFile("TXT\CINE_16.srt",2,1)
( g! L; L2 I2 uAddFile("TXT\CINE_17.srt",2,1)
" Q3 O. m! Z y$ n5 w1 kAddFile("TXT\CINE_22.srt",2,1)
! z/ ] a2 M1 ~, K& ^7 p0 jAddFile("TXT\CINE_24.srt",2,1) " |! i2 U3 _6 a2 ]( L r& G4 u5 T
AddFile("TXT\CINE_31.srt",2,1) 9 h) Y. V: H- y
AddFile("TXT\CINE_32.srt",2,1) 4 b* f, x7 _! y) B/ Y$ H( Y
AddFile("VID\Cine_01.hnm",255,0) ! @; ?( ~" m0 t, ?, u! ?3 j; z3 g
AddFile("VID\Cine_02.hnm",255,0) 0 {. e7 j% B* g5 x7 O* o
AddFile("VID\Cine_03.hnm",255,0) M/ S$ H! X6 _, G
AddFile("VID\Cine_04.hnm",255,0) ' R) T5 Z$ s$ g7 b* E4 P% k$ @" H+ T7 d
5 u0 B% I4 E# ]4 S% ]) P9 }7 l% f2 V2 }5 F+ a
这个文件的意思还是很好猜的:
9 e7 E j" X( v# v: [$ P第1个参数是文件名 7 U+ J& ]; v1 I L: t# ?
6 k" \4 }" p2 U4 x( |7 n第2个参数表示读取源
$ k$ R; k! p2 M7 {4 f# [% U0 从cd1的bf文件中读取
; j9 S% u7 Z5 ?# B2 F1 从cd2的bf文件中读取 0 G( z% G: t7 s4 ?4 N: ?( T' R0 o
2 从cd3的bf文件中读取 $ }8 U# @0 \1 F1 Y
255 从外置的loc相应目录中读取 % h3 t/ I+ Q! {8 C
) _% i f6 S. R& L- z% P; v第3个参数表示从bf包文件中读取还是从外置目录中读取 & |4 Y2 O3 }8 A. t9 Y$ j; }
0 从外置文件中读取 * d% K, {* T5 O5 l" o* f+ D% R( ~
1 从bf包文件中读取
2 r, \; a7 e& d* ~, N6 R! s( [; w( U2 U/ U. N j" _& B
这样的话,修改这个文件就可以使游戏免打包了。 ( @% G( V0 N7 _( z' G. y
比如,要使视频字幕CINE_01.srt等外置的话,可以把
: ^+ V% i& q; J' Y7 N hAddFile("TXT\CINE_01.srt",2,1)
& S" h1 b1 x& M修改为
R3 s. v/ m T3 i( J) z UAddFile("TXT\CINE_01.srt",255,0) 5 e3 i7 |+ Z/ x# A
% a. R. _- r, [- r3 a' {8 M这样游戏就能从外置目录中读取视频字幕并显示了。
@6 x5 d0 B1 P" m% [/ d这个外置目录是\datas\LOC\UK\CMN\TXT
' i: Y) @0 Q+ ], z( x% x对话字幕的修改也是类似的,暂未测试,以后更新。 * ]- Q% l$ y; G, E, L
) i# _8 b7 m* h) N3 C2 m附上抓图,以及修改后的Install.ins
# _, U+ A) g6 P0 v ) h2 D+ z8 q! @5 n
6 S6 Z7 H5 E. |: m1 d
------------------------- , G: I% x j7 Q7 d3 p1 e( |, Y
2010.7.3 第2次更新
Z+ V4 b, {. m7 N7 ^1 t! x) U7 @! @! y8 c0 @
分析了一下字幕文件的格式,格式比较简单,我先把格式写一下。
. g3 b% X4 q1 J我准备自己写一个字幕文件的导出和导入工具,并能把肥牛生成的文件里的内容都给导入回去。
* x+ s; C, c% @. p" r1 b% P( u9 I5 J# a: w8 j' a. Z
字幕文件格式如下 . o9 m* z% `1 P6 b0 N
字幕文件版本号 12字节 固定为STRv02.00.00
" I+ d! O& w9 J# ]! S字幕索引的结束位置 4字节 真正的字幕从这个位置的下一个字节开始 / ?" R& t, ~8 E& y) C# |
字幕数 4字节 表明共有多少条字幕
! w! n3 ]5 m: @/ ?; Z7 d1 L. B( [' I0 A D! o& H. u( {: ~
从后面开始每16个字节为1组定义1条字幕
9 S/ Z; W) d" n }. p% K' `: I( V1-4字节 字幕序号
! X; M/ V5 t5 z7 h5 _8 f5-8字节 字幕类型
) e* u7 j6 v& _7 W9-12字节 字幕的字节数(这个字节数指可见字符外加3个0x00的字节数,最后还有一个0x00不算)
# f1 s! @+ V' K2 |& g# r13-16字节 固定为4个0x00
1 h* y; k3 p9 H3 s( u
* _ U: i: T7 }$ _2 u4 M; Q" n$ r附上原版字幕文件供参考 |