武将习得策略个性化,不受兵种限制
最近重新操刀CCZ,忍不住又对EXE进行了小改,于是留点东西给大家
本文教你如何让武将自由习得策略,每个武将可根据设置习得不同的策略,即使兵种都一样,同时也保留兵种赋予武将的策略
大致思路:
1:先设置一块数据块,用于设置每个武将的可习得策略,以下是我设置的数据块:
地址:005CE680-005D2B3B 武将习得策略数据地址,支持255个武将指定,指定的是习得策略等级,每个占用 45(69) * 1 字节,共占用45(69) * FF(255) 字节
2:然后写条新函数,功能大概就是根据武将的DATA序号和策略编号获取上面数据块的内容,判断武将是否有该策略的识别
3:在以下5条判断武将是否有策略的函数中插入自己写的新函数,加入判断,以下所给函数均为原版旧引擎
(1):武将升级时习得策略提示(004073B8)本来 0041D4DB 函数里也有武将获得策略提示的,但是未发现用处,所以先不理
(2):策略按钮响应(0043DDE3)
(3):点击策略按钮显示的策略列表(00465A40)
(4):武将资料框策略列表(004658C0)
(5):AI使用策略判断(00438308)
以下是代码:供观赏,自行看注释
核心函数:就是需要自己写该函数
004CEB60 CC INT3 ; *******以下是自写函数【判断+C武将是否可习得+8栈策略】输出EAX=0即不可以
004CEB61 CC INT3 ; +8栈=策略编号 +C栈=武将DATA内存 +10栈=0即由【武将升级函数调用】主要用于更改判断
004CEB62 55 PUSH EBP
004CEB63 8BEC MOV EBP,ESP
004CEB65 83EC 08 SUB ESP,8
004CEB68 0FB645 08 MOVZX EAX,BYTE PTR SS:[EBP+8]
004CEB6C 8945 08 MOV DWORD PTR SS:[EBP+8],EAX
004CEB6F C745 FC 80E65C00 MOV DWORD PTR SS:[EBP-4],Ekd5.005CE680 ; 武将习得策略数据地址
004CEB76 FF75 0C PUSH DWORD PTR SS:[EBP+C]
004CEB79 E8 4F000000 CALL Ekd5.004CEBCD ; ****调用自写函数【根据+8栈武将DATA内存计算出武将DATA序号】输出EAX
004CEB7E 3D FF000000 CMP EAX,0FF ; 只支持前255个武将
004CEB83 7D 2D JGE SHORT Ekd5.004CEBB2
004CEB85 6BC0 45 IMUL EAX,EAX,45 ; 每个武将占用45(69)字节 分别对应68个策略
004CEB88 0345 FC ADD EAX,DWORD PTR SS:[EBP-4]
004CEB8B 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
004CEB8E 0FB61408 MOVZX EDX,BYTE PTR DS:[EAX+ECX] ; 根据策略编号获取相对应位置上的习得等级
004CEB92 85D2 TEST EDX,EDX ; =0即无法习得该策略
004CEB94 74 1C JE SHORT Ekd5.004CEBB2 ; **跳至结尾输出EAX=0结束,否则判断武将当前等级是否可习得
004CEB96 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
004CEB99 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
004CEB9C 0FB642 2C MOVZX EAX,BYTE PTR DS:[EDX+2C] ; 获取武将等级
004CEBA0 837D 10 00 CMP DWORD PTR SS:[EBP+10],0 ; +10栈=0即由【武将升级函数调用】主要用于更改判断
004CEBA4 74 07 JE SHORT Ekd5.004CEBAD
004CEBA6 3B45 F8 CMP EAX,DWORD PTR SS:[EBP-8]
004CEBA9 7D 0B JGE SHORT Ekd5.004CEBB6 ; **跳至结尾输出EAX=1结束
004CEBAB EB 05 JMP SHORT Ekd5.004CEBB2 ; **跳至结尾输出EAX=0结束
004CEBAD 3B45 F8 CMP EAX,DWORD PTR SS:[EBP-8]
004CEBB0 74 04 JE SHORT Ekd5.004CEBB6 ; **跳至结尾输出EAX=1结束
004CEBB2 33C0 XOR EAX,EAX
004CEBB4 EB 05 JMP SHORT Ekd5.004CEBBB
004CEBB6 B8 01000000 MOV EAX,1
004CEBBB 8BE5 MOV ESP,EBP
004CEBBD 5D POP EBP
004CEBBE C2 0C00 RETN 0C
接着将新函数插入5条判断函数里
//先修正下原版两条函数:方便省代码
00409580 /$ 55 PUSH EBP ; ******根据小兵种编号获取策略习得等级要求,+8栈=兵种编号 ECX=策略内存地址
00409581 |. 8BEC MOV EBP,ESP
00409583 |. 51 PUSH ECX
00409584 |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX
00409587 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0040958A |. 0345 08 ADD EAX,DWORD PTR SS:[EBP+8]
0040958D |. 0FB640 11 MOVZX EAX,BYTE PTR DS:[EAX+11]
00409591 |. 8BE5 MOV ESP,EBP
00409593 |. 5D POP EBP
00409594 \. C2 0400 RETN 4
00406610 /$ 55 PUSH EBP ; ******根据ECX=武将DATA内存获取武将小兵种,输出al
00406611 |. 8BEC MOV EBP,ESP
00406613 |. 51 PUSH ECX
00406614 |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX
00406617 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0040661A |. 0FB640 2B MOVZX EAX,BYTE PTR DS:[EAX+2B]
0040661E |. 8BE5 MOV ESP,EBP
00406620 |. 5D POP EBP
00406621 \. C3 RETN
1:武将升级判断函数:重写部分代码
00407541 |. 8B4D E8 |MOV ECX,DWORD PTR SS:[EBP-18] ; 武将DATA内存地址
00407544 |. 0FB651 2B |MOVZX EDX,BYTE PTR DS:[ECX+2B] ; 获取武将小兵种编号
00407548 |. 52 |PUSH EDX
00407549 |. FF75 F8 |PUSH DWORD PTR SS:[EBP-8]
0040754C E8 D96C0C00 CALL Ekd5.004CE22A ; ***调用自写函数【根据+8栈值,计算出策略内存地址】,+8栈=策略编号,输出ECX
00407551 |. E8 2A200000 |CALL Ekd5.00409580 ; \******根据小兵种编号获取策略习得等级要求,+8栈=兵种编号 ECX=策略内存地址
00407556 |. 85C0 |TEST EAX,EAX ; =0即该兵种不具备习得当前循环对应的策略
00407558 |. 74 0B |JE SHORT Ekd5.00407565 ; ***跳至下方判断武将是否有该策略习得
0040755A |. 8B55 E8 |MOV EDX,DWORD PTR SS:[EBP-18]
0040755D |. 0FB64A 2C |MOVZX ECX,BYTE PTR DS:[EDX+2C] ; 获取武将等级
00407561 |. 3BC1 |CMP EAX,ECX ; 武将等级与习得策略等级做比较,判断是否相同,相同即习得
00407563 |. 74 1C |JE SHORT Ekd5.00407581
00407565 |> 6A 00 |PUSH 0
00407567 |. FF75 E8 |PUSH DWORD PTR SS:[EBP-18]
0040756A |. FF75 F8 |PUSH DWORD PTR SS:[EBP-8]
0040756D |. E8 F0750C00 |CALL Ekd5.004CEB62 ; *******调用自写函数【判断+C武将是否可习得+8栈策略】输出EAX=0即不可以
00407572 |. 85C0 |TEST EAX,EAX
00407574 |. 74 23 |JE SHORT Ekd5.00407599
00407576 |. 90 |NOP
00407577 |. 90 |NOP
00407578 |. 90 |NOP
00407579 |. 90 |NOP
0040757A |. 90 |NOP
0040757B |. 90 |NOP
0040757C |. 90 |NOP
0040757D |. 90 |NOP
0040757E |. 90 |NOP
0040757F |. 90 |NOP
00407580 |. 90 |NOP
00407581 |> FF75 F8 |PUSH DWORD PTR SS:[EBP-8]
00407584 |. E8 A16C0C00 |CALL Ekd5.004CE22A ; ***调用自写函数【根据+8栈值,计算出策略内存地址】,+8栈=策略编号,输出ECX
00407589 |. 51 |PUSH ECX ; /首字节起即为物品名字
2:其实代码很少,只是要从原版中挤点空间出来插入新函数,所以显得有点多
//战场作战指令-策略按钮是否可使用判断:主要通过武将兵种是否有策略和是否有特效-策略模仿(有则获取相邻武将兵种策略),来决定策略按钮是否可用
/特效-策略模仿,如果不想拥有策略模仿特效的武将可以模仿 武将拥有的策略(非兵种),此处可以省略
一缩则缩出一堆空间出来......
0043DF7F |. FF75 DC ||PUSH DWORD PTR SS:[EBP-24]
0043DF82 |. E8 E10A0900 ||CALL Ekd5.004CEA68 ; ******调用自写函数【根据8栈编号计算出对应的武将战场内存地址】输出ECX
0043DF87 |. E8 E4FFFDFF ||CALL Ekd5.0041DF70 ; *****根据ECX=武将战场内存地址获取武将小兵种编号
0043DF8C |. 25 FF000000 ||AND EAX,0FF
0043DF91 |. 50 ||PUSH EAX
0043DF92 |. FF75 F0 ||PUSH DWORD PTR SS:[EBP-10]
0043DF95 |. E8 90020900 ||CALL Ekd5.004CE22A ; ***调用自写函数【根据+8栈值,计算出策略内存地址】,+8栈=策略编号,输出ECX
0043DF9A |. E8 E1B5FCFF ||CALL Ekd5.00409580 ; \******根据小兵种编号获取策略习得等级要求,+8栈=兵种编号 ECX=策略内存地址
0043DF9F |. 85C0 ||TEST EAX,EAX
0043DFA1 |. 74 17 ||JE SHORT Ekd5.0043DFBA
0043DFA3 |. 8BD8 ||MOV EBX,EAX
0043DFA5 |. FF75 DC ||PUSH DWORD PTR SS:[EBP-24]
0043DFA8 |. E8 BB0A0900 ||CALL Ekd5.004CEA68 ; ******调用自写函数【根据8栈编号计算出对应的武将战场内存地址】输出ECX
0043DFAD |. E8 B6050900 ||CALL Ekd5.004CE568 ; ******调用自写函数【根据ECX=武将战场内存地址计算出其DATA内存地址】,输出ECX
0043DFB2 |. 0FB641 2C ||MOVZX EAX,BYTE PTR DS:[ECX+2C] ; 获取武将等级
0043DFB6 |. 3BC3 ||CMP EAX,EBX
0043DFB8 |. 7D 6E ||JGE SHORT Ekd5.0043E028
0043DFBA |> FF75 DC ||PUSH DWORD PTR SS:[EBP-24]
0043DFBD |. E8 A60A0900 ||CALL Ekd5.004CEA68 ; ******调用自写函数【根据8栈编号计算出对应的武将战场内存地址】输出ECX
0043DFC2 |. E8 A1050900 ||CALL Ekd5.004CE568 ; ******调用自写函数【根据ECX=武将战场内存地址计算出其DATA内存地址】,输出ECX
0043DFC7 |. 6A 01 ||PUSH 1
0043DFC9 |. 51 ||PUSH ECX
0043DFCA |. FF75 F0 ||PUSH DWORD PTR SS:[EBP-10]
0043DFCD |. E8 900B0900 ||CALL Ekd5.004CEB62 ; *******调用自写函数【判断+C武将是否可习得+8栈策略】输出EAX=0即不可以
0043DFD2 |. 85C0 ||TEST EAX,EAX
0043DFD4 |. 74 5B ||JE SHORT Ekd5.0043E031
0043DFD6 |. 90 0043DFD6-0043E027全部90
0043DFD7 |. 90
0043E027 |. 90 ||NOP
0043E028 |> C745 E8 01000000 ||MOV DWORD PTR SS:[EBP-18],1
/正常策略按钮可用判断,即武将兵种是否有策略
一缩则缩出一堆空间出来......
0043E03B |> \C745 F0 00000000 MOV DWORD PTR SS:[EBP-10],0
0043E042 |. 837D E8 00 CMP DWORD PTR SS:[EBP-18],0
0043E046 |. 0F85 92000000 JNZ Ekd5.0043E0DE
0043E04C |. 90 NOP
0043E04D |. 90 NOP
0043E04E |. 90 NOP
0043E04F |. 90 NOP
0043E050 |> 837D F0 44 /CMP DWORD PTR SS:[EBP-10],44 ; 68个策略
0043E054 |. 7D 4E |JGE SHORT Ekd5.0043E0A4
0043E056 |. 0FB64D EC |MOVZX ECX,BYTE PTR SS:[EBP-14]
0043E05A |. 51 |PUSH ECX
0043E05B |. FF75 F0 |PUSH DWORD PTR SS:[EBP-10]
0043E05E |. E8 C7010900 |CALL Ekd5.004CE22A ; ***调用自写函数【根据+8栈值,计算出策略内存地址】,+8栈=策略编号,输出ECX
0043E063 |. E8 18B5FCFF |CALL Ekd5.00409580 ; \******根据小兵种编号获取策略习得等级要求,+8栈=兵种编号 ECX=策略内存地址
0043E068 |. 85C0 |TEST EAX,EAX ; =0即不可习得
0043E06A |. 74 13 |JE SHORT Ekd5.0043E07F
0043E06C |. 8BD8 |MOV EBX,EAX
0043E06E |. 8B4D D4 |MOV ECX,DWORD PTR SS:[EBP-2C] ; 武将战场内存地址
0043E071 |. E8 F2040900 |CALL Ekd5.004CE568 ; ******调用自写函数【根据ECX=武将战场内存地址计算出其DATA内存地址】,输出ECX
0043E076 |. E8 5585FCFF |CALL Ekd5.004065D0 ; ***获取武将等级
0043E07B |. 3AC3 |CMP AL,BL
0043E07D |. 73 17 |JNB SHORT Ekd5.0043E096 ; 大于等于跳转
0043E07F |> 8B4D D4 |MOV ECX,DWORD PTR SS:[EBP-2C]
0043E082 |. E8 E1040900 |CALL Ekd5.004CE568 ; ******调用自写函数【根据ECX=武将战场内存地址计算出其DATA内存地址】,输出ECX
0043E087 |. 6A 01 |PUSH 1
0043E089 |. 51 |PUSH ECX
0043E08A |. FF75 F0 |PUSH DWORD PTR SS:[EBP-10]
0043E08D |. E8 D00A0900 |CALL Ekd5.004CEB62 ; *******调用自写函数【判断+C武将是否可习得+8栈策略】输出EAX=0即不可以
0043E092 |. 85C0 |TEST EAX,EAX
0043E094 |. 74 09 |JE SHORT Ekd5.0043E09F
0043E096 |> C745 E8 01000000 |MOV DWORD PTR SS:[EBP-18],1
0043E09D |. EB 05 |JMP SHORT Ekd5.0043E0A4
0043E09F |> FF45 F0 |INC DWORD PTR SS:[EBP-10]
0043E0A2 |.^ EB AC \JMP SHORT Ekd5.0043E050
0043E0A4 |> 90 0043E0A4 - 0043E0DD 全部 90
0043E0DD |. 90 NOP
0043E0DE |. 837D E8 00 CMP DWORD PTR SS:[EBP-18],0 ; 判断是否没有策略标记
3:
//战场指令策略列表,同样有特效-处理模仿判断
00465C31 |. FFB5 A8FEFFFF ||PUSH DWORD PTR SS:[EBP-158] ; 相邻武将战场编号
00465C37 |. E8 2C8E0600 ||CALL Ekd5.004CEA68 ; ******调用自写函数【根据8栈编号计算出对应的武将战场内存地址】输出ECX
00465C3C |. E8 2F83FBFF ||CALL Ekd5.0041DF70 ; ******根据ECX=武将战场内存获取武将小兵种,输出al
00465C41 |. 25 FF000000 ||AND EAX,0FF
00465C46 |. 50 ||PUSH EAX
00465C47 |. FFB5 C4FEFFFF ||PUSH DWORD PTR SS:[EBP-13C]
00465C4D |. E8 D8850600 ||CALL Ekd5.004CE22A ; ***调用自写函数【根据+8栈值,计算出策略内存地址】,+8栈=策略编号,输出ECX
00465C52 |. E8 2939FAFF ||CALL Ekd5.00409580 ; \******根据小兵种编号获取策略习得等级要求,+8栈=兵种编号 ECX=策略内存地址
00465C57 |. 85C0 ||TEST EAX,EAX
00465C59 |. 74 1A ||JE SHORT Ekd5.00465C75
00465C5B |. 8BD8 ||MOV EBX,EAX
00465C5D |. FFB5 A8FEFFFF ||PUSH DWORD PTR SS:[EBP-158]
00465C63 |. E8 008E0600 ||CALL Ekd5.004CEA68 ; ******调用自写函数【根据8栈编号计算出对应的武将战场内存地址】输出ECX
00465C68 |. E8 FB880600 ||CALL Ekd5.004CE568 ; ******调用自写函数【根据ECX=武将战场内存地址计算出其DATA内存地址】,输出ECX
00465C6D |. 0FB641 2C ||MOVZX EAX,BYTE PTR DS:[ECX+2C] ; ***获取武将等级
00465C71 |. 3BC3 ||CMP EAX,EBX
00465C73 |. 7D 78 ||JGE SHORT Ekd5.00465CED
00465C75 |> FFB5 A8FEFFFF ||PUSH DWORD PTR SS:[EBP-158]
00465C7B |. E8 E88D0600 ||CALL Ekd5.004CEA68 ; ******调用自写函数【根据8栈编号计算出对应的武将战场内存地址】输出ECX
00465C80 |. E8 E3880600 ||CALL Ekd5.004CE568 ; ******调用自写函数【根据ECX=武将战场内存地址计算出其DATA内存地址】,输出ECX
00465C85 |. 6A 01 ||PUSH 1
00465C87 |. 51 ||PUSH ECX
00465C88 |. FFB5 C4FEFFFF ||PUSH DWORD PTR SS:[EBP-13C]
00465C8E |. E8 CF8E0600 ||CALL Ekd5.004CEB62 ; *******调用自写函数【判断+C武将是否可习得+8栈策略】输出EAX=0即不可以
00465C93 |. 85C0 ||TEST EAX,EAX
00465C95 |. 74 6D ||JE SHORT Ekd5.00465D04
00465C97 |. 90 00465C97 - 00465CEC全部90
00465CEC |. 90 ||NOP
00465CED |> 8B8D C4FEFFFF ||MOV ECX,DWORD PTR SS:[EBP-13C]
/正常玩家是否有策略判断
00465D3A |. 8B8D D8FEFFFF |MOV ECX,DWORD PTR SS:[EBP-128]
00465D40 |. 81E1 FF000000 |AND ECX,0FF
00465D46 |. 51 |PUSH ECX
00465D47 |. FFB5 C4FEFFFF |PUSH DWORD PTR SS:[EBP-13C]
00465D4D |. E8 D8840600 |CALL Ekd5.004CE22A ; ***调用自写函数【根据+8栈值,计算出策略内存地址】,+8栈=策略编号,输出ECX
00465D52 |. E8 2938FAFF |CALL Ekd5.00409580 ; \******根据小兵种编号获取策略习得等级要求,+8栈=兵种编号 ECX=策略内存地址
00465D57 |. 85C0 |TEST EAX,EAX
00465D59 |. 74 18 |JE SHORT Ekd5.00465D73
00465D5B |. 8BD8 |MOV EBX,EAX
00465D5D |. 8B85 98FEFFFF |MOV EAX,DWORD PTR SS:[EBP-168]
00465D63 |. 8B48 50 |MOV ECX,DWORD PTR DS:[EAX+50]
00465D66 |. E8 FD870600 |CALL Ekd5.004CE568 ; ******调用自写函数【根据ECX=武将战场内存地址计算出其DATA内存地址】,输出ECX
00465D6B |. 0FB641 2C |MOVZX EAX,BYTE PTR DS:[ECX+2C] ; ***获取武将等级
00465D6F |. 3BC3 |CMP EAX,EBX
00465D71 |. 7D 4D |JGE SHORT Ekd5.00465DC0
00465D73 |> 8B85 98FEFFFF |MOV EAX,DWORD PTR SS:[EBP-168]
00465D79 |. 8B48 50 |MOV ECX,DWORD PTR DS:[EAX+50]
00465D7C |. E8 E7870600 |CALL Ekd5.004CE568 ; ******调用自写函数【根据ECX=武将战场内存地址计算出其DATA内存地址】,输出ECX
00465D81 |. 6A 01 |PUSH 1
00465D83 |. 51 |PUSH ECX
00465D84 |. FFB5 C4FEFFFF |PUSH DWORD PTR SS:[EBP-13C]
00465D8A |. E8 D38D0600 |CALL Ekd5.004CEB62 ; *******调用自写函数【判断+C武将是否可习得+8栈策略】输出EAX=0即不可以
00465D8F |. 85C0 |TEST EAX,EAX
00465D91 |. 74 44 |JE SHORT Ekd5.00465DD7
00465D93 |. 90 00465D93 - 00465DBF 全部 90
00465DBF |. 90 |NOP
00465DC0 |> 8B8D C4FEFFFF |MOV ECX,DWORD PTR SS:[EBP-13C]
4:
//武将资料框策略列表
0046596B |. FF75 E8 |PUSH DWORD PTR SS:[EBP-18]
0046596E |. E8 B7880600 |CALL Ekd5.004CE22A ; ***调用自写函数【根据+8栈值,计算出策略内存地址】,+8栈=策略编号,输出ECX
00465973 |. E8 083CFAFF |CALL Ekd5.00409580 ; \******根据小兵种编号获取策略习得等级要求,+8栈=兵种编号 ECX=策略内存地址
00465978 |. 85C0 |TEST EAX,EAX
0046597A |. 74 1E |JE SHORT Ekd5.0046599A
0046597C |. 8BD8 |MOV EBX,EAX
0046597E |. 8B15 04754B00 |MOV EDX,DWORD PTR DS:[4B7504]
00465984 |. 3E:8B0C95 F06C4B00 |MOV ECX,DWORD PTR DS:[EDX*4+4B6CF0] ; 获取当前查看资料的武将DATA序号
0046598C |. 51 |PUSH ECX
0046598D |. E8 5C920600 |CALL Ekd5.004CEBEE ; ***调用自写函数【根据+8栈值,计算相对应的武将DATA内存】,输出ECX
00465992 |. 0FB641 2C |MOVZX EAX,BYTE PTR DS:[ECX+2C]
00465996 |. 3BC3 |CMP EAX,EBX
00465998 |. 7D 31 |JGE SHORT Ekd5.004659CB
0046599A |> 8B15 04754B00 |MOV EDX,DWORD PTR DS:[4B7504]
004659A0 |. 3E:8B0C95 F06C4B00 |MOV ECX,DWORD PTR DS:[EDX*4+4B6CF0]
004659A8 |. 51 |PUSH ECX
004659A9 |. E8 40920600 |CALL Ekd5.004CEBEE ; ***调用自写函数【根据+8栈值,计算相对应的武将DATA内存】,输出ECX
004659AE |. 6A 01 |PUSH 1
004659B0 |. 51 |PUSH ECX
004659B1 |. FF75 E8 |PUSH DWORD PTR SS:[EBP-18]
004659B4 |. E8 A9910600 |CALL Ekd5.004CEB62 ; *******调用自写函数【判断+C武将是否可习得+8栈策略】输出EAX=0即不可以
004659B9 |. 85C0 |TEST EAX,EAX
004659BB |. 74 1E |JE SHORT Ekd5.004659DB
004659BD |. 90 |NOP
004659BE |. 90 |NOP
004659BF |. 90 |NOP
004659C0 |. 90 |NOP
004659C1 |. 90 |NOP
004659C2 |. 90 |NOP
004659C3 |. 90 |NOP
004659C4 |. 90 |NOP
004659C5 |. 90 |NOP
004659C6 |. 90 |NOP
004659C7 |. 90 |NOP
004659C8 |. 90 |NOP
004659C9 |. 90 |NOP
004659CA |. 90 |NOP
004659CB |> 8B55 E8 |MOV EDX,DWORD PTR SS:[EBP-18]
5:AI
//AI使用策略判断
00438463 |. 50 |PUSH EAX
00438464 |. FF75 AC |PUSH DWORD PTR SS:[EBP-54]
00438467 |. E8 BE5D0900 |CALL Ekd5.004CE22A ; ***调用自写函数【根据+8栈值,计算出策略内存地址】,+8栈=策略编号,输出ECX
0043846C |. E8 0F11FDFF |CALL Ekd5.00409580 ; \******根据小兵种编号获取策略习得等级要求,+8栈=兵种编号 ECX=策略内存地址
00438471 |. 85C0 |TEST EAX,EAX
00438473 |. 74 0B |JE SHORT Ekd5.00438480
00438475 |. 8B55 A8 |MOV EDX,DWORD PTR SS:[EBP-58] ; 武将DATA内存地址
00438478 |. 0FB64A 2C |MOVZX ECX,BYTE PTR DS:[EDX+2C] ; 获取武将等级
0043847C |. 3BC8 |CMP ECX,EAX
0043847E |. 7D 47 |JGE SHORT Ekd5.004384C7 ; **跳至下方判断MP是否足够
00438480 |> 6A 01 |PUSH 1
00438482 |. FF75 A8 |PUSH DWORD PTR SS:[EBP-58]
00438485 |. FF75 AC |PUSH DWORD PTR SS:[EBP-54]
00438488 |. E8 D5660900 |CALL Ekd5.004CEB62 ; *******调用自写函数【判断+C武将是否可习得+8栈策略】输出EAX=0即不可以
0043848D |. 85C0 |TEST EAX,EAX
0043848F |. 74 6B |JE SHORT Ekd5.004384FC
00438491 |. 90 00438491 - 004384C6全部 90
004384C6 |. 90 |NOP
004384C7 |> 8B4D AC |MOV ECX,DWORD PTR SS:[EBP-54]
完毕:效果图如下
[ 本帖最后由 a117398902 于 2018-8-26 19:00 编辑 ] | |