标题: 整型变量的另一种用途
性别:男-离线 godtype
(毅)

刘国公
广南东路经略使
枢密直学士
★★★★★★★★★★★★
★★★

Rank: 24Rank: 24Rank: 24
柱国(正二品) 轩辕春秋年度最佳(轩辕工作室)
组别 经略使
级别 卫将军
好贴 1
功绩 1314
帖子 6207
编号 111321
注册 2007-2-18
来自 我家
家族 轩辕学院


发表于 2009-2-2 22:32 资料 个人空间 短消息 只看该作者
整型变量的另一种用途

本帖所有内容不得转载

从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,将一般情况下不使用的整型变量充分地利用,就可以增加更多的实际效果。
希望各位制作人可以充分发挥想象力,制作出内容更丰富的游戏。


顶部
性别:未知-离线 弦月妖姬
(无与伦比)

Rank: 4
组别 士兵
级别 裨将军
功绩 3
帖子 305
编号 228286
注册 2007-10-17
来自 外星球
家族 轩辕狼党


发表于 2009-2-2 23:35 资料 个人空间 短消息 只看该作者
好东西支持!


顶部
性别:未知-离线 qw65
(仲天之帆)

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
功绩 3
帖子 252
编号 98424
注册 2007-1-3


发表于 2009-2-3 07:57 资料 短消息 只看该作者 QQ
赶快试试
顶部
性别:未知-离线 star175

★★

Rank: 9Rank: 9Rank: 9
轩辕春秋年度最佳(轩辕工作室)
组别 白衣卿相
级别 讨逆将军
好贴 3
功绩 153
帖子 686
编号 91725
注册 2006-11-16


发表于 2009-2-3 09:25 资料 文集 短消息 只看该作者
必须要说明的是这些部分代码并不够严谨,我当时这样写代码也是偷了懒,也仅限制在我的第四版之后的版本中使用,如果是其他版本的exe,比如岱赢版的,整形变量的起始地址并不是502000H,就无法使用了.

比较完整的写法如下
00472C3F  |. 803D E05F5000 0>CMP BYTE PTR DS:[505FE0],1

应改为
MOV ECX,FF8   '4088转16进制
CMP BYTE PTR DS:[ECX*4+502000],1

这样就直接标示出整形变量的起始地址,对不同版本的exe只要改一下这个起始地址就可通用了

如果真的需要大量使用这种方法,最好是把它写成一个自定义函数,用起来也比较方便.
顶部
性别:男-离线 godtype
(毅)

刘国公
广南东路经略使
枢密直学士
★★★★★★★★★★★★
★★★

Rank: 24Rank: 24Rank: 24
柱国(正二品) 轩辕春秋年度最佳(轩辕工作室)
组别 经略使
级别 卫将军
好贴 1
功绩 1314
帖子 6207
编号 111321
注册 2007-2-18
来自 我家
家族 轩辕学院


发表于 2009-2-3 10:06 资料 个人空间 短消息 只看该作者
回复 #4 star175 的帖子

谢谢指导了,我也是参考第四版加强版后学写的。
因为要根据剧本来进行改写引擎,所以已经改出来的我就不再改了,以后需要的我会参考你的写法来改写。
顶部

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




当前时区 GMT+8, 现在时间是 2025-2-7 15:59
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

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

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