恢复HP道具的恢复量
调用函数位置
0041CD9E |> 6A 00 PUSH 0 ; /Arg2 = 00000000
0041CDA0 |. 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8] ; |
0041CDA3 |. 8A11 MOV DL,BYTE PTR DS:[ECX] ; |
0041CDA5 |. 52 PUSH EDX ; |Arg1
0041CDA6 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; |
0041CDA9 |. 8B48 08 MOV ECX,DWORD PTR DS:[EAX+8] ; |
0041CDAC |. E8 7DF60100 CALL 0043C42E ; \0043C42E
43C42E这条函数有四个地方调用到,恢复HP、恢复MP、显示恢复HP量和显示恢复MP量,这里只帖恢复HP的调用位置。
0C栈为0时,就是真正使用道具,为1时,是未正式使用道具,而将光标移到某人头上时显示的恢复量;08栈是所使用道具的物品编号,byte型(即单字节);还有一个受用者的战场内存地址作为ECX值输入。
当然了,实际上0C栈的值并没有在函数里面使用过。
0043C42E /$ 55 PUSH EBP
0043C42F |. 8BEC MOV EBP,ESP
0043C431 |. 83EC 1C SUB ESP,1C
0043C434 |. 894D EC MOV DWORD PTR SS:[EBP-14],ECX
受用者的战场内存地址保存到[EBP-14]中
0043C437 |. 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
0043C43A |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
0043C43C |. 6BC9 48 IMUL ECX,ECX,48
0043C43F |. 81C1 681B4A00 ADD ECX,004A1B68
0043C445 |. 894D F0 MOV DWORD PTR SS:[EBP-10],ECX
计算出受用者的武将内存地址,保存到[EBP-10]中
0043C448 |. 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
0043C44B |. 81E2 FF000000 AND EDX,0FF
0043C451 |. 6BD2 19 IMUL EDX,EDX,19
0043C454 |. 81C2 40114A00 ADD EDX,004A1140
0043C45A |. 8955 F4 MOV DWORD PTR SS:[EBP-C],EDX
计算出所使用道具的物品内存地址,保存到[EBP-C]中
0043C45D |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
0043C460 |. E8 DBD0FCFF CALL 00409540
0043C465 |. 8845 FC MOV BYTE PTR SS:[EBP-4],AL
读取所使用道具的特效号,单字节保存到[EBP-4]中。409540实际上就是MOV AL,BYTE PTR DS:[ECX+11],读取ECX值所在地址+11H位置的数值(byte型,即单字节),而辅助品和消耗品的物品内存地址里面的第11H位就是特效号,武器和防具则是物品类型(即剑、枪、弓等)
0043C468 |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
0043C46B |. E8 0019FEFF CALL 0041DD70
0043C470 |. 25 FF000000 AND EAX,0FF
0043C475 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
读取所使用道具的效果值,扩展后保存到[EBP-8]中。41DD70是MOV AL,BYTE PTR DS:[ECX+15] ,原理同上,消耗品的第15H位是效果值,而武器和防具是初始能力,辅助品则无作用
0043C478 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0043C47B |. 25 FF000000 AND EAX,0FF
0043C480 |. 83F8 3F CMP EAX,3F
0043C483 |. 75 58 JNZ SHORT 0043C4DD
判断所使用道具的特效号是否3F,即恢复HP,不是的就跳到后面
0043C485 |. 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
0043C488 |. 81E1 FF000000 AND ECX,0FF
0043C48E |. 81F9 FF000000 CMP ECX,0FF
0043C494 |. 75 13 JNZ SHORT 0043C4A9
判断所使用道具的效果值是否为FF,不是的就跳到后面,是的就表示完全恢复
0043C496 |. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
0043C499 |. E8 7DADFCFF CALL 0040721B
根据输入的ECX值(武将内存地址)计算出包括辅助装备在内的武将总HP值
0043C49E |. 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14]
0043C4A1 |. 2B42 10 SUB EAX,DWORD PTR DS:[EDX+10]
0043C4A4 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
0043C4A7 |. EB 32 JMP SHORT 0043C4DB
总HP值减去当前HP值(Hpcur),战场内存的第10H位就是Hpcur,得到实际恢复HP量,保存到[EBP-8]中
这里开始是所使用道具的效果值不是FF的情况:
0043C4A9 |> 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
0043C4AC |. E8 6AADFCFF CALL 0040721B
取出总HP值
0043C4B1 |. 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
0043C4B4 |. 2B41 10 SUB EAX,DWORD PTR DS:[ECX+10]
0043C4B7 |. 3B45 F8 CMP EAX,DWORD PTR SS:[EBP-8]
0043C4BA |. 73 13 JNB SHORT 0043C4CF
总HP值减去当前HP值(Hpcur),再比较一下所使用道具的效果值,如果大于或等于效果值就跳到后面,由道具的效果值作为实际恢复量
0043C4BC |. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
0043C4BF |. E8 57ADFCFF CALL 0040721B
0043C4C4 |. 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14]
0043C4C7 |. 2B42 10 SUB EAX,DWORD PTR DS:[EDX+10]
0043C4CA |. 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
0043C4CD |. EB 06 JMP SHORT 0043C4D5
如果小于效果值,就直接由总HP值减去Hpcur所得出的数值作为实际恢复量
0043C4CF |> 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0043C4D2 |. 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
0043C4D5 |> 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18]
0043C4D8 |. 894D F8 MOV DWORD PTR SS:[EBP-8],ECX
0043C4DB |> EB 62 JMP SHORT 0043C53F
以下部分是恢复MP的,原理一样,其中40724A是取出总MP值,DS:[ECX+14]是当前MP值(Mpcur)
0043C4DD |> 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0043C4E0 |. 81E2 FF000000 AND EDX,0FF
0043C4E6 |. 83FA 40 CMP EDX,40
0043C4E9 |. 75 54 JNZ SHORT 0043C53F
0043C4EB |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0043C4EE |. 25 FF000000 AND EAX,0FF
0043C4F3 |. 3D FF000000 CMP EAX,0FF
0043C4F8 |. 75 13 JNZ SHORT 0043C50D
0043C4FA |. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
0043C4FD |. E8 48ADFCFF CALL 0040724A
0043C502 |. 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
0043C505 |. 2B41 14 SUB EAX,DWORD PTR DS:[ECX+14]
0043C508 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
0043C50B |. EB 32 JMP SHORT 0043C53F
0043C50D |> 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
0043C510 |. E8 35ADFCFF CALL 0040724A
0043C515 |. 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14]
0043C518 |. 2B42 14 SUB EAX,DWORD PTR DS:[EDX+14]
0043C51B |. 3B45 F8 CMP EAX,DWORD PTR SS:[EBP-8]
0043C51E |. 73 13 JNB SHORT 0043C533
0043C520 |. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
0043C523 |. E8 22ADFCFF CALL 0040724A
0043C528 |. 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
0043C52B |. 2B41 14 SUB EAX,DWORD PTR DS:[ECX+14]
0043C52E |. 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX
0043C531 |. EB 06 JMP SHORT 0043C539
0043C533 |> 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
0043C536 |. 8955 E4 MOV DWORD PTR SS:[EBP-1C],EDX
0043C539 |> 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C]
0043C53C |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
0043C53F |> 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0043C542 |. 8BE5 MOV ESP,EBP
0043C544 |. 5D POP EBP
0043C545 \. C2 0800 RETN 8
总的来说,消耗道具的效果值并不是完全的恢复量,效果值加上当前HP/MP后不能大于总HP/MP量,超出部分就必须减去,否则会出错。
===========
如果要将效果值改成占总HP量的百分比,全恢复的FF就不管了,改这段
0043C4A9 |> 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
0043C4AC |. E8 6AADFCFF CALL 0040721B
0043C4B1 |. 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
0043C4B4 |. 2B41 10 SUB EAX,DWORD PTR DS:[ECX+10]
0043C4B7 |. 3B45 F8 CMP EAX,DWORD PTR SS:[EBP-8]
0043C4BA |. 73 13 JNB SHORT 0043C4CF
0043C4BC |. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
0043C4BF |. E8 57ADFCFF CALL 0040721B
0043C4C4 |. 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14]
0043C4C7 |. 2B42 10 SUB EAX,DWORD PTR DS:[EDX+10]
0043C4CA |. 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
0043C4CD |. EB 06 JMP SHORT 0043C4D5
0043C4CF |> 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0043C4D2 |. 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
0043C4D5 |> 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18]
0043C4D8 |. 894D F8 MOV DWORD PTR SS:[EBP-8],ECX
0043C4DB |> EB 62 JMP SHORT 0043C53F
改成:
0043C4A9 |> 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
0043C4AC |. E8 6AADFCFF CALL 0040721B
0043C4B1 50 PUSH EAX
0043C4B2 0FAF45 F8 IMUL EAX,DWORD PTR SS:[EBP-8]
0043C4B6 33D2 XOR EDX,EDX
0043C4B8 B9 64000000 MOV ECX,64
0043C4BD F7F1 DIV ECX
0043C4BF 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
0043C4C2 58 POP EAX
0043C4C3 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
0043C4C6 2B41 10 SUB EAX,DWORD PTR DS:[ECX+10]
0043C4C9 3B45 F8 CMP EAX,DWORD PTR SS:[EBP-8]
0043C4CC 73 03 JNB SHORT 0043C4D1
0043C4CE 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
0043C4D1 90 NOP
0043C4D2 90 NOP
0043C4D3 90 NOP
0043C4D4 90 NOP
0043C4D5 90 NOP
0043C4D6 90 NOP
0043C4D7 90 NOP
0043C4D8 90 NOP
0043C4D9 90 NOP
0043C4DA 90 NOP
|