我把一些制作的要点整理出来,有兴趣的朋友可以做参考,也可以进一步加以修改。
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 
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:
我照你之前的网站改了z.dat的升级算法,不过没明白189E2h开始修改的数据和3B702h开始修改的数据有什么含意,原文里也没写明白。另外,我手动将本篇重复提到的升级算法地址偏移到了5B350h开始,因为兵器武功匹配表只有35个能用太浪费了,但是貌似没起作用,所以请您指导偏移后能正确生效的方法。
那个是重定位表,你可以看看主页上的Modify Z
我对编程一无所知,不过通过搜索找到了“铁血丹心”上某人的空间中成功将经验算法偏移更远的方法。
之前只发现3b702h处的功能是“程序偏移”,因为发现最后几个“字”是偏移到本文再次提到的5b1f0h的偏移量。不过单独修改偏移量未果,导致新算法失效。
找到成功偏移后的修改方法后,发现貌似“公式”尾部的有几个“字”有一个类似发送“返回值”的动作,所以同样需要修改新的地址。
不过同上,由于我对编程一无所知,只能靠猜测,所以只好请楼主在文章中详细注释每一句的含义,多谢。
这个很难办,如果不懂汇编的话,光靠注释是难以理解的,最好还是对编程有一定了解。
我有点明白“重定位表”了。
因为在照搬本文的重定位表时发现有几个地址转换时变成了同一地址开始,所以推测是否与高级语言中的“指针”作用相似?
我在txdx发过一个重定位表的作用的帖子,可以看一下
我就是看了那篇文章才“有点”明白的……
Post a Comment