|
本帖最后由 differentrain 于 2014-11-17 17:17 编辑 * f; P) ]7 u4 B' w
' c: G' e) y- r
其实最好是一切文件都不要改,只通过内存修改..! m% |2 r/ h- `2 c/ G- J
2 d0 W) e$ v0 c/ D/ ] _* {
想从脚本的角度去控制游戏剧情,就看了一下游戏文件。发现游戏文件都是经过压缩或以特殊方式存储的。7 h7 n" v( o" y
& w+ ]" i J L/ S1 B- i$ j9 b) f) N这里是想说,这种存储方式会让我们产生一个美丽的误会,让我们觉得“呀,能改”....- t1 g6 N0 S6 f# j! f {: u3 e
- w- L8 J: C( s2 H9 s; q$ x===================
+ {( C) T3 b! K) c3 B8 N6 j$ jData\下的文件:存储了游戏的数据。5 L/ [2 j8 H, M( E6 d+ |" S0 S5 t
7 j5 G3 e6 _/ `8 [$ a虽然内容没压缩,但是却有特殊的格式。! D7 |8 _2 T2 Q
; W/ k) f G3 |: l! X- @这个举例吧。' [$ N9 Q8 x# W- e* }, n
3 R4 @) \. N, G, J+ G# L4 S0 l
当我们用BIG码(950)打开文件\Data1\TVCase.dat的时候,除了乱码,我们看到了繁体中文的文字,看到了编号。
. K4 z5 |6 R) ^, q- ~) e# X5 }
5 B$ q9 d# V( ]# A: [1 R
; r! n. c6 }3 X9 z0 d
2 v1 L N: v8 {! X- }# ]但是这么改是会有问题的...
4 u" |/ I5 d, ]8 A0 Q' ^( x" S$ D# {! T4 z
看十六进制内容。
) P7 C1 Z+ j! F/ @7 @$ e
8 H7 Z+ y9 j7 C R5 o$ ~
I3 X% O5 B# B5 X0 m
5 ~1 e0 I* o% T0 w6 f: F7 r
就看第一行。
! e6 p, y% J4 L' X" }+ Z1 C/ G. D" Y6 p0 ?1 r7 T. @2 p& S- _7 M- |
0x00的位置:F2 03,是文件头(文件类型的标志)。内容固定。Data下每个文件的最开头都是这样的。2 w* l$ |5 h; o1 q
' `3 q2 D) ^; m# {0 w往后四字节。0x04的位置起是6F 01;0x08的位置起是A0 01;0x0F位置起对应的字符是TV001..
! O) C" F6 M( M* {4 n& `1 R0 s5 e! F5 `6 z6 F Z; J+ d
TV001肯定是编号了。那前面的两个是什么呢?; g0 z+ i. w9 W1 d& m
7 F+ a2 v& g* b2 _% Y @5 `; Z0 u9 o
( @5 x e: _. ~( j- n
看文件大小。: O) k3 [2 l: r" g4 D. @
, x; l- K6 b2 Z; { U
9 N8 n$ K, A9 ~" k
" ~- D- w- m' E( b16进制存储是从低位到高位的。所以6F01对应的十六进制数是16F,而A001对应的是1A0。
: w/ ~1 A K4 {6 p% A& F; s: {" C2 k5 s$ e8 d) v6 v' L% ?* W' E
打开计算器,在16进制模式下把这两个数字相乘。然后转换到10进制。
8 i# J! }6 T; D6 B, Z8 {3 {5 ^7 f' U0 a
我们得到了一个数字:152672! S V! _) Z# R9 j- o
! F( I# R& h* [5 s1 f. e熟悉吗...这个数只要加上12,就是这个文件的大小了。而从文件头开始到0xA0 01为止,正好是12个字节。
# _* |* i) [9 g" \& ~4 f
; q! I7 ]* V* G9 p7 V1 D整理一下格式( `! J( \8 z6 ]1 Q
4 l1 I$ R/ L6 @# @
- 文件头 四字节数值 四字节数值B 正文: E0 Y# N+ u2 I% [
- 0x00开始:F2 03 00 00 XX XX XX XX XX XX XX XX XX XX XX XX
复制代码 2 @) k5 T! w- g, D* J. o
A*B=正文的长度
: c7 R! u* @: z; b1 Y$ G8 }
V+ Q* q. ^* p" o+ k也就是说,如果要改内容,就一定要改A和B的值,让它们的乘积符合长度,否则很容易出错...) |: I* E( a9 ]; l1 }$ R' x1 Q
K# S: W# Y; W
但是仍然有一个问题,就是A和B的值是随便选的,还是有规律呢?
( Z1 h4 o6 C2 S9 V' M- |, H: z6 B. |* w/ |. I/ [; P3 X6 ], f
我还不知道..需要调试。8 @ t4 c: o( z/ I
6 f4 E% C* Z2 ?& y. [+ C/ h
所以还是不要轻易改的好...
; o$ Y5 ]5 S1 e8 E) Y W- f============================% z4 W3 ^- b4 w- O8 u
说到脚本,就顺便说一下Script\下的脚本文件格式。3 L* ?6 l" P8 D6 m, s6 ?5 z1 q) {1 j
% g( ?) X4 F I
不说怎么分析的了。就说结构吧。
t# I! L' i! l) l& ~9 N- 文件头 文件头 压缩前长度 压缩后长度$ d$ \) b- P+ N/ |1 x8 x y* n
- 0x00开始:00 00 00 00 80 00 00 00 75 63 49 00 DE CE 22 00
! [; K4 f7 q6 i - ……! t5 t8 F% B: C9 C0 E: I
- ……
c& a* Q2 D+ T: ~$ ^$ t( B7 I8 ^- x - 0x80开始:正文
复制代码 4 U1 k& z1 {5 T. |5 m" O! r4 n+ [
正文内容是LZO压缩后的luaPlus脚本。
" _8 _- j ?; F% C1 m1 s解压缩算法也还需进一步调试。0 H1 i9 q5 L+ q' @8 ~2 S- P1 a. d
=============================5 T9 @7 Q5 `! T0 W; ]
顺便说,为什么改存档就没事。
2 G- u9 G( _2 o) T3 M+ E4 X7 R, i& s, j b1 g9 u2 m2 h. a6 _
因为存档既没有加密,前面也只有文件头"EC 03"..所以带胶布。
+ z3 c) O+ b' f8 a% p
% b5 I$ G2 N1 z3 H9 s |
|