仙境传说是很早以前非常流行的一款网络游戏,其中的人物设置的非常可爱,尤其是一些夸张的头饰和百变的插卡系统让人回味无穷。虽然从游戏性来说仍然逃不出韩国游戏泡菜的怪圈(或者说是一款标准的泡菜游戏),但仍然是可圈可点的。
游戏中玩家要耗费大量时间进行练级,虽然现在的代理昆仑也有经验奖励的措施,比如高级经验书,高级JOB经验书,双倍经验时间区等,但是要让玩家,特别是高等级的玩家进行练级仍然是一件非常痛苦的事情。常有的事是,三转100~110的职业往往要在熔岩地图上打一个熔岩波利的怪物来进行性价比较高的练级。基本上要打1000个波利才能升一级(2~3小时),这对玩家的“摧残”是非常可怕的。因此我想通过按键精灵脚本的方法来减轻自己的负担,让我有更多精力投入到游戏更有意思的方面。
图1.令一些玩家蛋疼的刷怪时刻,多少RO玩家都是被怪劝退的
按键精灵是一个非常好用的,易上手的VB脚本工具,其中集成了许多关于模拟鼠标键盘的函数,还有一些用于识别游戏元素的函数,如找图,找色函数(比如怪物的识别)。
首先,我们必须找到游戏窗口的位置(在真正实现中我偷了个懒,因为窗口的默认打开位置是一定的,故下面代码中我用了绝对坐标)
winTitle = "仙境传说" //=================== 获取窗口信息 ====================== //查找主窗口类名(0)或者标题("仙境传说"),返回找到的句柄RoHwnd ,0表示忽略 RoHwnd = 0 RoHwnd = Plugin.Window.Find(0, winTitle) If RoHwnd = 0 Then MsgBox "仙境传说没有找到" End If //MsgBox "查找到的窗口句柄为:" & RoHwnd //EndScript //用窗口插件得到格式为(窗口左上角起点在桌面x坐标|窗口左上角起点在桌面y坐标|窗口宽|窗口高)的字符串 Rect = Plugin.Window.GetClientRect(RoHwnd) Call Plugin.Window.Active(RoHwnd) //切割字符串为二维数组 XYArray = Split(Rect, "|") //窗口左上角起点在桌面x坐标 Ux = CInt(XYArray(0)) //窗口左上角起点在桌面y坐标 Uy = CInt(XYArray(1)) //窗口宽 Uwidth = CInt(XYArray(2)) //窗口高 Uheight = CInt(XYArray(3)) //一块区域搜索的次数 SearchCount = 0 //最大搜索次数 Max = 3 //大地图中心点坐标 CenterX = (Ux + Uwidth) / 2 CenterY = (Uy + Uheight) / 2
接下来,我要让人物走动起来,并且希望他能够自动判定行进的方向(遇到不能走的地方能改变行进路线)。RO中,人物的走动是通过鼠标左键来实现的,从下图可以得知,我可以通过判断箭头所指小地图上白色小箭头(即人物的坐标)的坐标是否移动来判断我们的角色是否成功移动。
我们可以通过按键精灵的抓图找色工具来实现找到白色小箭头中的红色中心点的RGB值,可以看到是0000D6。然后利用找色函数FindColor就可以得到红点的坐标(搜索范围为小地图区域)。细心的读者可能发现,在小地图上还有两个红点(地图的出口),从而回想这样计算出来的坐标是否还要剔除这两个红点的固定坐标。经过我实验,发现这两点的RGB值不是0000D6,因此使用这个函数没有任何问题。
下面的代码可以用来获取小地图上红点的位置
//小地图坐标区域 SmallMapLeft = 511 SmallMapTop = 70 SmallMapRight = 611 SmallMapBottom = 187 MoveDirX = Array(50, -50 ) MoveDirY = Array(50,-50) //定位小地图人物坐标(箭头最左上白色坐标中的中心红点) FindColor SmallMapLeft, SmallMapTop, SmallMapRight, SmallMapBottom, "0000D6", PrevieousX, PrevieousY
通过设定MoveDirX,MoveDirY,我们可以是人物在这四个相对便宜量的22组合(左上,右上,左下,右下)上发生移动。若右上角小地图红点不移动则说明便宜无效,换个方向继续行进
While 1 For i = 0 To 1 For j = 0 To 1 MoveTo CenterX + MoveDirX(i), CenterY + MoveDirY(j) Delay 500 LeftClick 1 Delay 500 //若找到怪则继续搜索 c = FindMonster(0, 0, 0) FindColor SmallMapLeft, SmallMapTop, SmallMapRight, SmallMapBottom, "0000D6", ResultX, ResultY //若发现小地图人族坐标发生未偏移则认定移动无效 While ResultX <> PrevieousX or ResultY <> PrevieousY PrevieousX = ResultX PrevieousY = ResultY MoveTo CenterX + MoveDirX(i), CenterY + MoveDirY(j) Delay 500 LeftClick 1 Delay 500 //若找到怪则继续搜索 c = FindMonster(0, 0, 0) FindColor SmallMapLeft, SmallMapTop, SmallMapRight, SmallMapBottom, "0000D6", ResultX, ResultY Wend Next Next Wend
接下来我们要解决怪物判定的问题,按键精灵提供了两个函数找色和找图。找图的方法我试了一下,没有成功。个人认为是图片搜索的效率很低,使得搜索到目标怪物的时候怪物的动作进入下一个图片,从而错失匹配。用找色的方法效率有所提升, 但仍然只有手动效率的1/3,且耗药(攻击时间设定为固定值的,很容易打完怪之后,还呆在一个地方给主动怪白打)。
//寻找画面中心,近整幅画布,若附近怪物,存在则攻击 Function FindMonster(CenterX, CenterY, Hwnd) //定义搜索范围为653*508 SearchRangeX = 653 SearchRangeY = 508 ResultX = 0 ResultY = 0 isFinded = 0 //RenewHP FindColor 0, 0, SearchRangeX, SearchRangeY, "96C8FE", ResultX, ResultY //若找到指定颜色,则判定这个坐标有怪,点击左键执行攻击 If ResultX > 0 and ResultY > 0 Then //找到标志置位1 isFinded = 1 MoveTo ResultX, ResultY Delay 500 LeftClick 1 //3秒时间用来移动 Delay 6000 //回血 RenewHP End If FindMonster = isFinded End Function //按下F5,和回车,飞到随机地点 Function Fly() KeyPress "F5", 1 Delay (500) KeyPress "enter", 1 Delay (500) End Function //按下F5,和回车,飞到随机地点 Function RenewHP() //============喝药=================== //判断是否要嗑药 GetColor = GetPixelColor(22, 72) //按下F1喝白水,直到血条不红 While GetColor <> "000000" //MsgBox "血条已红,准备嗑药" //先飞 c = Fly() //喝水 KeyPress "F1", 1 Delay (500) GetColor = GetPixelColor(22, 72) Wend End Function
果然还是我的风格,虎头蛇尾啊