轩辕春秋文化论坛 » 曹操传MOD制作交流 » 新引擎 71特效请求 指令的修改


2009-4-21 20:30 godtype
新引擎 71特效请求 指令的修改

[img]http://home.procivi.net/attachment/200904/21/419_1240316052PT33.jpg[/img]
新引擎里面有两条指令是专为瓦岗而设的,分别是71特效请求和72信息传送,其他的MOD用不到。
最近编写剧本中的自由转职系统时,由于打算在转职后重新计算武将的能力(包括五围和HPMP),原本是在剧本继续写指令的,但是本身自由转职已经需要很多条指令了,不想再让剧本变得过大,于是想到了修改引擎,因为我发现71指令挺适合的(如上图),我只要输入武将的编号,当执行了这条指令后,马上就会重新按照新的兵种能力重新计算部队的五围和HPMP,而且还可以包括吃果后的成长。
经过翻阅资料,加上请教其他高手,终于改出了一个雏形,经过简单的测试,无出错,现在发上论坛,可能还会有一些代码有问题,希望有其他高手看出来并指出错误之处,再提供一下意见。

00410C02     00204D00            DD 004D2000

004D2000   55               PUSH EBP
004D2001   8BEC             MOV EBP,ESP
004D2003   83EC 14          SUB ESP,14
004D2006   6A 04            PUSH 4
004D2008   8B4D 08          MOV ECX,DWORD PTR SS:[EBP+8]
004D200B   E8 E763F4FF      CALL 004183F7
004D2010   25 FFFF0000      AND EAX,0FFFF
004D2015   8945 FC          MOV DWORD PTR SS:[EBP-4],EAX
004D2018   8B4D FC          MOV ECX,DWORD PTR SS:[EBP-4]
004D201B   6BC9 48          IMUL ECX,ECX,48
004D201E   81C1 0000D600    ADD ECX,0D60000
004D2024   894D F8          MOV DWORD PTR SS:[EBP-8],ECX
004D2027   8B45 FC          MOV EAX,DWORD PTR SS:[EBP-4]
004D202A   E8 D0000000      CALL 004D20FF
004D202F   C645 F0 00       MOV BYTE PTR SS:[EBP-10],0
004D2033   EB 07            JMP SHORT 004D203C
004D2035   8A4D F0          MOV CL,BYTE PTR SS:[EBP-10]
004D2038   41               INC ECX
004D2039   884D F0          MOV BYTE PTR SS:[EBP-10],CL
004D203C   0FB655 F0        MOVZX EDX,BYTE PTR SS:[EBP-10]
004D2040   83FA 07          CMP EDX,7
004D2043   0F8D AD000000    JGE 004D20F6
004D2049   0FB645 F0        MOVZX EAX,BYTE PTR SS:[EBP-10]
004D204D   50               PUSH EAX
004D204E   8B4D F8          MOV ECX,DWORD PTR SS:[EBP-8]
004D2051   33D2             XOR EDX,EDX
004D2053   8A51 2B          MOV DL,BYTE PTR DS:[ECX+2B]
004D2056   8BCA             MOV ECX,EDX
004D2058   6BC9 1B          IMUL ECX,ECX,1B
004D205B   81C1 A0BF4A00    ADD ECX,004ABFA0
004D2061   E8 3A75F3FF      CALL 004095A0
004D2066   25 FF000000      AND EAX,0FF
004D206B   8945 F4          MOV DWORD PTR SS:[EBP-C],EAX
004D206E   0FB645 F0        MOVZX EAX,BYTE PTR SS:[EBP-10]
004D2072   83F8 04          CMP EAX,4
004D2075   7F 46            JG SHORT 004D20BD
004D2077   0FB64D F0        MOVZX ECX,BYTE PTR SS:[EBP-10]
004D207B   51               PUSH ECX
004D207C   8B4D F8          MOV ECX,DWORD PTR SS:[EBP-8]
004D207F   E8 7852F3FF      CALL 004072FC
004D2084   25 FF000000      AND EAX,0FF
004D2089   8B4D F4          MOV ECX,DWORD PTR SS:[EBP-C]
004D208C   03C8             ADD ECX,EAX
004D208E   D1E9             SHR ECX,1
004D2090   894D EC          MOV DWORD PTR SS:[EBP-14],ECX
004D2093   8B45 EC          MOV EAX,DWORD PTR SS:[EBP-14]
004D2096   8B4D F8          MOV ECX,DWORD PTR SS:[EBP-8]
004D2099   33D2             XOR EDX,EDX
004D209B   8A51 2C          MOV DL,BYTE PTR DS:[ECX+2C]
004D209E   0FAFC2           IMUL EAX,EDX
004D20A1   33D2             XOR EDX,EDX
004D20A3   8A55 F0          MOV DL,BYTE PTR SS:[EBP-10]
004D20A6   80C2 21          ADD DL,21
004D20A9   8A1411           MOV DL,BYTE PTR DS:[ECX+EDX]
004D20AC   03C2             ADD EAX,EDX
004D20AE   0FB655 F0        MOVZX EDX,BYTE PTR SS:[EBP-10]
004D20B2   D1E2             SHL EDX,1
004D20B4   80C2 11          ADD DL,11
004D20B7   66:890411        MOV WORD PTR DS:[ECX+EDX],AX
004D20BB   EB 34            JMP SHORT 004D20F1
004D20BD   83F8 05          CMP EAX,5
004D20C0   75 19            JNZ SHORT 004D20DB
004D20C2   8B45 F4          MOV EAX,DWORD PTR SS:[EBP-C]
004D20C5   8B4D F8          MOV ECX,DWORD PTR SS:[EBP-8]
004D20C8   33D2             XOR EDX,EDX
004D20CA   8A51 2C          MOV DL,BYTE PTR DS:[ECX+2C]
004D20CD   0FAFC2           IMUL EAX,EDX
004D20D0   66:8B51 1C       MOV DX,WORD PTR DS:[ECX+1C]
004D20D4   03C2             ADD EAX,EDX
004D20D6   8941 1C          MOV DWORD PTR DS:[ECX+1C],EAX
004D20D9   EB 16            JMP SHORT 004D20F1
004D20DB   8B45 F4          MOV EAX,DWORD PTR SS:[EBP-C]
004D20DE   8B4D F8          MOV ECX,DWORD PTR SS:[EBP-8]
004D20E1   33D2             XOR EDX,EDX
004D20E3   8A51 2C          MOV DL,BYTE PTR DS:[ECX+2C]
004D20E6   0FAFC2           IMUL EAX,EDX
004D20E9   8A51 20          MOV DL,BYTE PTR DS:[ECX+20]
004D20EC   03C2             ADD EAX,EDX
004D20EE   8841 20          MOV BYTE PTR DS:[ECX+20],AL
004D20F1  ^E9 3FFFFFFF      JMP 004D2035
004D20F6   B8 01000000      MOV EAX,1
004D20FB   8BE5             MOV ESP,EBP
004D20FD   5D               POP EBP
004D20FE   C3               RETN

