最近抽时间看了一下埃及3这个游戏,又有了一个挺大的新发现。
. p; V& }# q0 Z& j! G4 V; v, C以前我一直认为这个游戏是支持不解包的,但是一直没有发现正确的方法。
! u3 Y7 {8 c* H# E4 Y4 ~最近我再次研究的时候,我发现了一个以前一直忽视的重要文件
% N4 {0 M- Y. c' ]+ t$ F: O3 `\datas\CMN\CMN\INS\Install.ins 1 z4 Y# U- e/ O, A# G; e4 p
6 @$ j8 i$ {* ^# o: {: \% i内容大致如下 ; g1 w( R0 e, m# r1 _- Q3 H4 g
SetGameVersion(1.0.0)
( c. G6 D0 L7 W7 \AddBigFile("cmn_cmn.bf",0,1) ( ^- r, [) B( L, D! i5 ?' K$ T
AddBigFile("cmn_med.bf",0,1) 2 J. _; S, j1 b
AddBigFile("loc_UK_cmn.bf",0,1)
& w, O. M% x8 u" g2 @- VAddBigFile("loc_UK_med.bf",0,1)
' c# c, `) c! BAddBigFile("cmn_cmn.bf",1,1)
. y; D3 k" X8 ?AddBigFile("cmn_med.bf",1,1) ' r8 p! p: c7 u# v
AddBigFile("loc_UK_cmn.bf",1,1) # ~6 P1 ?/ r2 Z# }) ^# H% z
AddBigFile("loc_UK_med.bf",1,1) " m* O: _1 y0 }( R
AddBigFile("cmn_cmn.bf",2,1) " X+ ], `5 ~/ u8 y3 S# N6 G6 ]
AddBigFile("cmn_med.bf",2,1) : s+ T/ U4 c3 Q3 x, `9 i x# `
AddBigFile("loc_UK_cmn.bf",2,1)
6 Q# |- {9 e, S; T: q L @1 m- r4 ZAddBigFile("loc_UK_med.bf",2,1)
; f: F4 ]+ _/ g# C. P; d& ~9 r8 {! J6 [AddFile("TXT\egypteIII.bin",0,1)
4 G. Y: R' D5 E( g5 d& Z6 fAddFile("TXT\egypteIII.idx",0,1) 8 K6 }) K9 _& m1 T8 l
.....
* k; r" t" Z% f& }' q2 |.....
+ u. e- a+ j/ NAddFile("TXT\CINE_01.srt",2,1) # |6 O3 l% B+ l- v5 w
AddFile("TXT\CINE_04.srt",2,1) 9 j7 U) q0 g; K0 @" Q* [5 W7 T- d
AddFile("TXT\CINE_09.srt",2,1)
; z( C6 M7 q# Z1 C0 [1 e+ `( }( MAddFile("TXT\CINE_11.srt",2,1) 9 q+ S2 [7 D( }* Y
AddFile("TXT\CINE_12.srt",2,1)
8 c/ B' E; _1 Y6 t& ]AddFile("TXT\CINE_15.srt",2,1)
. }! ?2 c+ k9 ^AddFile("TXT\CINE_16.srt",2,1) E" j& Z: H, Y/ o/ C j: o% S8 y
AddFile("TXT\CINE_17.srt",2,1) ! n* a+ D2 {$ `' s/ z" {) _8 N& ?
AddFile("TXT\CINE_22.srt",2,1) k' I* e( n; l: X8 H D
AddFile("TXT\CINE_24.srt",2,1) 9 C! b# |. g& ^% r
AddFile("TXT\CINE_31.srt",2,1)
0 J# {, e, O! y/ z5 q% g! rAddFile("TXT\CINE_32.srt",2,1) ! {* v6 Y4 a: ?
AddFile("VID\Cine_01.hnm",255,0)
/ b$ H$ {0 F! HAddFile("VID\Cine_02.hnm",255,0)
. J: Y7 x; B- r/ R/ }- u8 OAddFile("VID\Cine_03.hnm",255,0) , h3 s2 D) \8 A% R \* z1 n9 p
AddFile("VID\Cine_04.hnm",255,0) 3 r9 R# d! _2 H. E; V9 z, ~
, Y9 d1 {$ |! i* ]3 A+ v6 _! D
2 R% ?9 P( z7 q8 h8 ?6 j) h; g这个文件的意思还是很好猜的: 0 u4 R! J( Z C: T- V
第1个参数是文件名
' P$ D" q. m5 s1 C& w8 O$ A* L
: q* x2 ]+ u+ G( R9 _5 n第2个参数表示读取源
8 V2 \5 V7 C) q/ M0 从cd1的bf文件中读取
( I8 J/ Z y! f) d: y2 F1 从cd2的bf文件中读取
" e1 q# Y/ s+ ]$ v o2 从cd3的bf文件中读取 3 a! N6 F, Y- g' x
255 从外置的loc相应目录中读取
! `; _6 h3 E/ K; J, \3 ]1 `+ G4 n$ h2 d( t- K
第3个参数表示从bf包文件中读取还是从外置目录中读取
) z& @# c5 h2 V1 J0 从外置文件中读取 * y7 R: q% ^) E4 s6 r: w6 i; G
1 从bf包文件中读取
5 N8 Y5 R; W/ `. j: Q1 H& \9 O' w r- H' e5 N
这样的话,修改这个文件就可以使游戏免打包了。 & x- h& ?" G+ Z' J# D5 v
比如,要使视频字幕CINE_01.srt等外置的话,可以把 $ T2 j' U( ]3 K. t9 o
AddFile("TXT\CINE_01.srt",2,1)
0 f* Z" S. s# f* p* G9 q修改为 % [/ C. S; @$ F( e4 g8 P
AddFile("TXT\CINE_01.srt",255,0)
8 n& I5 M$ M, \0 O5 G
( b9 y1 U. j# `0 ]# k5 V% b: ?1 ^3 H这样游戏就能从外置目录中读取视频字幕并显示了。 ' B9 Q5 V. s& q3 N
这个外置目录是\datas\LOC\UK\CMN\TXT
" [0 D$ U8 l3 ~% {$ [对话字幕的修改也是类似的,暂未测试,以后更新。
7 L* f1 N5 \& A& Y. u
; d3 `' u0 h! y+ c9 B附上抓图,以及修改后的Install.ins
, S( [5 Q9 b; |" M3 o- [- L
' B3 C f+ G |5 _8 g4 T8 f+ g* N) {+ c y4 F$ D; ~8 g* F9 Z
-------------------------
; z! I+ Q' b, g7 y' s2010.7.3 第2次更新
# k% p( Y) g& b' D' h8 }6 b# c8 y) l% j" V t
分析了一下字幕文件的格式,格式比较简单,我先把格式写一下。 : W0 c3 S6 ~* ]: R* P! ^
我准备自己写一个字幕文件的导出和导入工具,并能把肥牛生成的文件里的内容都给导入回去。 3 m. K' [; y1 p6 {# W4 k
4 b1 E4 }5 E6 }( `3 x7 \
字幕文件格式如下 - {- L$ M, v$ T" x
字幕文件版本号 12字节 固定为STRv02.00.00 0 _) B2 [6 z) R( ?5 e: Q+ u7 W
字幕索引的结束位置 4字节 真正的字幕从这个位置的下一个字节开始
5 f2 E9 Q) Z( T# `9 x/ o字幕数 4字节 表明共有多少条字幕 7 S) t1 Q, _8 E0 X1 d" V! R4 N
* m3 V8 j4 y5 u' y- c2 e/ q- i从后面开始每16个字节为1组定义1条字幕
5 x$ s0 o3 b/ T5 v# ]! z- L: y2 z1-4字节 字幕序号 ' ~/ Y0 M6 c& L7 w" L
5-8字节 字幕类型 & }. d# A$ I; K8 n, `& W* E) T, b
9-12字节 字幕的字节数(这个字节数指可见字符外加3个0x00的字节数,最后还有一个0x00不算)
0 F- d/ W0 [5 C$ q13-16字节 固定为4个0x00 & J2 f( N. ?* ?" r" B
V$ t+ S h4 }
附上原版字幕文件供参考 |