轩辕春秋文化论坛 » 曹操传MOD制作交流 » 请帮忙看看我写代码哪里出了问题


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 08:29 武骧金星
真是奇怪的问题啊。

问题(2)还可以理解,可能是由于这个游戏中物理伤害和策略伤害调用不同的函数导致的,但是我怎么也找不到另一个需要改的地方……

问题(1)就完全抓瞎了……

2010-2-27 08:40 godtype
第一个试一下改成用恢复HP的道具。
第二个的位置自己学一下查找,提示是PUSH 3E。

2010-2-27 12:06 武骧金星
问题解决,发现策略伤害是由422CB3处的代码控制的……改成吃粮食以后也确实正常了

能否从技术上解释一下,为何HP回复道具是正常的,改成MP回复道具就可以选择使用对象呢?谢谢。

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]

2010-2-27 15:37 godtype
回复 #6 武骧金星 的帖子

如果CMP后面跟的是等于或不等于的,无所谓;如果是大小于之类的,建议还是AND 一下比较好。

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.