004D20FF   55               PUSH EBP
004D2100   8BEC             MOV EBP,ESP
004D2102   83EC 10          SUB ESP,10
004D2105   894D F8          MOV DWORD PTR SS:[EBP-8],ECX
004D2108   8945 FC          MOV DWORD PTR SS:[EBP-4],EAX
004D210B   A1 606F4900      MOV EAX,DWORD PTR DS:[496F60]
004D2110   50               PUSH EAX
004D2111   6A 00            PUSH 0
004D2113   68 60BB4800      PUSH 0048BB60                     ; ASCII "DATA.E5"
004D2118   E8 0194F4FF      CALL 0041B51E
004D211D   83C4 0C          ADD ESP,0C
004D2120   85C0             TEST EAX,EAX
004D2122   75 02            JNZ SHORT 004D2126
004D2124   EB 56            JMP SHORT 004D217C
004D2126   8B0D 606F4900    MOV ECX,DWORD PTR DS:[496F60]
004D212C   8B45 FC          MOV EAX,DWORD PTR SS:[EBP-4]
004D212F   6BC0 20          IMUL EAX,EAX,20
004D2132   03C1             ADD EAX,ECX
004D2134   83C0 17          ADD EAX,17
004D2137   8945 F4          MOV DWORD PTR SS:[EBP-C],EAX
004D213A   8B45 F4          MOV EAX,DWORD PTR SS:[EBP-C]
004D213D   33C9             XOR ECX,ECX
004D213F   8A08             MOV CL,BYTE PTR DS:[EAX]
004D2141   894D F0          MOV DWORD PTR SS:[EBP-10],ECX
004D2144   8B55 F4          MOV EDX,DWORD PTR SS:[EBP-C]
004D2147   83C2 01          ADD EDX,1
004D214A   8955 F4          MOV DWORD PTR SS:[EBP-C],EDX
004D214D   8B45 F4          MOV EAX,DWORD PTR SS:[EBP-C]
004D2150   33C9             XOR ECX,ECX
004D2152   8A08             MOV CL,BYTE PTR DS:[EAX]
004D2154   C1E1 08          SHL ECX,8
004D2157   8B55 F0          MOV EDX,DWORD PTR SS:[EBP-10]
004D215A   03D1             ADD EDX,ECX
004D215C   8955 F0          MOV DWORD PTR SS:[EBP-10],EDX
004D215F   8B45 F4          MOV EAX,DWORD PTR SS:[EBP-C]
004D2162   83C0 01          ADD EAX,1
004D2165   8945 F4          MOV DWORD PTR SS:[EBP-C],EAX
004D2168   8B4D F8          MOV ECX,DWORD PTR SS:[EBP-8]
004D216B   8B55 F0          MOV EDX,DWORD PTR SS:[EBP-10]
004D216E   8951 1C          MOV DWORD PTR DS:[ECX+1C],EDX
004D2171   8B45 F8          MOV EAX,DWORD PTR SS:[EBP-8]
004D2174   8B4D F4          MOV ECX,DWORD PTR SS:[EBP-C]
004D2177   8A11             MOV DL,BYTE PTR DS:[ECX]
004D2179   8850 20          MOV BYTE PTR DS:[EAX+20],DL
004D217C   8BE5             MOV ESP,EBP
004D217E   5D               POP EBP
004D217F   C3               RETN


