最近抽时间看了一下埃及3这个游戏,又有了一个挺大的新发现。
3 K; x% j' v0 T- z, f以前我一直认为这个游戏是支持不解包的,但是一直没有发现正确的方法。
$ _4 C, e0 k$ Z" g( J: Q6 X/ Z9 _最近我再次研究的时候,我发现了一个以前一直忽视的重要文件
4 J8 o8 e4 X+ E$ |, r\datas\CMN\CMN\INS\Install.ins
8 r1 E, L1 ^3 L8 A( Z# O4 h9 m. ?/ N# I1 \8 R+ n
内容大致如下
4 q n1 ^8 G0 Z! H& T% P* f1 O; uSetGameVersion(1.0.0) 6 m& W7 q- ?0 Z' |+ c
AddBigFile("cmn_cmn.bf",0,1)
; `$ v" ?& H2 F: P3 dAddBigFile("cmn_med.bf",0,1) ! @* z- t$ G0 n( Y
AddBigFile("loc_UK_cmn.bf",0,1) 5 |% k6 V @. o
AddBigFile("loc_UK_med.bf",0,1) ! E }1 W- E' n3 i" L/ Q
AddBigFile("cmn_cmn.bf",1,1)
* m1 t. v' c" ^' a3 e1 N6 ?' [2 j- @AddBigFile("cmn_med.bf",1,1) 2 `( I* H* b7 \* E
AddBigFile("loc_UK_cmn.bf",1,1) 8 I! N) K/ z. H2 R1 w
AddBigFile("loc_UK_med.bf",1,1)
( L t7 [( R( J9 m; \$ zAddBigFile("cmn_cmn.bf",2,1)
+ O- y+ v" [4 k% m; g- iAddBigFile("cmn_med.bf",2,1) {# ?7 W! v# o% U: H
AddBigFile("loc_UK_cmn.bf",2,1)
0 {/ d/ c; [! g, m+ e. ^AddBigFile("loc_UK_med.bf",2,1)
! A `: I6 j3 l( ^- G/ |2 U; gAddFile("TXT\egypteIII.bin",0,1) . N- c0 E; C5 G, O) q+ X# S
AddFile("TXT\egypteIII.idx",0,1) + o; I* }' X4 s& E2 m2 s
..... . \. B1 Y: m1 ]* `
.....
- I8 X; b; \/ F VAddFile("TXT\CINE_01.srt",2,1) ! u: I) C {, H: s6 J% l
AddFile("TXT\CINE_04.srt",2,1) . v3 B- n+ C; m
AddFile("TXT\CINE_09.srt",2,1) ( q' a% K( C& S6 ~
AddFile("TXT\CINE_11.srt",2,1) ' e% j2 k; K' q9 n+ L C8 }
AddFile("TXT\CINE_12.srt",2,1)
" B7 C' F. H7 SAddFile("TXT\CINE_15.srt",2,1)
/ Q [! O- n$ o, j7 GAddFile("TXT\CINE_16.srt",2,1) . h! e1 i3 L8 \- R) [" o/ U
AddFile("TXT\CINE_17.srt",2,1) 5 `% Y' A# J9 W1 a$ _0 `( y4 N
AddFile("TXT\CINE_22.srt",2,1)
2 [7 [* x; [( p5 _) F/ GAddFile("TXT\CINE_24.srt",2,1)
+ ^4 J- ^% R4 X) Z. [AddFile("TXT\CINE_31.srt",2,1) % g7 [$ N+ G( A3 |! L
AddFile("TXT\CINE_32.srt",2,1) & C9 r5 X6 l$ _" y
AddFile("VID\Cine_01.hnm",255,0) / Z3 L% M3 @1 g1 l# G, N! A
AddFile("VID\Cine_02.hnm",255,0)
) e- Z- `" L$ C! ^AddFile("VID\Cine_03.hnm",255,0) + Q7 D& t9 O1 p3 l/ @
AddFile("VID\Cine_04.hnm",255,0) ; g+ ]' Y; X' g% `
9 f H8 l* L: {5 L$ i6 K
* u& O9 ~$ R- A# x/ r# \1 m
这个文件的意思还是很好猜的: / x8 f: F! ?+ j( d& }8 ?8 m- n
第1个参数是文件名 3 l( h: E& M( e- }1 _
' p: N1 C* J: N# `/ W4 I ]" o, S5 |第2个参数表示读取源 / X+ q: D! e$ B& b
0 从cd1的bf文件中读取
2 k! q9 ]3 W, d F1 \4 U1 从cd2的bf文件中读取 J" f |4 u( H/ h6 s* Z; C4 o
2 从cd3的bf文件中读取
' \" V; }9 c M255 从外置的loc相应目录中读取
, u. K9 d7 \- e8 C/ t
& h& u' x3 B3 O+ h第3个参数表示从bf包文件中读取还是从外置目录中读取 8 p3 c! ]9 [. M4 J. N A6 Z: ^0 Q
0 从外置文件中读取
) W" m! A9 r7 h. w0 t0 @1 从bf包文件中读取 , [7 F' G5 J+ X" K+ W+ @3 x
: }* x1 j" O2 }这样的话,修改这个文件就可以使游戏免打包了。
J" {+ C. ]1 H: K8 o7 p; a* r比如,要使视频字幕CINE_01.srt等外置的话,可以把
6 m2 g. }+ ]# }5 s5 r6 Z5 VAddFile("TXT\CINE_01.srt",2,1) / F9 r0 d$ E" H+ u7 u
修改为 - l5 P6 V7 ^2 {. E3 C
AddFile("TXT\CINE_01.srt",255,0) . t0 i3 ^- Q! S" e0 ^
# O! M/ w, _* w/ p这样游戏就能从外置目录中读取视频字幕并显示了。
: C/ t: V0 ?+ \ O V# L这个外置目录是\datas\LOC\UK\CMN\TXT
/ ?' C5 B1 E: E# `& ^8 S对话字幕的修改也是类似的,暂未测试,以后更新。 ( _6 [4 B% r( m1 |: z" n$ F4 ~
9 I. M' M4 e. f5 Q( _4 m M3 f
附上抓图,以及修改后的Install.ins 4 o3 l* B7 K0 b b9 j# x* v9 v
( s3 E( j& J# W- p7 P' k# ~6 B: Z6 W9 A' ?' ]
------------------------- 8 W- o4 q Q$ s, R% ], {2 }9 t
2010.7.3 第2次更新
8 y4 Z5 K% t8 K8 X) S$ ^+ F
/ F/ I3 V% ]8 `4 @0 J" v. E& k分析了一下字幕文件的格式,格式比较简单,我先把格式写一下。 5 N# A; c1 \& L: a- W3 W6 w
我准备自己写一个字幕文件的导出和导入工具,并能把肥牛生成的文件里的内容都给导入回去。 3 V) R% ]( ~! Q" E8 _$ ~
# s4 u2 l8 Q; ]2 n+ ?" z% F
字幕文件格式如下 + F! q6 T }$ [# a# q0 U
字幕文件版本号 12字节 固定为STRv02.00.00 * R% B' {5 r% K7 K; S, G* s+ p
字幕索引的结束位置 4字节 真正的字幕从这个位置的下一个字节开始
& L- d5 K! X* O& Q6 a: M字幕数 4字节 表明共有多少条字幕
0 N ]+ H! g" g6 b1 x3 a; [1 f) J3 ]) K$ g2 ~
从后面开始每16个字节为1组定义1条字幕 ! _' }2 v) R# b( k
1-4字节 字幕序号 h- `) v/ p2 H' @( c m
5-8字节 字幕类型 P* s2 l4 H, G" G- _! {' R) ~( T% |
9-12字节 字幕的字节数(这个字节数指可见字符外加3个0x00的字节数,最后还有一个0x00不算) / G% O2 P: Y: w m
13-16字节 固定为4个0x00
% x* L" z8 d# e4 |) U+ y; e" n
9 M# ?0 w- \/ Y6 z; P- u附上原版字幕文件供参考 |