有关於怎麼使用内储来读取游戏中的数据,版上有很多的讨论与教学,介绍几篇(找到陆续补上)。
金山游侠动画教程---简单的寻找内存地址
http://bbs.vrbrothers.com/viewth ... &extra=page%3D6 关于内存地址的个人理解和操作原理
http://bbs.vrbrothers.com/viewthread.php?tid=20465以下发文观点皆以 "您已经会使用金山游侠、FPE2000、GameMaster等辅助软体来找寻资料"
相信不少玩家都经歷过那段记忆体只有 1M 时代,常常為為了挤那1,2k出来
跟OS争的你死我,再看看现在的电脑规格...,科技真一日千里 XD~
切入我们的主题,找到某游戏的内存位址数值后该怎麼用。
第一先从按精提供的函数来看
VBSCall ReadMemory(v1,v2,v3)
v1:内存地址:整数(16进制)
v2:类型:0-字节 1-整数 2-长整数
v3:输出值-所读取的内容:长整型变量
我想很多人一开始就算你找到了数值,却卡在这边不知道要输入什麼,包括我第一次使用也
遇到这个问题,所以我觉得有必要就这个部份说明一下。
VBSCall ReadMemory(&HFAC8EA,1,HP)
上面这行您一定常用
&HFAC8EA 是内存地址 , 1 是读取一个整数然再后再存进 HP 变量裡面
不管您用过几次,下面这三个参数说明您一定要看完。
-------------------------------------------------------------------------------------------
ReadMemory()第一个参数 内存地址:整数(16进制)
-------------------------------------------------------------------------------------------
&HFAC8EA 是什麼东西,為什麼可以代表一个内存地址?
来测试一下,在按精脚本输入
a = &HFAC8EA
VBSCall MessageBox(a)
VBSCall MessageBox(typename(a))代码结果:
第一次显示 16435434
第二次显示 Long
没错,&HFAC8EA 是一个长整数,&H就是用来将一个10进制的数字转成16进制的表示法,
他的反函数是HEX(),按精测试 VBSCall MessageBox(HEX(16435434))会显示 FAC8EA。
*因為我没有 ReadMemory() 这个函数的原形,所以我并不知道為什麼说明文件上面写整数(16进位)
也许是很早之前的按精版本确实只能使用整数,只是说明文件没改,也许是他确实是传入一个整数
,只是我误会他的意思,有时间我会把函数dump出来看看再上来加註,或是总版老大来龙去脉可以
说明一下。
不过他是什麼型态无所谓,至少用到现在没有出错过(不过还是有必要瞭解一下),我们只要确定一点
a = &HFAC8EA,变量 a 的型态确实是一个长整数!! 就算你把他强制转形,他还是一个长整数。且看
以下。
a = &HFAC8EA
VBSCall MessageBox(typename(a))
//强制转形為整数
a = CINT(a)
VBSCall MessageBox(typename(a))嗯,二次都是显示 Long,这是因為VBS的特性会根据变量内容来决定他是什麼型态如同以下程式
a = "5"
b = 3
VBSCall MessageBox(a + b)得到 8,因為VBS变数宣告的不定型特性,相对VBS也调整了一些运算子的自动转换,这样是好还是不好,
好处就是乱乱写也通,坏处就是在脚本裡做判断时很容易出错,因為你不知道他什麼时候偷偷帮你转形,
或是你以為他有帮你转形,事实上并没有,下就这段就不能执行了。
a = "Q"
b = 3
VBSCall MessageBox(a + b)这种情况其实常常发生从文字档裡读出使用者界面参数做判断时,有时应该要HP=30自动吃补药,但是没吃,
不是按精有问题,而是你的判断式不正确,避免这种情况发生,读取文字档裡的变数出来后一律强制转形一
次(一个被变数型态搞到失眠的人留),微软出了一个VBS不知道该说造大眾还是害死一堆入门设计师。
偏主题有点久了,这部份详细请参考拙作(其实是写给我自已看的)。
按键精灵与 VBScript 的基础观念(一)
http://bbs.vrbrothers.com/viewth ... &extra=page%3D2按键精灵与 VBScript 的基础观念(二)
http://bbs.vrbrothers.com/viewth ... &extra=page%3D2-------------------------------------------------------------------------------------------
ReadMemory()第二个参数 类型:0-字节 1-整数 2-长整数
-------------------------------------------------------------------------------------------
為什麼我这麼在意变量是整数还是长整数,原因就在这,第二个参数型态直接就影响到输出的结果,
字节跟整数跟长整数有什麼不同,最大就差别就在范围值
字节 = 1 Byte (-127 ~ 128) 或不带正负号 (0 ~ 255) = 256
整数 = 2 Byte (-32,768 ~ 32,767) 或 (0 ~ 65535) = 65536(256 ^ 2)
长整数 = 4 Byte (-2,147,483,648 ~ 2,147,483,647) 或 (0 ~ 4294967296) = 256 ^ 4
上面的范围很重要在,超过原本型态的范围就会產生溢位(overflow)的错误。
整数一定是 2Byte ? 不一定,要看你用的是哪一套程式语言,像 .NET Framework 中的整数就是
4个 Byte,Long 是 8 个 Byte,有一种叫 短整数 才是 2 Byte。那你怎麼知道按精是什麼语言开
发的,对!我不知道...,那你怎麼知道上面字节要用1 Byte 整数要用 2 Byte,对!我猜的 =.=
呵呵,好啦,不要玩文字游戏了,没有特别的情况下一定是上面那种范围,我实测过的确第二个参数
是这个范围值没错,只是按精应该在指令说明上应该註明一下范围(ps.我的印像中好像
按精有一个地方有特别註明这个参数佔的Byte数,因為我看了5.9x简体版的说明文件还有繁体版的说明
文件还有官网上的按精宝典,都没有特别说明,我一时也想不起来在哪看过的,还是哪位高人po的帖子
有提及过,有版友可以提供我官方文件说明文件连结我就会回来编帖註解一下。:))
这个跟我游戏中 血量是285 昇级经验值是 20000 有什麼关係?
所以重点就是如果你的血量是在 0~255内,你就要设 1(字节),0~65535就要设2(整数)
有时你现在的血量是124第二个参数你设1(字节),但可能你会昇级血量会超过255(字节的范围),读出来
的值最大就到255而己,所以你要先确定游戏中血量到底佔了几个Byte。
-------------------------------------------------------------------------------------------
ReadMemory()第三个参数 输出值-所读取的内容:长整型变量
-------------------------------------------------------------------------------------------
我们来看一张图
下载 (7.97 KB)
2006-8-18 07:32
//红框的部份就是从 &H000EA99A 读取 1 个byte放进HP变量
VBSCall ReadMemory(&H000EA99A,0,HP)
//绿框的部份就是从 &H000EA9BA 读取 2 个byte放进HP变量
VBSCall ReadMemory(&H000EA9BA,1,HP)
//蓝框的部份就是从 &H000EA9DA 读取 4 个byte放进HP变量
VBSCall ReadMemory(&H000EA9DA,2,HP)