整型变量的另一种用途
本帖所有内容不得转载
从STAR175的第四版加强版开始,STAR175就利用了整型变量来控制某些特殊情况是否发生,我也从中学习并改进了一下。
以下例子是从STAR175的第四版加强版开始的商店自动售出设置,通过将整型变量4088设置为0则开启根据平均等级售出高中低级装备,设置为1则是传统的DATA设置:
00472C2E /$ 55 PUSH EBP
00472C2F |. 8BEC MOV EBP,ESP
00472C31 |. 51 PUSH ECX
00472C32 |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX
00472C35 |. E8 F795F9FF CALL Ekd5-S5.0040C231
00472C3A |. 33D2 XOR EDX,EDX
00472C3C |. 8A55 08 MOV DL,BYTE PTR SS:[EBP+8]
00472C3F |. 803D E05F5000 0>CMP BYTE PTR DS:[505FE0],1
就是这一句,整型变量是从内存502000h开始存放,每四个字节是1个整型变量,所以整型变量4088的位置就是4088 * 4 + 502000h = 505FE0h 。
所以这一句的意思就是查看地址505FE0是否等于1,即整型变量4088是否为1,是1就跳过后面几行读取自动售出的指令。
00472C46 |. 74 1E JE SHORT Ekd5-S5.00472C66
00472C48 |. 33C9 XOR ECX,ECX
00472C4A |. 3C 14 CMP AL,14
00472C4C |. 76 06 JBE SHORT Ekd5-S5.00472C54
00472C4E |. 41 INC ECX
00472C4F |. 3C 28 CMP AL,28
00472C51 |. 76 01 JBE SHORT Ekd5-S5.00472C54
00472C53 |. 41 INC ECX
00472C54 |> B0 09 MOV AL,9
00472C56 |. 2AD0 SUB DL,AL
00472C58 |. 73 0C JNB SHORT Ekd5-S5.00472C66
00472C5A |. 02D0 ADD DL,AL
00472C5C |. 8A82 27244800 MOV AL,BYTE PTR DS:[EDX+482427]
00472C62 |. 03C1 ADD EAX,ECX
00472C64 |. EB 07 JMP SHORT Ekd5-S5.00472C6D
00472C66 |> 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00472C69 |. 8B4411 08 MOV EAX,DWORD PTR DS:[ECX+EDX+8]
00472C6D |> 25 FF000000 AND EAX,0FF
00472C72 |. 8BE5 MOV ESP,EBP
00472C74 |. 5D POP EBP
00472C75 \. C2 0400 RETN 4
以下是我自已的一个简单例子:
(这个是远距攻击的函数,包含了远距攻击宝物特效以及从DATA中读取兵种的攻击范围)
0043F8A3 $ 55 PUSH EBP
0043F8A4 . 8BEC MOV EBP,ESP
0043F8A6 . 83EC 0C SUB ESP,0C
0043F8A9 . 894D FC MOV DWORD PTR SS:[EBP-4],ECX
0043F8AC . 6A 2A PUSH 2A
0043F8AE . 8B09 MOV ECX,DWORD PTR DS:[ECX]
0043F8B0 . 6BC9 48 IMUL ECX,ECX,48
0043F8B3 . 81C1 0000D600 ADD ECX,0D60000
0043F8B9 . 894D F8 MOV DWORD PTR SS:[EBP-8],ECX
0043F8BC . E8 4881FCFF CALL 00407A09
0043F8C1 . 85C0 TEST EAX,EAX
0043F8C3 . 74 0C JE SHORT 0043F8D1
0043F8C5 . 6A 2A PUSH 2A
0043F8C7 . 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
0043F8CA . E8 2382FCFF CALL 00407AF2
0043F8CF . EB 42 JMP SHORT 0043F913
0043F8D1 > 6A 20 PUSH 20
0043F8D3 . 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
0043F8D6 . E8 2E81FCFF CALL 00407A09
0043F8DB . 85C0 TEST EAX,EAX
0043F8DD . 74 04 JE SHORT 0043F8E3
0043F8DF . B0 02 MOV AL,2
0043F8E1 . EB 30 JMP SHORT 0043F913
0043F8E3 > 803D E05F5000 >CMP BYTE PTR DS:[505FE0],1 -----比较整型变量4088是否为1
0043F8EA ^E9 EA40FCFF JMP 004039D9
004039D9 75 1A JNZ SHORT 004039F5 -----整型变量4088不等于1,跳转到下面的4039F5
004039DB 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8] -----整型变量4088等于1,从这行开始继续
004039DE E8 1D5B0000 CALL 00409500 -----读取武将的DATA代码
004039E3 3905 E45F5000 CMP DWORD PTR DS:[505FE4],EAX -----比较该武将的代码是否等于整型变量4089的数值
004039E9 75 0A JNZ SHORT 004039F5 -----如果该武将的代码不等于整型变量4089的数值,跳转到下面的4039F5
004039EB A0 E85F5000 MOV AL,BYTE PTR DS:[505FE8] -----将整型变量4090的数值移入AL中
004039F0 E9 1EBF0300 JMP 0043F913
004039F5 803D DC5F5000 >CMP BYTE PTR DS:[505FDC],1 -----如果上面的整型变量4088不等于1,以及武将的代码不等于整型变量4089的数值,就跳转到这一行,比较整型变量4087是否为1。
004039FC 0F85 F3BE0300 JNZ 0043F8F5 -----整型变量4087不等于1,跳转到后面的43F8F5
00403A02 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
00403A05 E8 062C0000 CALL 00406610
00403A0A 3C 28 CMP AL,28 -----比较是否兵种28
00403A0C E9 DEBE0300 JMP 0043F8EF
0043F8EF 75 04 JNZ SHORT 0043F8F5 -----不是兵种28,跳转到后面的43F8F5
0043F8F1 B0 06 MOV AL,6 -----直接设值为6,即无羽箭攻击
0043F8F3 > EB 1E JMP SHORT 0043F913
0043F8F5 > 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
0043F8F8 . E8 73E6FDFF CALL 0041DF70
0043F8FD . 8AC8 MOV CL,AL
0043F8FF . 81E1 FF000000 AND ECX,0FF
0043F905 . 6BC9 1B IMUL ECX,ECX,1B
0043F908 . 81C1 A0BF4A00 ADD ECX,004ABFA0
0043F90E . E8 8D000100 CALL 0044F9A0
0043F913 > 8BE5 MOV ESP,EBP
0043F915 . 5D POP EBP
0043F916 . C3 RETN
这个例子的具体说明:如果在没有装备远距攻击效果的装备的情况下,当整型变量4088=1时,让某武将(整型变量4089的值),改变攻击范围(整型变量4090的值),相当于装备了第四个道具。后面的一段是当整型变量4087=1时,兵种28具有无羽箭攻击范围(在DATA中兵种28不是无羽箭攻击范围)。
以上只是简单的例子。通过修改EXE,将一般情况下不使用的整型变量充分地利用,就可以增加更多的实际效果。
希望各位制作人可以充分发挥想象力,制作出内容更丰富的游戏。
|