标题: 武将习得策略个性化,不受兵种限制
性别:未知-离线 a117398902
(G仔)

Rank: 4
组别 士兵
级别 牙门将军
功绩 5
帖子 546
编号 301657
注册 2008-12-18


发表于 2018-8-20 13:32 资料 个人空间 短消息 只看该作者
武将习得策略个性化,不受兵种限制

最近重新操刀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 编辑 ]


图片附件: 7.jpg (2018-8-20 13:33, 157.03 K)


本帖最近评分记录
ylh2004 2018-9-3 15:15 +500 好帖奖励


顶部
性别:男-离线 程军超
(虎贲郎赵统)

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 安国将军
好贴 1
功绩 23
帖子 819
编号 498865
注册 2014-3-4
来自 山东烟台


发表于 2018-8-21 10:07 资料 文集 短消息 只看该作者 QQ
卧槽,膜拜巨佬,这个东西会更加使每一个角色个性化,防止重复性,哪怕我军有两个策士,那么他们精通的策略系列也可以不一样做出区分,实在是太强大了。


顶部
性别:未知-离线 a117398902
(G仔)

Rank: 4
组别 士兵
级别 牙门将军
功绩 5
帖子 546
编号 301657
注册 2008-12-18


发表于 2018-8-23 23:37 资料 个人空间 短消息 只看该作者
回复 #2 程军超 的帖子

虽然隔了段时间没来,但印象中你好像是男的,怎么变成女的了
顶部
性别:未知-离线 59054695
(筱尐小白)

Rank: 4
组别 士兵
级别 裨将军
功绩 3
帖子 310
编号 310804
注册 2009-2-13


发表于 2018-9-3 01:11 资料 短消息 只看该作者
膜拜大佬,大佬之前的帖子就对我帮助巨大,这次又出教程贴,又来学习。
顶部
性别:未知-离线 59054695
(筱尐小白)

Rank: 4
组别 士兵
级别 裨将军
功绩 3
帖子 310
编号 310804
注册 2009-2-13


发表于 2018-9-3 09:25 资料 短消息 只看该作者
不过第一反应,6.0不是已经有剧本指定学会策略了吗?这个的效果会不会和本身效果有重复啊?
顶部
性别:男-离线 易逍遥
(大白迷弟(●—●))

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
功绩 2
帖子 210
编号 386067
注册 2010-7-7
来自 云荒大陆空桑原无量州
家族 轩辕学院


发表于 2018-9-3 09:30 资料 短消息 只看该作者
特来膜拜大佬,如今ccz人才稀罕的时代,还能有这样的技术贴,实在令人激动!
顶部
性别:男-离线 ★天空★
(海外的天空,自然的美丽)

Rank: 4
组别 士兵
级别 裨将军
功绩 3
帖子 306
编号 485538
注册 2013-6-22
来自 加拿大


发表于 2019-3-25 12:31 资料 短消息 只看该作者 QQ
这个年代竟然还有楼主这样的高手,真是太好了。
顶部
性别:未知-离线 zhuxl2002

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
功绩 3
帖子 278
编号 249454
注册 2007-12-13


发表于 2019-10-25 12:28 资料 短消息 只看该作者
楼主能不能把你修改好的引擎发上来,让我们这些不会改代码的小白也感受一下楼主的风采!
顶部
性别:男-离线 leo003
(老茂)

Rank: 5Rank: 5
组别 士兵
级别 讨逆将军
功绩 7
帖子 679
编号 49311
注册 2005-9-20
来自 安徽


膜拜。。。。。牛逼。。。。
顶部
性别:未知-离线 武神常山赵云

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 3
编号 544768
注册 2021-5-30


发表于 2021-6-6 00:40 资料 短消息 只看该作者
这技术好厉害,可惜我学不会,哎。。
顶部
性别:未知-离线 long4444000


Rank: 8Rank: 8
组别 羽林都尉
级别 左将军
好贴 1
功绩 52
帖子 1238
编号 466409
注册 2012-7-18


发表于 2021-6-24 15:54 资料 文集 短消息 只看该作者
现在可以直接在剧本里改了
顶部
性别:未知-离线 ささきこじろう
(屠龙剑圣)

Rank: 7Rank: 7Rank: 7Rank: 7
组别 校尉
级别 右将军
功绩 12
帖子 1150
编号 538932
注册 2019-9-23
来自 柳洞寺


发表于 2023-10-21 16:49 资料 文集 短消息 只看该作者
我也在自己的引擎里面弄过一个,不过是1024人的。
顶部
性别:未知-离线 neochan

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 4
编号 516548
注册 2015-7-16


发表于 2024-5-31 21:46 资料 短消息 只看该作者
没文化只好说一句大佬牛笔
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2024-11-14 12:25
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.024046 second(s), 12 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP