最近抽时间看了一下埃及3这个游戏,又有了一个挺大的新发现。
{ n& u3 \" ]+ x1 O, N* c5 C. F以前我一直认为这个游戏是支持不解包的,但是一直没有发现正确的方法。
9 d0 X% R8 K: @& O9 m: q最近我再次研究的时候,我发现了一个以前一直忽视的重要文件
) f. ~, v5 M; d) c) I1 `4 @$ D\datas\CMN\CMN\INS\Install.ins
3 R- N: ]+ i3 r5 O. t& Y* U* Z ?3 j, [: c
内容大致如下 7 V( |, Y0 p% U, [; |8 m5 V
SetGameVersion(1.0.0) 5 t6 {1 J+ L/ v7 M' A; C/ \
AddBigFile("cmn_cmn.bf",0,1) . `. t- M# g& |% T& S- Z" G
AddBigFile("cmn_med.bf",0,1) % K# Q# Z; v/ M
AddBigFile("loc_UK_cmn.bf",0,1)
( U% u( V1 V# }& s$ g D1 x3 HAddBigFile("loc_UK_med.bf",0,1) , X: t/ J1 `1 F! [/ D3 v+ N4 A
AddBigFile("cmn_cmn.bf",1,1)
! C6 F. L; ?' C: r1 j3 CAddBigFile("cmn_med.bf",1,1) . t% ?& A$ X7 Z, g/ \# [. Z
AddBigFile("loc_UK_cmn.bf",1,1) 2 t$ `# l c8 |- R, r
AddBigFile("loc_UK_med.bf",1,1)
1 {8 |9 S% h/ Y; {7 x* A5 T! FAddBigFile("cmn_cmn.bf",2,1)
" M, K9 K( T$ `8 A1 r2 Z7 K6 _1 D! OAddBigFile("cmn_med.bf",2,1) ) L: K% b9 E/ t% f
AddBigFile("loc_UK_cmn.bf",2,1)
, s; {, x" j8 u2 w' HAddBigFile("loc_UK_med.bf",2,1) & N3 s1 G3 ~ r) L/ L
AddFile("TXT\egypteIII.bin",0,1) 8 L. Z- k. x9 I3 N7 m: Z! x9 D3 Y
AddFile("TXT\egypteIII.idx",0,1)
0 ?; i9 P4 L: M6 i+ t, c$ x..... ; p5 I9 }9 N' J$ O8 ~2 E" u
.....
^! Y/ ]; h7 {( N8 ^* i. N" ]AddFile("TXT\CINE_01.srt",2,1) ( ^" ?2 E& Z7 E4 O. ^2 s! m. f5 F+ [) m
AddFile("TXT\CINE_04.srt",2,1)
. v1 I+ a* w5 q% A- ^+ Y; WAddFile("TXT\CINE_09.srt",2,1) 2 @1 U; G8 k, V) e7 ^0 L) T( q B
AddFile("TXT\CINE_11.srt",2,1)
! S; Y9 Q- k t2 h- M; CAddFile("TXT\CINE_12.srt",2,1) 8 l# n' d3 z( \& j9 g' S4 S
AddFile("TXT\CINE_15.srt",2,1) ( C" _9 _! S2 H4 |
AddFile("TXT\CINE_16.srt",2,1) 6 Y9 [8 ^) H' A7 _
AddFile("TXT\CINE_17.srt",2,1) 7 V' h0 v2 a5 B) q/ Z6 C
AddFile("TXT\CINE_22.srt",2,1)
# i1 N" ]5 o7 u. Q: K+ \& [. PAddFile("TXT\CINE_24.srt",2,1)
2 \5 }! ?6 W' ^/ G+ y" s: b/ G3 ?AddFile("TXT\CINE_31.srt",2,1) - G$ S! k! U4 `. b% c4 N; c
AddFile("TXT\CINE_32.srt",2,1)
2 w8 Z* F% U+ o4 S6 X9 p4 h. c+ ^7 [AddFile("VID\Cine_01.hnm",255,0) 4 B5 `1 u. ^, M' t. U
AddFile("VID\Cine_02.hnm",255,0)
Y) I8 y" L; ~; f' SAddFile("VID\Cine_03.hnm",255,0) 1 P0 W& C0 [+ y' w# P* g$ D
AddFile("VID\Cine_04.hnm",255,0)
% ?) ]% l+ p$ x' S* o0 G/ U
7 k" f0 X2 }! e4 F8 \6 @' ]9 W/ w6 s$ J
这个文件的意思还是很好猜的: 3 |- k: ^3 ^& V1 K* J9 t2 p
第1个参数是文件名
: D2 H( i+ O, o) _7 S7 i7 ~0 \0 K) Z# L$ ^0 ^, z) K6 M E. z
第2个参数表示读取源 0 i7 I! l; w7 i* r
0 从cd1的bf文件中读取 9 X# O, V' w+ O4 f4 P+ J
1 从cd2的bf文件中读取 . g5 Y# [$ C! Q) g s
2 从cd3的bf文件中读取
5 M9 B7 e D9 B255 从外置的loc相应目录中读取
1 ?, S" a4 ^* A! T7 C# a; \" L
+ `' M4 d) ~# |第3个参数表示从bf包文件中读取还是从外置目录中读取 - {! P. D! L0 Q7 l
0 从外置文件中读取 3 B/ D; |7 a; @) U; O) l" E3 {' e
1 从bf包文件中读取
5 ?0 R2 T" _5 \& r
+ Y: r6 q( H' h' N# Z8 b这样的话,修改这个文件就可以使游戏免打包了。 + |& `( |, u) \& w8 V1 C
比如,要使视频字幕CINE_01.srt等外置的话,可以把
& t% Z* ~7 c9 H3 Y8 G, u1 uAddFile("TXT\CINE_01.srt",2,1)
* H2 M. V! k! g修改为 9 O# t+ }- [ d; D% @
AddFile("TXT\CINE_01.srt",255,0) ! v$ F* K# I2 K4 \- U
/ u# q8 j2 R5 d+ B/ b
这样游戏就能从外置目录中读取视频字幕并显示了。 6 N% M/ _+ R% N4 [4 r$ \
这个外置目录是\datas\LOC\UK\CMN\TXT
& B* k% |* f( T% K对话字幕的修改也是类似的,暂未测试,以后更新。 & M- N1 V8 s$ j
% I! d# |: D# l0 w1 n: `. H f4 }
附上抓图,以及修改后的Install.ins 9 D* ~. D# O) I# \" ?# N# f; L
1 n E. N, L$ B% i
' v6 g9 o2 B% w
-------------------------
U! B: J- |* k% U& D z2010.7.3 第2次更新 + |! s/ u( H. x ]( j. K
1 {' F( E; b$ Y
分析了一下字幕文件的格式,格式比较简单,我先把格式写一下。
0 d D% `% h( R+ |我准备自己写一个字幕文件的导出和导入工具,并能把肥牛生成的文件里的内容都给导入回去。
9 S& ~5 U/ m( j7 {2 T, V+ r( {4 X/ V G7 \, S* b- F
字幕文件格式如下 ' s1 O- \' h1 c6 N. r4 A
字幕文件版本号 12字节 固定为STRv02.00.00
9 Y& V$ ]+ e4 s字幕索引的结束位置 4字节 真正的字幕从这个位置的下一个字节开始
* a/ {! W. l3 S字幕数 4字节 表明共有多少条字幕
. l( ^$ D- F/ ]# Z3 I) C& c
3 t& x7 b/ I4 F5 \. S b/ \从后面开始每16个字节为1组定义1条字幕
8 B- J) n) v1 Z6 \" D1-4字节 字幕序号
( h5 s" z' O5 \" e9 i% d! \9 T5-8字节 字幕类型
s Q& W& {; c( T9-12字节 字幕的字节数(这个字节数指可见字符外加3个0x00的字节数,最后还有一个0x00不算) 6 A/ t* J0 H! A- e; h t$ O
13-16字节 固定为4个0x00
8 C! i8 Y2 w3 [$ B7 k' T% T+ o- L9 V7 ?1 r8 k) ?: M& P4 ~
附上原版字幕文件供参考 |