最近抽时间看了一下埃及3这个游戏,又有了一个挺大的新发现。 1 e4 g0 }, D* H0 S* N( W6 R
以前我一直认为这个游戏是支持不解包的,但是一直没有发现正确的方法。
; V8 P! w& Y+ @+ J最近我再次研究的时候,我发现了一个以前一直忽视的重要文件 % Q: K |4 O o7 n: |4 A) a8 R. Z
\datas\CMN\CMN\INS\Install.ins
! g2 I; l3 Y1 t8 x$ b, y$ L
. a( v" H7 c: B/ e9 `' h0 }内容大致如下
- E# _: P- R, v- vSetGameVersion(1.0.0) 5 d! [) Z) B) ^
AddBigFile("cmn_cmn.bf",0,1) & p; ^6 q$ j: }; j6 E+ l% B
AddBigFile("cmn_med.bf",0,1)
6 ^* F- X4 K9 E- `8 m8 U# G' wAddBigFile("loc_UK_cmn.bf",0,1) : U* O3 U, Q! T3 w$ c
AddBigFile("loc_UK_med.bf",0,1) ' | f/ S1 W/ m% w P5 O7 W B6 H9 |" b
AddBigFile("cmn_cmn.bf",1,1) 0 w. V! k% X+ a/ B2 X
AddBigFile("cmn_med.bf",1,1) . |6 C* ?$ `4 J9 o
AddBigFile("loc_UK_cmn.bf",1,1)
# K$ i9 o L& o( z! {+ B% m+ ^AddBigFile("loc_UK_med.bf",1,1) % W4 b- v1 f0 e
AddBigFile("cmn_cmn.bf",2,1) " N: A7 w4 A1 f5 X7 W
AddBigFile("cmn_med.bf",2,1)
! ^+ s0 y9 X$ b( g- }AddBigFile("loc_UK_cmn.bf",2,1)
# c- d z' P5 O1 J. @AddBigFile("loc_UK_med.bf",2,1) 3 L* [& h- i' n0 f3 m' c
AddFile("TXT\egypteIII.bin",0,1) / e1 m) V7 ~- o, W i) q
AddFile("TXT\egypteIII.idx",0,1)
; w. E0 t( [9 h. ?- S$ \..... 5 I1 k0 P7 Y& z( x) W# I4 M
.....
# m5 K) T' M% {0 oAddFile("TXT\CINE_01.srt",2,1) " a9 B4 {5 p- N* a+ B
AddFile("TXT\CINE_04.srt",2,1) 4 G- C9 e# k" e! c5 I
AddFile("TXT\CINE_09.srt",2,1) + L. s$ z- `8 o
AddFile("TXT\CINE_11.srt",2,1)
" {/ `; p6 @+ v9 _AddFile("TXT\CINE_12.srt",2,1) . n7 i6 ]( _$ |' R3 F/ Z
AddFile("TXT\CINE_15.srt",2,1)
9 W1 O& i0 C4 H( YAddFile("TXT\CINE_16.srt",2,1)
9 M3 [' L: Q! T8 m" B* t8 f- LAddFile("TXT\CINE_17.srt",2,1) ( r1 N4 F* v1 c, w; w' j
AddFile("TXT\CINE_22.srt",2,1) 6 O' E& \% f. K, s, i( k
AddFile("TXT\CINE_24.srt",2,1) 3 }+ S8 {9 ^3 r: n/ O! Z
AddFile("TXT\CINE_31.srt",2,1) - a$ J( `- n( W2 i3 n
AddFile("TXT\CINE_32.srt",2,1)
3 a$ Q7 y* [6 z( G$ Q) \AddFile("VID\Cine_01.hnm",255,0)
+ T/ _. ?1 c/ r: P0 y! hAddFile("VID\Cine_02.hnm",255,0) + v$ @8 Z& |- V" P2 } r: z; M7 K
AddFile("VID\Cine_03.hnm",255,0)
. G& E% _& T% B5 `# HAddFile("VID\Cine_04.hnm",255,0) 0 L2 K7 ~8 ]6 r0 a- _
) {9 B3 c- z$ [; V
; h2 M7 N2 F) u7 L' m
这个文件的意思还是很好猜的:
# \; \) w% L: ]9 D第1个参数是文件名
% a; `- u9 _& ~2 O- d: N* U5 o2 r0 z& T; z" e# E& _
第2个参数表示读取源 - R# I S1 \ K; W3 y- ^* A* a
0 从cd1的bf文件中读取
" s5 L+ t" ?3 t: }/ h! |! {: \4 ?1 从cd2的bf文件中读取
8 @6 a; o, h I: s8 O: t; i2 从cd3的bf文件中读取 9 q& ~+ W; [9 ?6 g, f0 o$ y# j
255 从外置的loc相应目录中读取
: H! [7 s5 S: ^- L' B; x1 U0 u1 z2 M; z9 u" t+ a
第3个参数表示从bf包文件中读取还是从外置目录中读取
" M; C3 A# t, U0 从外置文件中读取
2 s0 O4 q4 O0 V# i+ ~' v9 Z4 k1 从bf包文件中读取 9 i$ B0 x4 D8 ~( T7 v
( f+ J% J' g' k( x这样的话,修改这个文件就可以使游戏免打包了。 1 q) M( c' y: g- a! q3 S# f2 M, Y
比如,要使视频字幕CINE_01.srt等外置的话,可以把
2 h, A d; Y! h; l) YAddFile("TXT\CINE_01.srt",2,1) : Q9 D3 }+ d) }3 _& j1 Y
修改为 6 `6 ~, \9 Z1 B& j8 p8 z I& q, Q# C
AddFile("TXT\CINE_01.srt",255,0) ) p( _( U; c% ^) X, W, b& f) U
( p+ J. P* ]# k: O4 f' |这样游戏就能从外置目录中读取视频字幕并显示了。
: `) ?6 e$ d: X2 n这个外置目录是\datas\LOC\UK\CMN\TXT
% D d) v: p0 ~( L8 d0 J1 L对话字幕的修改也是类似的,暂未测试,以后更新。 1 _( m2 U+ ?1 o3 l5 K4 j* Z/ q/ K
% s! v2 y$ ` }2 E' |2 \3 w2 b
附上抓图,以及修改后的Install.ins
" P! i) e0 D) }1 w 2 O+ m& r* D5 b- U- }; w I
; }- v( c' T1 X7 [4 F
-------------------------
/ P2 h& e# \( n- D2010.7.3 第2次更新 1 i+ e1 ^! j7 e
+ X9 e5 Q I6 L, V! B
分析了一下字幕文件的格式,格式比较简单,我先把格式写一下。
4 `4 L. j+ C' ^我准备自己写一个字幕文件的导出和导入工具,并能把肥牛生成的文件里的内容都给导入回去。 6 J; Q6 W: Y/ l I9 F; n
6 q! K, a2 A6 O) e8 K. M9 c字幕文件格式如下
6 n) ]9 I- X; g: j" ~字幕文件版本号 12字节 固定为STRv02.00.00 - B3 @/ J% \& g9 `
字幕索引的结束位置 4字节 真正的字幕从这个位置的下一个字节开始
$ H3 n) ^2 ~8 w2 G6 d字幕数 4字节 表明共有多少条字幕 0 o8 Z: `4 t5 X2 J* m# F& T
: Y2 D" N! v; ?* c" a
从后面开始每16个字节为1组定义1条字幕
7 e1 ]! k$ ?* u0 }; Z1-4字节 字幕序号
# W" o% i- ~9 e. y, l9 x5-8字节 字幕类型
7 B2 [8 \" Y4 [* z$ }5 H6 X9-12字节 字幕的字节数(这个字节数指可见字符外加3个0x00的字节数,最后还有一个0x00不算) " r) `5 q; K. A( W" C
13-16字节 固定为4个0x00 , x2 l6 F0 c, }; E
. n8 D: s6 n" J3 x
附上原版字幕文件供参考 |