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]
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位数金钱按照实际数值来显示变化了。具体应用的时候就可以将这条指令放在需要实时显示的地方就可以了。