|
本帖最后由 differentrain 于 2014-11-17 17:17 编辑
" D2 s& b, i& ^* S3 v, z) Y% \! |: ]
E2 g. S8 q- I; V其实最好是一切文件都不要改,只通过内存修改..: x, c0 p) }# E- E$ A- |
8 d8 D2 x! c* R4 \, |想从脚本的角度去控制游戏剧情,就看了一下游戏文件。发现游戏文件都是经过压缩或以特殊方式存储的。
0 T' I0 Z! |* N" F0 d& ]% I. q% {, X7 T* @$ h5 b
这里是想说,这种存储方式会让我们产生一个美丽的误会,让我们觉得“呀,能改”....2 M. Q4 m( S9 ^- y; h! C% f
* x! K. j8 u" N7 E===================0 z* q! y- s: K5 C. [, g
Data\下的文件:存储了游戏的数据。 z, ~: X! w0 {& {! I! I- p
8 ^6 R2 c J+ A! h6 N
虽然内容没压缩,但是却有特殊的格式。
) ]9 u7 \3 ?; ]$ u$ L% d. h) i: g, a$ ^0 |0 b/ ~0 x4 g7 E; L, `
这个举例吧。: X9 ]$ ~- Y6 h! Q
% [) W& i3 R' |9 j4 C# b当我们用BIG码(950)打开文件\Data1\TVCase.dat的时候,除了乱码,我们看到了繁体中文的文字,看到了编号。0 [+ w( ~ E" S. {$ n$ R
0 W, T: x. v# h
2 g: b0 _& w8 P5 r8 Q* b
! H, K0 u# P- f: l8 t6 |
但是这么改是会有问题的...
$ h1 F6 `% g. l$ v6 n* d: V
7 m6 o2 [& k/ l. K# ~8 ?. u1 |看十六进制内容。
: V2 u/ A( W* m2 b8 W* r0 e
5 u* l- R: a( ^/ B
+ w& c1 F% k3 o6 X
& t( ~* x; c+ K2 C' c就看第一行。
% I; h- U* K0 m) z& o
3 p! R7 _0 e* r* g+ T5 ]- X2 {/ \0x00的位置:F2 03,是文件头(文件类型的标志)。内容固定。Data下每个文件的最开头都是这样的。6 \- a. r1 W3 B! A; d& I
0 p: J. p# _. i3 F% B4 Y6 a* E往后四字节。0x04的位置起是6F 01;0x08的位置起是A0 01;0x0F位置起对应的字符是TV001..* K; L0 a; X6 t% Z) Y( e
. @6 [+ b5 I9 W& V. n# S
TV001肯定是编号了。那前面的两个是什么呢?
; I1 F5 @. v. H. x! U0 B4 p! R: ?& k0 L' i8 Y! T& n
9 z! |( Y* q2 s+ J6 i$ O# e看文件大小。
8 U- t0 X) {$ q' g- M% E7 F, f( E( ?! ?
* z- [! W- y! F# U# W& [6 e8 d- z6 ?7 v) z' O9 x" a) a
16进制存储是从低位到高位的。所以6F01对应的十六进制数是16F,而A001对应的是1A0。" C6 h6 G; ^$ _$ [& l! f. I
* g0 F: H; c4 M8 V% `* F打开计算器,在16进制模式下把这两个数字相乘。然后转换到10进制。
, G; N# c* R: H6 G/ E# U3 ?* C! | U& I ^- n
我们得到了一个数字:152672% M# J% B+ ^7 a/ S
, p V: W% }3 J. _3 W/ N熟悉吗...这个数只要加上12,就是这个文件的大小了。而从文件头开始到0xA0 01为止,正好是12个字节。! _) S! L: V. [% x1 }
/ k% L6 [3 g7 c( u
整理一下格式' x% V8 V0 }: j9 V3 m3 j( B9 E
9 S9 i# O# Y( r, D. i( V4 {# T- 文件头 四字节数值 四字节数值B 正文
% L) l ]% u1 m - 0x00开始:F2 03 00 00 XX XX XX XX XX XX XX XX XX XX XX XX
复制代码 1 x# H/ E0 X/ r- I7 n5 A
A*B=正文的长度
% s8 y' |* ?+ j7 N) A
, E* v" b9 K" k) `2 E% c也就是说,如果要改内容,就一定要改A和B的值,让它们的乘积符合长度,否则很容易出错...
/ A$ B a* I- U$ r1 o3 X+ R
' |$ d3 H0 L# G7 ?- O但是仍然有一个问题,就是A和B的值是随便选的,还是有规律呢?
" g$ Y/ p$ a* |; g+ {) n: L- D2 X
我还不知道..需要调试。
4 `; [( f5 v7 a8 n t1 n; x# g* I8 P" u0 I0 W) S& V0 Q
所以还是不要轻易改的好...$ J4 i0 i7 @. o$ `9 o
============================
' z7 Q* P' t; N说到脚本,就顺便说一下Script\下的脚本文件格式。
3 x4 H. w8 Z+ `& L# ~5 |( J9 |, [3 e- `& |) O/ e9 y( m/ l# b
不说怎么分析的了。就说结构吧。
% W! J) x, E" v$ l4 I: A# R3 S- 文件头 文件头 压缩前长度 压缩后长度
, x% B9 J2 H9 ^/ u% Q* o/ j - 0x00开始:00 00 00 00 80 00 00 00 75 63 49 00 DE CE 22 00$ X6 |8 q+ A; x( \6 M
- ……! o8 L+ p" f ^8 }
- ……# j. I; B2 f6 o4 }. W
- 0x80开始:正文
复制代码
* P3 @ a0 p3 E; D正文内容是LZO压缩后的luaPlus脚本。
0 r7 S* Y0 e8 A' ^解压缩算法也还需进一步调试。9 J* J; k! k, x
=============================
$ V- {* S6 x; ? f2 Q* q顺便说,为什么改存档就没事。8 B7 S, B" n9 G: u/ f
+ w$ R3 _( c' N% d) R
因为存档既没有加密,前面也只有文件头"EC 03"..所以带胶布。
9 q: W( f6 E. H" j3 {, Y4 V [5 ]; J* Y7 I
|
|