|
本帖最后由 differentrain 于 2014-11-17 17:17 编辑 " S/ N! Z* \) }9 i
' F" \1 |& }- g/ O其实最好是一切文件都不要改,只通过内存修改..
& R4 ?8 q' H0 x7 x! u
2 k; i0 [ E/ L& K ]3 w想从脚本的角度去控制游戏剧情,就看了一下游戏文件。发现游戏文件都是经过压缩或以特殊方式存储的。1 M1 x, n' |$ N' O
- Q: q0 e" B: l* S E
这里是想说,这种存储方式会让我们产生一个美丽的误会,让我们觉得“呀,能改”....% V9 M2 I2 G; h7 }7 \
I3 J; i4 N# x/ Z$ }! F===================; n% s" P! r B
Data\下的文件:存储了游戏的数据。
( a" Y- j6 j! E" ?5 _. a2 @! W: x+ J6 N
虽然内容没压缩,但是却有特殊的格式。1 F! t, g a9 F+ J+ H
* J; A& ^' o+ X* l) S8 Q2 ]' V
这个举例吧。) S. y" h! P9 o0 h4 @
$ H/ m8 b9 z; d2 O4 i当我们用BIG码(950)打开文件\Data1\TVCase.dat的时候,除了乱码,我们看到了繁体中文的文字,看到了编号。
+ ]& w/ J; I& E, {+ h8 t* R; a% t+ M; e% h8 G. [7 y
9 t9 c. g9 I& q$ N E% ]* k
9 @1 a' O1 b" ]& t2 Q" x但是这么改是会有问题的...
2 C. d. P$ \! Y% { n3 L; E/ A! z$ E3 y# T
看十六进制内容。% r8 [* Z5 ^7 J( v
% Y7 c. o' M2 k0 \2 z1 s I! j
3 B F( q+ k; @, I' K+ v% t' l F1 S3 J- F1 R0 |5 S
就看第一行。
. R; O2 ]) D! d: L- ]% k4 |) C0 b% C, ?5 L- ^
0x00的位置:F2 03,是文件头(文件类型的标志)。内容固定。Data下每个文件的最开头都是这样的。2 Q) L4 U3 U2 s7 v. M, ~/ n( G
6 o$ M$ N7 B7 v8 V往后四字节。0x04的位置起是6F 01;0x08的位置起是A0 01;0x0F位置起对应的字符是TV001..
6 Z e1 J* |* x1 P' Y2 E) `: w& C4 B6 ?" r- W1 R- j) N# G
TV001肯定是编号了。那前面的两个是什么呢?* i1 Y( B% m/ O5 Z$ Q. s( Z
1 d+ r. _- w- G
$ C) q( ]3 _4 H& M( i/ A# h看文件大小。
% @% q8 d) |7 u+ Y4 h6 B9 ~
, G0 n# W9 B1 [" w: |8 p6 y
# E* v# z4 U: @' K+ R
2 _" P# b- j; j+ t8 V$ i# ?8 r16进制存储是从低位到高位的。所以6F01对应的十六进制数是16F,而A001对应的是1A0。% z5 J* s7 i/ f) B g
& L) q% K: i$ Q! F打开计算器,在16进制模式下把这两个数字相乘。然后转换到10进制。( @" N( C; c4 U1 A0 V$ p9 J
) Z( n7 d: i" X我们得到了一个数字:152672
8 i2 | Q6 N7 ], M/ a8 e8 ]
$ U; k3 W: f& J熟悉吗...这个数只要加上12,就是这个文件的大小了。而从文件头开始到0xA0 01为止,正好是12个字节。
7 q/ C7 l: M. Y! a; W0 m7 Q9 h2 @$ w( M* o0 r$ o
整理一下格式
, P' T0 _5 d$ [7 T9 c& t9 _6 ?$ `) V$ b* t' J h
- 文件头 四字节数值 四字节数值B 正文9 |; C( E3 `6 D J
- 0x00开始:F2 03 00 00 XX XX XX XX XX XX XX XX XX XX XX XX
复制代码
7 H# Q0 \; u( v, D- R( pA*B=正文的长度/ j+ W3 j! k, P, K, c3 g
2 x4 N; t5 Y( M: ?8 X8 n5 p! }
也就是说,如果要改内容,就一定要改A和B的值,让它们的乘积符合长度,否则很容易出错...
( U1 t- d) }9 g7 U7 ]* `
' C" B! o+ v; n& c% ]9 z7 K e2 d& r但是仍然有一个问题,就是A和B的值是随便选的,还是有规律呢?% x4 o I, M# ]) R3 V
8 S" H6 g } Y) Z: I& p我还不知道..需要调试。: V; H$ `3 Z" n, e: X6 f; P/ m+ g
x- N3 g5 j; ~3 c3 N
所以还是不要轻易改的好...
; y7 W! o4 W/ q4 n+ _5 `============================
* w& e3 u( D" D, d0 g/ o8 Q5 ]# j说到脚本,就顺便说一下Script\下的脚本文件格式。
* f& @, d5 x4 i6 ^ m) Z: P/ `5 k+ Z/ `& U+ Y8 h2 S6 T5 L9 z
不说怎么分析的了。就说结构吧。2 A0 ~# j7 G/ s+ D/ k" i
- 文件头 文件头 压缩前长度 压缩后长度& X3 Q) l- h1 q: I) E
- 0x00开始:00 00 00 00 80 00 00 00 75 63 49 00 DE CE 22 00/ Q. [: o5 G7 b& d, d4 Z' o7 u
- ……$ A; S4 [/ g& t; Z% C6 U) y0 `
- ……/ t9 X' [$ b' @: Q" v, f7 p
- 0x80开始:正文
复制代码
3 k1 K" m, p5 y$ Y* Y正文内容是LZO压缩后的luaPlus脚本。7 a- @6 j+ b: U: _. L# |
解压缩算法也还需进一步调试。& P& J a8 _$ l1 ~) K `
=============================3 F# F0 O! ]& y0 z2 _9 o5 p9 _
顺便说,为什么改存档就没事。( v: u) R( P( @# n
- `* T7 ^, d+ g! o$ g5 `) A因为存档既没有加密,前面也只有文件头"EC 03"..所以带胶布。
6 ]# h' I& _- h2 E9 `2 ^( P
8 ]; B# K# f* l$ N& d T7 F7 J |
|