不详细解释了,高手们一般都可以看得出来。
希望能够指出需要改进的地方。

[color=Silver][[i] 本帖最后由 godtype 于 2009-4-22 19:19 编辑 [/i]][/color]

2009-4-21 20:47 37610716
:titter:  不过这个好像剧情增加的能力没有了?

2009-4-22 03:23 obin
其實我的武聖傳有另外計算劇情增加的能力..
另外建議一下,讓71指令配合變量來設定功能
例如71指令為1,變量4095為5,就重新計算武將編號5的能力
這樣71指令的用途就真的無可限量了..

2009-4-22 14:24 花言乔语
哎,手机看不了图。

2009-4-22 19:26 godtype
基本上已经完善好了,HP和MP已经可以正常计算出来了。

2009-4-22 23:03 蛇夫座
用STAR的5.1输入后简单测试了一下,HP,MP确实可以重新计算,但其它能力好象没有变动。不知道我有无抄错,未有时间详细检查。
      还有的是当执行此命令后,在此剧本命令后续的命令好象也没有反应...
      我是在点击测试中设置的  52 : 兵种改变   其它OK

2009-4-23 08:34 godtype
回复 #6 蛇夫座 的帖子

5.1不能够照抄的,因为部队成长的写法改了。

004D207F   E8 7852F3FF      CALL 004072FC
改成
CALL 004072F2
试一下

后续指令我用52来测试是没有问题,兵种可以改变。

STAR 5.1版如果要用这个修改,可能还要调整一下,等有时间再做。

2009-4-23 22:08 蛇夫座
回复 #7 godtype 的帖子

改成 CALL 004072F2  之后无问题了,后续指令也正常:!*
        感觉上参考这条指令的修改完全可以定制出属于自己的EXE。
     自己无技术...期待版主继续无私的奉献。

2009-4-23 22:09 37610716
回复 #8 蛇夫座 的帖子

我也测试无误,这里又碰到白老鼠!:titter:

2009-12-6 02:03 狂煞∑小星
厄,支持啊,这样的话MOD里可以用了,但是偶看不懂地址啊,是OB,还是UE,还是其他的(我是个编辑BC。。。)

2009-12-6 10:44 大明英烈
支持一下

2009-12-7 20:07 morningboo
回复 #10 狂煞∑小星 的帖子

很明显是OB,修改时不能完全照抄,尤其是几个函数的调用

2009-12-9 10:36 huangkun0109
超级大白鼠路过,只能精神上支持了,自己也慢慢学习这方面的知识。

2010-5-12 10:17 godtype001
更新一些实用性较高的用法

顶楼的用法已经过时了,目前在自用的EXE和发布的引擎4.0系列里面,71的用法都是每一个设值配合特定的整形变量来代表一种效果,例如战场特效、自动计算能力等。
今天就更新一个实用性较高的用法,用途是自由R中,金钱的自动变化。

