Monday, March 31, 2008

“系统增强”制作笔记

 

我把一些制作的要点整理出来,有兴趣的朋友可以做参考,也可以进一步加以修改。

 

1.升级算法

5B1F0开始是升级的相减处理,修改的方式与我以前发布的方法完全相同。

0005B1F0:  72 12                      JB      SHORT 0005B204
0005B1F2:  52                         PUSH    EDX
0005B1F3:  69D6 B6000000              IMUL    EDX,ESI,B6
0005B1F9:  8D48 01                    LEA     ECX,[EAX+1]
0005B1FC:  66:899A 6C010700           MOV     [EDX+7016C],BX
0005B203:  5A                         POP     EDX
0005B204:  C3                         RETN

2.伤害公式修改

下面是zz.ini里面的内容,从这些地方可以找到修改的地址。

[Hurt]

MinKnowledge = 391c4;  最低武学常识的地址,未改动。
Knowledge1 = 5b212;    我方武学常识地址,将代码移到5b210开始的位置改成标准乘法。
BaseAttack = 392ce;    攻击,未改动。
Magic = 5b553;         所使用武功,改成标准除法。
Energy1 = 5b55f;       内力,改成标准乘法。
Fist1 = 5b5a9;         拳掌。
Sword1 = 5b5be;        御剑。
Knife1 = 5b5d3;        耍刀。
Unusual1 = 5b5e8;      特殊。
Speed1 = 5b5fd;        轻功。

Knowledge2 = 5b222;    从这里开始是敌人的,基本差不多。
Energy2 = 5b250;
Fist2 = 5b265;
Sword2 = 5b27a;
Knife2 = 5b28f;
Unusual2 = 5b2a4;
Speed2 = 5b2b9;

Defence = 5b357;
Hurt1 = 5b1e2;         这个和下一个是总伤害的因子,改成标准乘法和除法。
Hurt2 = 5b1e4;

Random1 = 393b0;
Random2 = 393bc;

AddHurt = 393cd;
Random3 = 393dd;
Random4 = 393e9;

基本上我为了简单,将新添加的项写成了如下的形式:

0005B256:  66:83FF 01                 CMP     DI,1
0005B25A:  75 0F                      JNZ     SHORT 0005B26B
0005B25C:  0FBF81 FFFFFFFF            MOVSX   EAX,WORD PTR [ECX-1]
0005B263:  C1F8 01                    SAR     EAX,1
0005B266:  90                         NOP
0005B267:  90                         NOP
0005B268:  90                         NOP
0005B269:  03D0                       ADD     EDX,EAX

这个是防守方的拳掌相关的一部分。所有的新加项都是这样的。先设法取得武功的类型,再行比较。如果是类型1,则进行一些相关操作。如果某个加成与属性无关,就把jnz那句抹掉。 如果想屏蔽某一部分,就把jnz改为jmp。

上面写成FFFFFFFF并非真实的地址,这里的地址实际上由重定位表决定,写成这样是为了醒目。

3.物品选单

5B700开始是扩展物品选单用到的字符串,代码从5B7C0开始,开始是获取物品代码并绘制一个方框。由于刚开始考虑并不完善,实际上流程在其后的代码内部多次跳转。总共用了3个平行的循环显示3行数字,其后再显示了3行字符。

因为颜色是后添加的,所以流程多次去转到5B9F0处去确定颜色。同时多次用了pushad和popad处理现场。

4.状态选单

代码从5BA20开始,实际上用了两个循环和一个单独的显示字符函数。但是流程实际上是非常混乱的。因为这几个属性并不是连续存放并且实际上显示的顺序也不是由前到后的顺序,只能判断显示到第几个时进行跳转。

下面是显示那一排数字的代码,实际上在esi为7或1的时候,实际地址均有特殊的处理。

0005BA20:  60                         PUSHAD
0005BA21:  69DF B6000000              IMUL    EBX,EDI,B6
0005BA27:  81C3 6E002100              ADD     EBX,21006E
0005BA2D:  BE 08000000                MOV     ESI,8
0005BA32:  B9 16000000                MOV     ECX,16
0005BA37:  83FE 07                    CMP     ESI,7
0005BA3A:  75 03  &#1
60;                   JNZ     SHORT 0005BA3F
0005BA3C:  83C3 0A                    ADD     EBX,A
0005BA3F:  83FE 01                    CMP     ESI,1
0005BA42:  75 03                      JNZ     SHORT 0005BA47
0005BA44:  83EB 76                    SUB     EBX,76

0005BA47:  0FBF03                     MOVSX   EAX,WORD PTR [EBX]
0005BA4A:  60                         PUSHAD
0005BA4B:  50                         PUSH    EAX
0005BA4C:  68 FFFFFFFF                PUSH    -1
0005BA51:  68 FFFFFFFF                PUSH    -1
0005BA56:  E8 EF34FEFF                CALL    0003EF4A
0005BA5B:  83C4 0C                    ADD     ESP,C
0005BA5E:  61                         POPAD
0005BA5F:  60                         PUSHAD
0005BA60:  68 10000000                PUSH    10
0005BA65:  68 63660000                PUSH    6663
0005BA6A:  68 FFFFFFFF                PUSH    -1
0005BA6F:  68 FFFFFFFF                PUSH    -1
0005BA74:  51                         PUSH    ECX
0005BA75:  90                         NOP
0005BA76:  90                         NOP
0005BA77:  90                         NOP
0005BA78:  90                         NOP
0005BA79:  68 4E020000                PUSH    24E
0005BA7E:  E8 AF1DFEFF                CALL    0003D832
0005BA83:  83C4 18                    ADD     ESP,18
0005BA86:  61                         POPAD
0005BA87:  4E                         DEC     ESI
0005BA88:  83C1 11                    ADD     ECX,11
0005BA8B:  83C3 02                    ADD     EBX,2
0005BA8E:  83FE 00                    CMP     ESI,0
0005BA91:  75 A4                      JNZ     SHORT 0005BA37

