2010-2-27 01:33
武骧金星
请帮忙看看我写代码哪里出了问题
[color=Red]修改目的:赋予《精忠报国岳飞传》中的张九成受到伤害后自动吃杜康酒的能力。
[/color]
首先,这是《精忠报国岳飞传》引擎中,关于自动使用特效(玉砌连环铠)的代码。
00405BBA . 6A 3E PUSH 3E
00405BBC . 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00405BBF . 33C0 XOR EAX,EAX
00405BC1 . 8A42 01 MOV AL,BYTE PTR DS:[EDX+1]
00405BC4 . 8BC8 MOV ECX,EAX
00405BC6 . 6BC9 24 IMUL ECX,ECX,24
00405BC9 . 81C1 502C4B00 ADD ECX,Ekd5.004B2C50
00405BCF . E8 9C9A0500 CALL Ekd5.0045F670
00405BD4 . 8BC8 MOV ECX,EAX
00405BD6 . 6BC9 48 IMUL ECX,ECX,48
00405BD9 . 81C1 0000D600 ADD ECX,0D60000
00405BDF . 894D FC MOV DWORD PTR SS:[EBP-4],ECX
[color=Red]00405BE2 . E8 221E0000 CALL Ekd5.00407A09 ======> JMP Ekd5.004CE4CD (我的新代码) [/color]
00405BE7 . 85C0 TEST EAX,EAX
00405BE9 . 74 5E JE SHORT Ekd5.00405C49
00405BEB . 6A 3E PUSH 3E
00405BED . 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00405BF0 . E8 FD1E0000 CALL Ekd5.00407AF2
00405BF5 . 25 FF000000 AND EAX,0FF
00405BFA . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00405BFD . 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
00405C00 . 33D2 XOR EDX,EDX
00405C02 . 8A51 01 MOV DL,BYTE PTR DS:[ECX+1]
00405C05 . 8BCA MOV ECX,EDX
00405C07 . 6BC9 24 IMUL ECX,ECX,24
00405C0A . 81C1 502C4B00 ADD ECX,Ekd5.004B2C50
00405C10 . E8 3FA30300 CALL Ekd5.0043FF54
00405C15 . 85C0 TEST EAX,EAX
00405C17 . EB 1B JMP SHORT Ekd5.00405C34
[color=Red]我的新代码如下:[/color]
004CE4CD 83F8 2F CMP EAX,2F //判断EAX是否等于2F(张九成)
004CE4D0 74 0A JE SHORT Ekd5.004CE4DC //如果是,执行新的代码
004CE4D2 E8 3295F3FF CALL Ekd5.00407A09 //如果不是,执行原有代码判断宝物特效
004CE4D7 - E9 0B77F3FF JMP Ekd5.00405BE7
004CE4DC B8 5B000000 MOV EAX,5B //给EAX赋值成5B(杜康酒)
004CE4E1 - E9 0F77F3FF JMP Ekd5.00405BF5 //跳回原地址继续执行
[color=Red]现在发现的BUG:[/color](1)张九成受到伤害后,可以选择给自己和身边八格范围内的单位吃杜康酒!相当于直接使用杜康酒一样。
(2)只有物理伤害才会触发该效果,策略伤害无效
请问这是怎么一回事?谢谢。
[color=Silver][[i] 本帖最后由 武骧金星 于 2010-2-27 01:45 编辑 [/i]][/color]
2010-2-27 12:32
godtype
00405B06 |> 6A 00 |PUSH 0 ; |Arg3 = 00000000
自动吃豆和道具使用都要CALL 0041DC43,其中根据第三个参数来判定是否只对自己使用。上面的是自动吃豆的,道具使用是PUSH 1。
0041DC88 |> 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10]
0041DC8B |. 51 PUSH ECX ; /Arg1
0041DC8C |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; |
0041DC8F |. E8 4BF0FFFF CALL Ekd5.0041CCDF ; \Ekd5.0041CCDF
上面这段是使用恢复HP类道具,因为有自动吃豆的代码要调用道具使用的函数,所以要判断EBP+10的值,所以将EBP+10作为41CCDF的参数1。
0041DC96 |> 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
0041DC99 |. E8 9FF1FFFF CALL Ekd5.0041CE3D
上面这段是使用恢复MP类道具,因为没有自动喝水/酒,所以41CE3D没有参数
0041CCE8 |. 837D 08 00 CMP DWORD PTR SS:[EBP+8],0
0041CCEC |. 74 6C JE SHORT Ekd5.0041CD5A
上面就是在41CCDF里面判断EBP+8的数值,0就是只对自己使用,跳过接下来的对使用范围内的对象使用的代码。
如果想要自动喝水/酒的功能,要参考着41CCDF来自己修改41CE3D的里面的代码。
2010-2-27 13:15
武骧金星
哦,谢谢,看来我的知识还是不够呀……
我现在还是只能抄袭代码或者做一些简单的跳转,希望不久以后就能自己原创一些代码出来了。
至少要学会阅读别人的代码……只能抄袭实在不是什么好事……
顺便问问:把 AND EAX, 0FF
CMP EAX, 01
改成: CMP AL, 01
是不是可以节省空间而且又有一样的效果?
[color=Silver][[i] 本帖最后由 武骧金星 于 2010-2-27 13:16 编辑 [/i]][/color]