金钱的自动变化,最有名的就是无双战略版了,但是要运行相当多的剧本指令来实现这种效果,影响系统的速度,所以我就进行了改良。代码如下(注意不是无双的,是我自用的):
首先是71指令的再次改造
[font=宋体]0040614C  /. 55             PUSH EBP
0040614D  |. 8BEC           MOV EBP,ESP
0040614F  |. 51             PUSH ECX
00406150  |. 6A 04          PUSH 4
00406152  |. 8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]
00406155  |. E8 9D220100    CALL 004183F7
0040615A  |. 25 FFFF0000    AND EAX,0FFFF
0040615F  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
00406162  |. 83F8 14        CMP EAX,14
00406165  |. 7C 07          JL SHORT 0040616E
00406167  |. B8 05000000    MOV EAX,5
0040616C  |. EB 0F          JMP SHORT 0040617D
0040616E  |> 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
00406171  |. FF148D 8161400>CALL DWORD PTR DS:[ECX*4+406181]
00406178  |. B8 01000000    MOV EAX,1
0040617D  |> 8BE5           MOV ESP,EBP
0040617F  |. 5D             POP EBP
00406180  \. C3             RETN
00406181   . FD1A4D00       DD 004D1AFD
00406185     80454300       DD 00434580
00406189     8C1F4D00       DD 004D1F8C
0040618D     391E4D00       DD 004D1E39
00406191     781F4D00       DD 004D1F78
[color=Red]00406195     40264D00       DD 004D2640[/color][/font]