这段汇编代码并不是一个好的例子,但它总算没有错误地完成了任务。直接修改代码费时费力,所以留下了一些空位,以及糟糕的地址处理方式。同上,代码中FFFFFFFF均是引用的地址,需要由重定位表确定。

5BB20开始是所需的一些字符。

5.其他

除了上面这些还有很多零碎的修改,比如四位数字的正常显示等。

 

下面是修改过程中添加的重定位项。

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

000189E0   07 10 FF 01 02 20 00 21  00 07 10 59 05 02 52 00   .... .!...Y..R.
000189F0   21 00 07 10 90 05 02 18  40 24 00 07 10 7F 05 02   !.......@$......
00018A00   7E 00 21 00 07 10 A3 05  02 64 00 21 00 07 10 B8   ~.!...?.d.!...?
00018A10   05 02 66 00 21 00 07 10  CD 05 02 68 00 21 00 07   ..f.!...?.h.!..
00018A20   10 E2 05 02 6A 00 21 00  07 10 4A 02 02 52 00 21   .?.j.!...J..R.!
00018A30   00 07 10 5F 02 02 64 00  21 00 07 10 74 02 02 66   ..._..d.!...t..f
00018A40   00 21 00 07 10 89 02 02  68 00 21 00 07 10 9E 02   .!...?.h.!...?
00018A50   02 6A 00 21 00 07 10 B3  02 02 58 00 21 00 07 10   .j.!...?.X.!...
00018A60   F7 05 02 58 00 21 00 07  10 0E 08 02 61 82 03 00   ?.X.!......a?.
00018A70   07 10 13 08 02 C4 07 1A  00 07 10 2A 08 02 00 00   .....?....*....
00018A80   25 00 07 10 2F 08 02 C4  07 1A 00 07 10 D2 07 02   %.../..?....?.
00018A90   C0 27 1B 00 07 10 DA 07  02 2C FE 16 00 07 10 E5   ?....?.,?...?
000
18AA0   07 02 00 00 23 00 07 10  6E 08 02 61 82 03 00 07   ....#...n..a?..
00018AB0   10 73 08 02 C4 07 1A 00  07 10 8A 08 02 00 00 25   .s..?....?...%
00018AC0   00 07 10 8F 08 02 C4 07  1A 00 07 10 CF 08 02 61   ......?....?.a
00018AD0   82 03 00 07 10 D4 08 02  C4 07 1A 00 07 10 EA 08   ?...?.?....?
00018AE0   02 00 00 25 00 07 10 EF  08 02 C4 07 1A 00 07 10   ...%...?.?....
00018AF0   2B 09 02 00 00 25 00 07  10 30 09 02 00 B7 03 00   +....%...0...?.
00018B00   07 10 5B 09 02 00 00 25  00 07 10 60 09 02 40 B7   ..[....%...`..@?
00018B10   03 00 07 10 8B 09 02 00  00 25 00 07 10 90 09 02   ....?...%......
00018B20   80 B7 03 00 07 10 C3 09  02 00 00 25 00 07 10 4D   €?...?...%...M
00018B30   0A 02 61 82 03 00 07 10  52 0A 02 C4 07 1A 00 07   ..a?...R..?...
00018B40   10 6B 0A 02 00 00 25 00  07 10 70 0A 02 C4 07 1A   .k....%...p..?.
00018B50   00 07 10 29 0A 02 62 00  21 00 07 10 9F 0A 02 00   ...)..b.!...?..
00018B60   00 25 00 07 10 A4 0A 02  20 BB 03 00 07 10 D6 0A   .%...?. ?...?
00018B70   02 00 00 25 00 07 10 C1  0A 02 29 BB 03 00         ...%...?.)?.

7 comments:

大嘴 said...

我照你之前的网站改了z.dat的升级算法,不过没明白189E2h开始修改的数据和3B702h开始修改的数据有什么含意,原文里也没写明白。另外,我手动将本篇重复提到的升级算法地址偏移到了5B350h开始,因为兵器武功匹配表只有35个能用太浪费了,但是貌似没起作用,所以请您指导偏移后能正确生效的方法。

Anonymous said...

那个是重定位表,你可以看看主页上的Modify Z

大嘴 said...

我对编程一无所知,不过通过搜索找到了“铁血丹心”上某人的空间中成功将经验算法偏移更远的方法。

之前只发现3b702h处的功能是“程序偏移”,因为发现最后几个“字”是偏移到本文再次提到的5b1f0h的偏移量。不过单独修改偏移量未果,导致新算法失效。

找到成功偏移后的修改方法后,发现貌似“公式”尾部的有几个“字”有一个类似发送“返回值”的动作,所以同样需要修改新的地址。

不过同上,由于我对编程一无所知,只能靠猜测,所以只好请楼主在文章中详细注释每一句的含义,多谢。

Anonymous said...

这个很难办,如果不懂汇编的话,光靠注释是难以理解的,最好还是对编程有一定了解。

大嘴 said...

我有点明白“重定位表”了。

因为在照搬本文的重定位表时发现有几个地址转换时变成了同一地址开始,所以推测是否与高级语言中的“指针”作用相似?

Anonymous said...

我在txdx发过一个重定位表的作用的帖子,可以看一下

大嘴 said...

我就是看了那篇文章才“有点”明白的……