我把一些制作的要点整理出来,有兴趣的朋友可以做参考,也可以进一步加以修改。
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 ...%...?.)?.