標籤:網路遊戲 指令碼 按鍵精靈
仙境傳說是很早以前非常流行的一款網路遊戲,其中的人物設定的非常可愛,尤其是一些誇張的頭飾和百變的插卡系統讓人回味無窮。雖然從遊戲性來說仍然逃不出韓國遊戲泡菜的怪圈(或者說是一款標準的泡菜遊戲),但仍然是可圈可點的。
遊戲中玩家要耗費大量時間進行練級,雖然現在的代理崑崙也有經驗獎勵的措施,比如進階經驗書,進階JOB經驗書,雙倍經驗時間區等,但是要讓玩家,特別是高等級的玩家進行練級仍然是一件非常痛苦的事情。常有的事是,三轉100~110的職業往往要在熔岩地圖上打一個熔岩波利的怪物來進行性價比較高的練級。基本上要打1000個波利才能升一級(2~3小時),這對玩家的“摧殘”是非常可怕的。因此我想通過按鍵精靈指令碼的方法來減輕自己的負擔,讓我有更多精力投入到遊戲更有意思的方面。
圖1.令一些玩家蛋疼的刷怪時刻,多少RO玩家都是被怪勸退的
按鍵精靈是一個非常好用的,易上手的VB指令碼工具,其中整合了許多關於類比滑鼠鍵盤的函數,還有一些用於識別遊戲元素的函數,如找圖,找色函數(比如怪物的識別)。
首先,我們必須找到遊戲視窗的位置(在真正實現中我偷了個懶,因為視窗的預設開啟位置是一定的,故下面代碼中我用了絕對座標)
winTitle = "仙境傳說"//=================== 擷取視窗資訊 ======================//尋找主視窗類名(0)或者標題("仙境傳說"),返回找到的控制代碼RoHwnd ,0表示忽略 RoHwnd = 0RoHwnd = 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) / 2CenterY = (Uy + Uheight) / 2
接下來,我要讓人物走動起來,並且希望他能夠自動判定行進的方向(遇到不能走的地方能改變行進路線)。RO中,人物的走動是通過滑鼠左鍵來實現的,從可以得知,我可以通過判斷箭頭所指小地圖上白色小箭頭(即人物的座標)的座標是否移動來判斷我們的角色是否成功移動。
我們可以通過按鍵精靈的抓圖找色工具來實現找到白色小箭頭中的紅色中心點的RGB值,可以看到是0000D6。然後利用找色函數FindColor就可以得到紅點的座標(搜尋範圍為小地圖地區)。細心的讀者可能發現,在小地圖上還有兩個紅點(地圖的出口),從而回想這樣計算出來的座標是否還要剔除這兩個紅點的固定座標。經過我實驗,發現這兩點的RGB值不是0000D6,因此使用這個函數沒有任何問題。
下面的代碼可以用來擷取小地圖上紅點的位置
//小地圖座標地區SmallMapLeft = 511SmallMapTop = 70SmallMapRight = 611SmallMapBottom = 187MoveDirX = Array(50, -50 )MoveDirY = Array(50,-50)//定位小地圖人物座標(箭頭最左上白色座標中的中心紅點)FindColor SmallMapLeft, SmallMapTop, SmallMapRight, SmallMapBottom, "0000D6", PrevieousX, PrevieousY
通過設定MoveDirX,MoveDirY,我們可以是人物在這四個相對便宜量的22組合(左上,右上,左下,右下)上發生移動。若右上方小地圖紅點不移動則說明便宜無效,換個方向繼續行進
While 1For i = 0 To 1For j = 0 To 1MoveTo CenterX + MoveDirX(i), CenterY + MoveDirY(j)Delay 500LeftClick 1Delay 500//若找到怪則繼續搜尋 c = FindMonster(0, 0, 0)FindColor SmallMapLeft, SmallMapTop, SmallMapRight, SmallMapBottom, "0000D6", ResultX, ResultY//若發現小地圖人族座標發生未位移則認定移動無效While ResultX <> PrevieousX or ResultY <> PrevieousYPrevieousX = ResultXPrevieousY = ResultYMoveTo CenterX + MoveDirX(i), CenterY + MoveDirY(j)Delay 500LeftClick 1Delay 500//若找到怪則繼續搜尋 c = FindMonster(0, 0, 0) FindColor SmallMapLeft, SmallMapTop, SmallMapRight, SmallMapBottom, "0000D6", ResultX, ResultYWendNextNext Wend
接下來我們要解決怪物判定的問題,按鍵精靈提供了兩個函數找色和找圖。找圖的方法我試了一下,沒有成功。個人認為是圖片搜尋的效率很低,使得搜尋到目標怪物的時候怪物的動作進入下一個圖片,從而錯失匹配。用找色的方法效率有所提升, 但仍然只有手動效率的1/3,且耗藥(攻擊時間設定為固定值的,很容易打完怪之後,還呆在一個地方給主動怪白打)。
//尋找畫面中心,近整幅畫布,若附近怪物,存在則攻擊Function FindMonster(CenterX, CenterY, Hwnd)//定義搜尋範圍為653*508SearchRangeX = 653SearchRangeY = 508 ResultX = 0 ResultY = 0isFinded = 0//RenewHP FindColor 0, 0, SearchRangeX, SearchRangeY, "96C8FE", ResultX, ResultY//若找到指定顏色,則判定這個座標有怪,點擊左鍵執行攻擊If ResultX > 0 and ResultY > 0 Then //找到標誌置位1isFinded = 1MoveTo ResultX, ResultYDelay 500LeftClick 1//3秒時間用來移動Delay 6000 //回血 RenewHPEnd IfFindMonster = isFindedEnd Function//按下F5,和斷行符號,飛到隨機地點Function Fly()KeyPress "F5", 1Delay (500)KeyPress "enter", 1Delay (500)End Function//按下F5,和斷行符號,飛到隨機地點Function RenewHP()//============喝藥===================//判斷是否要嗑藥GetColor = GetPixelColor(22, 72)//按下F1喝白水,直到血條不紅While GetColor <> "000000"//MsgBox "血條已紅,準備嗑藥"//先飛c = Fly()//喝水KeyPress "F1", 1Delay (500)GetColor = GetPixelColor(22, 72)WendEnd Function
果然還是我的風格,虎頭蛇尾啊
仙境傳說-按鍵精靈腳步研究