2010-12-11 09:32
513633522
在原曹操传引擎基础上实现三连击(或N连击)代码
参考资料:
解读KOEI曹操传代码 作者:岱瀛
[url]http://www.xycq.net/forum/thread-124674-1-1.html[/url]
三连击思路:攻击处理函数有个计数,即第一次攻击计数为1,第二次攻击计数为2,大于2则停止攻击,把计数函数改为3就可以出现三连击的效果,把计数函数改为N就可以出现N连击的效果。
下面是初步的修改(三连击已经实现):
我重新写了攻击处理函数,位置改动了,占用徐子将教学空间(这样改动不影响徐子将教学,不过无法通过教学得到全宝)。
00434D33 /$ 55 PUSH EBP
00434D34 |. 8BEC MOV EBP,ESP
00434D36 |. 51 PUSH ECX
00434D37 |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX
00434D3A |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C]
00434D3D |. 50 PUSH EAX ; /Arg2
00434D3E |. 8A4D 08 MOV CL,BYTE PTR SS:[EBP+8] ; |
00434D41 |. 51 PUSH ECX ; |Arg1
00434D42 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; |
00434D45 |. E8 B214FDFF CALL Ekd5.004061FC ; \Ekd5.004061FC
00434D4A |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00434D4D |. C682 08060000>MOV BYTE PTR DS:[EDX+608],1 //从1开始计数(原引擎是从0开始)
00434D54 EB 15 JMP SHORT Ekd5.00434D6B
00434D56 |> 8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4]
00434D59 |. 8A88 08060000 |MOV CL,BYTE PTR DS:[EAX+608]
00434D5F |. 80C1 01 |ADD CL,1 //计数
00434D62 |. 8B55 FC |MOV EDX,DWORD PTR SS:[EBP-4]
00434D65 |. 888A 08060000 |MOV BYTE PTR DS:[EDX+608],CL
00434D6B 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00434D6E E8 9010FDFF CALL Ekd5.00405E03 //攻击伤害函
00434D73 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00434D76 E8 C909FDFF CALL Ekd5.00405744 //攻击动作显
00434D7B 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00434D7E E8 060BFDFF CALL Ekd5.00405889 //攻击后附加属性处理函数
00434D83 6A 17 PUSH 17 //特效号17(原每回合获得护具经验)
00434D85 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00434D88 36:8B48 08 MOV ECX,DWORD PTR SS:[EAX+8]
00434D8C E8 782CFDFF CALL Ekd5.00407A09
00434D91 85C0 TEST EAX,EAX
00434D93 74 12 JE SHORT Ekd5.00434DA7 //无装备17特效跳转按正常攻击计数
00434D95 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00434D98 33C9 XOR ECX,ECX
00434D9A 8A88 08060000 MOV CL,BYTE PTR DS:[EAX+608]
00434DA0 83F9 03 CMP ECX,3 //攻击计数次数比正常计数多1,实现三连击,把数字改为4就可以实现四连击,依次类推能够实现N连击。
00434DA3 7D 22 JGE SHORT Ekd5.00434DC7 //大于等于3跳出结束攻击
00434DA5 ^ EB AF JMP SHORT Ekd5.00434D56 //直接跳过连击判断,跳到攻击
00434DA7 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00434DAA 33C9 XOR ECX,ECX
00434DAC 8A88 08060000 MOV CL,BYTE PTR DS:[EAX+608]
00434DB2 83F9 02 CMP ECX,2 //正常攻击计数
00434DB5 7D 10 JGE SHORT Ekd5.00434DC7
00434DB7 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00434DBA |. E8 C213FDFF |CALL Ekd5.00406181 // 判断是否连击函数
00434DBF |. 85C0 |TEST EAX,EAX
00434DC1 |. 75 02 |JNZ SHORT Ekd5.00434DC5
00434DC3 |. EB 02 |JMP SHORT Ekd5.00434DC7
00434DC5 |>^ EB 8F \JMP SHORT Ekd5.00434D56
00434DC7 |> 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00434DCA |. E8 9D0EFDFF CALL Ekd5.00405C6C
00434DCF |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00434DD2 |. E8 C315FDFF CALL Ekd5.0040639A
00434DD7 |. 8BE5 MOV ESP,EBP
00434DD9 |. 5D POP EBP
00434DDA \. C2 0800 RETN 8
因为重新写,位置变了,所以调用的地方也要修改,原曹操传共5处调用,由于我改了一个无限引导,所以去掉了一个。
004064E7 |. E8 05000000 CALL Ekd5.004064F1 ; \Ekd5.004064F1
0043AC3F |. E8 ADB8FCFF CALL Ekd5.004064F1 ; \Ekd5.004064F1
0043ACF5 |. E8 F7B7FCFF CALL Ekd5.004064F1 ; \Ekd5.004064F1
0043DB4E . E8 9E89FCFF CALL Ekd5.004064F1 ; \Ekd5.004064F1
0043DC04 |. E8 E888FCFF CALL Ekd.004064F1 ; \ _Ekd.004064F1 进入攻击函数(这个是我改无限引导去掉的)
都改成 CALL Ekd.00434D33
[color=Red][size=5]声明:本人是新手。[/size][/color]
[color=Silver][[i] 本帖最后由 513633522 于 2010-12-11 09:40 编辑 [/i]][/color]