在这里,我选用了71指令设效果值为5的时候实现金钱自动变化
[font=宋体]004D2640   55               PUSH EBP
004D2641   8BEC             MOV EBP,ESP
004D2643   83EC 18          SUB ESP,18
004D2646   A1 7C074B00      MOV EAX,DWORD PTR DS:[4B077C][color=Blue]  ——  读出金钱数值[/color]
004D264B   3D 3F420F00      CMP EAX,0F423F[color=Blue]  ——  看金钱是否超过999999,预防有人用修改器改出过大数值[/color]
004D2650   76 0A            JBE SHORT 004D265C
004D2652   B8 3F420F00      MOV EAX,0F423F
004D2657   A3 7C074B00      MOV DWORD PTR DS:[4B077C],EAX[color=Blue]  ——  超过999999就强制恢复为999999,并重新保存回金钱的内存地址中[/color]
004D265C   8945 FC          MOV DWORD PTR SS:[EBP-4],EAX[color=Blue]  ——  金钱数值保存到[EBP-4]中[/color]
004D265F   8B45 FC          MOV EAX,DWORD PTR SS:[EBP-4]
004D2662   33D2             XOR EDX,EDX
004D2664   B9 A0860100      MOV ECX,186A0[color=Blue]  ——  金钱数值除以100000,用来判断十万位应该显示多少[/color]
004D2669   F7F1             DIV ECX
004D266B   8955 F8          MOV DWORD PTR SS:[EBP-8],EDX[color=Blue]  ——  整除后将余数保存到[EBP-8]里面,用作后面万位的判断[/color]
004D266E   83C0 08          ADD EAX,8[color=Blue]  ——  整除后的结果+8,作为R形象的动作[/color]
004D2671   6A 02            PUSH 2[color=Blue]  ——  这个是R形象的方向值,02为向南[/color]
004D2673   50               PUSH EAX[color=Blue]  ——  R形象的动作[/color]
004D2674   68 DE130000      PUSH 13DE[color=Blue]  ——  十万位R形象的人物编号[/color]
004D2679   E8 0965F5FF      CALL 00428B87[color=Blue]  ——  剧本指令中武将转向和武将动作的核心函数[/color]
004D267E   83C4 0C          ADD ESP,0C
004D2681   8B45 F8          MOV EAX,DWORD PTR SS:[EBP-8][color=Blue]  ——  轮到万位了,将之前的除以100000之后的余数读出来[/color]
004D2684   33D2             XOR EDX,EDX
004D2686   B9 10270000      MOV ECX,2710[color=Blue]  ——  除以10000[/color]
004D268B   F7F1             DIV ECX
004D268D   8955 F4          MOV DWORD PTR SS:[EBP-C],EDX[color=Blue]  ——  余数继续保存起来[/color]
004D2690   83C0 08          ADD EAX,8
004D2693   6A 02            PUSH 2
004D2695   50               PUSH EAX
004D2696   68 DF130000      PUSH 13DF[color=Blue]  ——  万位R形象的人物编号[/color]
004D269B   E8 E764F5FF      CALL 00428B87
004D26A0   83C4 0C          ADD ESP,0C
004D26A3   8B45 F4          MOV EAX,DWORD PTR SS:[EBP-C]
004D26A6   33D2             XOR EDX,EDX
004D26A8   B9 E8030000      MOV ECX,3E8[color=Blue]  ——  除以1000[/color]
004D26AD   F7F1             DIV ECX
004D26AF   8955 F0          MOV DWORD PTR SS:[EBP-10],EDX
004D26B2   83C0 08          ADD EAX,8
004D26B5   6A 02            PUSH 2
004D26B7   50               PUSH EAX
004D26B8   68 E0130000      PUSH 13E0[color=Blue]  ——  千位R形象的人物编号[/color]
004D26BD   E8 C564F5FF      CALL 00428B87
004D26C2   83C4 0C          ADD ESP,0C
004D26C5   8B45 F0          MOV EAX,DWORD PTR SS:[EBP-10]
004D26C8   33D2             XOR EDX,EDX
004D26CA   B9 64000000      MOV ECX,64[color=Blue]  ——  除以100[/color]
004D26CF   F7F1             DIV ECX
004D26D1   8955 EC          MOV DWORD PTR SS:[EBP-14],EDX
004D26D4   83C0 08          ADD EAX,8
004D26D7   6A 02            PUSH 2
004D26D9   50               PUSH EAX
004D26DA   68 E1130000      PUSH 13E1[color=Blue]  ——  百位R形象的人物编号[/color]
004D26DF   E8 A364F5FF      CALL 00428B87
004D26E4   83C4 0C          ADD ESP,0C
004D26E7   8B45 EC          MOV EAX,DWORD PTR SS:[EBP-14]
004D26EA   33D2             XOR EDX,EDX
004D26EC   B9 0A000000      MOV ECX,0A[color=Blue]  ——  除以10[/color]
004D26F1   F7F1             DIV ECX
004D26F3   8955 E8          MOV DWORD PTR SS:[EBP-18],EDX
004D26F6   83C0 08          ADD EAX,8
004D26F9   6A 02            PUSH 2
004D26FB   50               PUSH EAX
004D26FC   68 E2130000      PUSH 13E2[color=Blue]  ——  十位R形象的人物编号[/color]
004D2701   E8 8164F5FF      CALL 00428B87
004D2706   83C4 0C          ADD ESP,0C
004D2709   8B45 E8          MOV EAX,DWORD PTR SS:[EBP-18]
004D270C   83C0 08          ADD EAX,8
004D270F   6A 02            PUSH 2
004D2711   50               PUSH EAX
004D2712   68 E3130000      PUSH 13E3[color=Blue]  ——  个位R形象的人物编号[/color]
004D2717   E8 6B64F5FF      CALL 00428B87
004D271C   83C4 0C          ADD ESP,0C
004D271F   8BE5             MOV ESP,EBP
004D2721   5D               POP EBP
004D2722   C3               RETN
[/font]

上面的代码当中,R形象的方向的对应值是00北、01东、02南、03西;而动作的对应值是从00普通开始到0F单手举起的,我这里用的是从08盘手举手开始,按0--9来对应显示,所以每一次整除后得出的数值都要加8,例如12345除以100000,得出结果是0,余数为12345,所以十万位显示为0,0对应的动作编号是08,所以0+8=8;而人物编号要在实际的编号的最前面补1,例如0号武将就是1000,我这里用的是990-995这6个武将,所以就是13DE(3DE就是990)--13E3了。

简单的剧本用法
Section
        2:内部信息 TEST
        2d:武将点击测试 0:曹操
        0:事件结束
                71:特效请求 5
                0:事件结束
例如这个例子,点击武将后,就会自动执行71指令,然后就会自动执行前面的代码,令自由R场景中的6位数金钱按照实际数值来显示变化了。具体应用的时候就可以将这条指令放在需要实时显示的地方就可以了。

2010-5-12 10:24 513633522
改的什么:hz1024:
改引擎还是剧本编辑器:hz1011:

2010-5-12 10:26 godtype001
回复 #15 513633522 的帖子

:hz1030:当然是改引擎了,不改引擎,剧本指令如何能够生效。

页: [1]


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