游戏辅助脚本解释器
云网(QQ:1923511647 邮箱:javazj@163.com)
引言:前期完成一个QQ三国的外挂,实现自动挂机启动游戏,到城外打怪练级,并可以收集资源后回城交易,运行主界面:
外挂采用的注入进程方式,通过内存查找等方式完成数据采集(生命,体力,坐标等)。而游戏角色的控制通过内部自定义脚本方式完成:
//蜀国 巴郡东郊 战斗回城再出城
#define SHELL_ZGBZ_DJIO"f0,w28|9,x1|6|5|1|1|2b1|5|3,w44|13,s1500,k^,w9|7,f1,"
现在回头来看,自己都不记得这个脚本(严格来上面定义的不算是脚本)是什么意思。看了代码先知就是f0停止战斗状态,w28|9就是角色去到(28,9)的坐标。
更难过的时随着游戏升级,界面坐本发生变化,原来的脚本(与主程序一起编译)失效了,又得重新查看脚本,编译升级外挂,麻烦大大的有,也很浪费时间。
一次偶然的机会,看到公司内部有大牛写了一篇文章,自己定义语言,编译成中间代码,并在自己写的虚拟机上执行。尼玛,这哥们太强悍了。虽然没有看到代码,但他写的文章的确给我很多启发。针对游戏不断升级所带来的困扰,完全可以利用脚本来适应变化:游戏界面的变化只需要修改脚本即可完成。
正文:说了这么一大堆,终于转入正题了,首先大家要了解两样事情:解释器和脚本。
²解释器
编译器大家应该都知道,GCC,BCB,VC。简单的说,编译器将程序的源代码转化为可执行代码的形式。通常情况下,这种可执行代码由计算机的CPU指令组成,因此可以直接在计算机上执行。而解释器就不同了,它顺序读入程序的源代码,然后依次执行每一条语句。因此,解释器并不真正将源代码转化为目标代码,而是直接执行程序。
²脚本
脚本简单地说就是一条条的文字命令,这些文字命令是可以看到的(如可以用记事本打开查看、编辑),脚本程序在执行时,是由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。因为脚本在执行时多了一道翻译的过程,所以它比二进制程序执行效率要稍低一些。
脚本通常可以由应用程序临时调用并执行。如js,VBS等均是脚本的典形代表。针对不同场景的应用有不同的形式的脚本,先与将要讲述的脚本混个脸熟:
SubMain()
Dim a As Integer
Dim b As Integer
Dim s As String
s = "1+2+3+...+100=" //定义字符串
Sleep(500)
a = 100
b = Count(a) //计算1~100的值并返回给b
s = s & b
MsgBox( s )
EndSub
脚本的语法与Basic相似,但不完全一样。因为作者习惯了写C++,又考虑到更加容易被脚本使用者使用:基于Basic的基本语法,同