馬上加入Android 台灣中文網,立即免費下載應用遊戲。
您需要 登錄 才可以下載或查看,沒有帳號?註冊
x
本帖最後由 iric 於 2014-3-4 12:44 編輯
你知道你花了多少時間在刷肥,堆肥嗎?
刷肥有精靈腳本,堆肥也可以燒餅加速
放著自動刷把時間省下來去做其他更有意義的事吧。
4.62_自動化小修改
4.6x_完美跳關自動化
4.5x_貪婪30秒神速自動化刷關
4.x_八門自動化修改+刷肥(30秒內改好所有參數)4.x_八門自動化不動卡珠解鎖
4.x_八門自動化轉珠控制演示(變頻模組)
3.27_八門自動修改(腳本內存處理)
3.27_全程自動轉刷肥演示(智慧型戰鬥回合偵測)
3.20_自動刷展示影片
3.15_自動刷展示影片
自動建立搜圖庫展示影片
目前自動化腳本已經可實現以下功能- 首次使用自動截圖,建立搜圖庫
- 自動微調程序,適用任何解析度
- 模組式寫法,支援個人化手錄模式
- 斷線自動重連
- 喀石狂刷模式
- 各種防呆設定(debug)
- 速刷(X關)/循序刷肥模式 |
在此提供"lua語法"教學
腳本教學區(code以黑體字表示)
0. 參考資料 (lua wiki, 待補...) ; 段落點, 可有可無
-- 註解
.. 連接符, 用來連接字串
* / + - % ^ 常用的運算符
連續宣告, 等式左右的變數量要對稱
function s_mode(s_A,s_B,s_C,t_T,t_P,t_R,t_M)
stage_A,stage_B,stage_C,team_T,team_P,team_R,team_M = s_A,s_B,s_C,t_T,t_P,t_R,t_M
end
1. 解析度調整
-- 將屏幕寬度和高度分別保存在變量w、h中
width, high = getScreenResolution();
-- 獲取屏幕色彩位元數
color_bit = getScreenColorBits();
-- 提示屏幕資訊(字串模式導出)
notifyMessage(string.format("%dbit %dx%d",color_bit,width,high));
ok, 有了屏幕參數, 接下來就可以編寫動態的x, y座標來適應各種解析度的手機
-- 等化解析度參數(建議使用Full HD解析度的屏幕來獲取座標)
w = width / 1080 --寬
h = high / 1920 --高
此時的w & h要使用在接下來的每個x, y座標上當作係數
2. 子程序
-- subroutine子程序宣告
function click(fid,xcoor,ycoor,pause)
fid = 0 -- 手指ID, 識別第幾根手指滑動
touchDown(fid, xcoor * w, ycoor * h); -- 二次包裝內建的觸控函數
mSleep(30); -- 按下延遲
touchUp(0);
mSleep(pause); -- 彈起後延遲
end
我將觸控函數做二次包裝, 將座標係數跟彈起延遲時間包進去
這樣我一行就可以取代原本約4行的指令, 大大減少coding的複雜度
3. 外部文件
這是最重要的部分, 試過一大堆檔案指令, dofile是最讓我滿意的指令
善用外部呼叫可以減少主程序的複雜度並增加程式的彈性
主程序A -------------------------------> 主程序A
子程序B 子程序C 子程序D
╲ ╲ ╲
主程序A ═══════════> 主程序A+B+C+D
-- 路徑縮寫
Touchelper ="/mnt/sdcard/Touchelper/scripts/v2/"
-- 呼叫外部文件 "1_選關卡" 並執行裡面的指令
dofile(Touchelper .. "1_選關卡")
我的習慣是路徑我會另外用變數縮寫起來
Touchelper .. "1_選關卡" 就是指以下路徑的檔案
/mnt/sdcard/Touchelper/scripts/v2/1_選關卡
/mnt/sdcard 在任何android手機都是可以適用的系統路徑
各位可以將此路徑輸入到瀏覽器檢查看看mount的路徑是否正確
像是HTC這類鎖RAM的手機也能mount到我們想要的地方
4. 截圖 第4+第5這兩個部分學不學的好就是能不能自動化的關鍵
我用過很多截圖app, 都沒辦法做到100%比對率
唯有內建的截圖函式才能截出正確的圖
截圖之前, 建議放個顏色比對的函式來確保截圖的時機
-- 區域模糊顏色比對, 函式對應的參數分別為(16進制顏色碼,比對率,左上x,左上y,右下x,右下y)
x, y = findColorInRegionFuzzy(0x525142, 99, 500*w, 900*h, 501*w, 1400*h);
-- 印出比對座標x & y (-1即為比對失敗)
notifyMessage(x3 .. "," .. y3)
取得正確的截圖時間後, 接著我想要作出大廳的區域截圖
確切的座標位置需事先用錄製的方式一一點出來
畢竟手機沒有桌機這麼方便
-- 截圖存檔路徑縮寫
mingsnap = "/mnt/sdcard/ming/%s.bmp"
snapmode = "大廳"
x0 = 520 -- 左上角x
y0 = 1440 -- 左上角y
shiftx = 40 -- 截圖寬
shifty = 40 -- 截圖高
x1 = x0 * w -- x乘上座標係數=相對左上角x
y1 = y0 * h -- y乘上座標係數=相對左上角y
x2 = x1 + shiftx * w -- 相對右下角x
y2 = y1 + shifty * h -- 相對右下角y
-- 區域截圖(會存檔成 大廳.bmp 檔於/mnt/sdcard/ming/下)
snapshotRegion(string.format(mingsnap, snapmode),x1,y1,x2,y2);
5. 圖形辨識 -- 路徑縮寫
ming = "/mnt/sdcard/ming/"
-- 搜尋大廳畫面
for i = 1,300 do -- 迴圈300*200ms=60s(實際時間會更長, 視手機效能而定)
x, y = findImageInRegionFuzzy(ming .. "大廳.bmp",80,460*w,1300*h,620*w,1620*h);
if x ~= -1 and y ~= -1 then
notifyMessage("in大廳");
click(0,520,1740,500);
return;
else
mSleep(200); -- 比對延遲200ms
end
end
notifyMessage("大廳搜圖失敗!!");
os.exit(); -- 結束腳本
***進階多點取色辨識(保留)
6. 流程控制
1. 載入外部程式碼可以使用dofile(檔案), 直接且容易, 缺點是物件不能加密
2. branch指令, 可以輕易地跳至指定處執行
goto AAA --branch到AAA程序
::BBB::
... ... ...
::AAA:: --AAA branch point
goto BBB --branch回BBB處
3. 調用subroutine
local function CCC() --宣告區域型子程序, 調用後即消滅並釋出記憶體
... ... ...
end
function DDD() --宣告全域型子程序, 可重複調用
... ... ...
end
function main() --主程序
CCC () --調用區域型子程序CCC(), 只能調用一次
DDD() --調用全域型子程序DDD()
... ... ...
DDD() --重複調用全域型子程序DDD()
end
--子程序宣告(放置於主程序end後)
local function CCC() --宣告區域型子程序, 調用後即消滅並釋出記憶體
... ... ...
end
function DDD() --宣告全域型子程序, 可重複調用
... ... ...
end
4. 一個完整的lua腳本, 裡面可以有很多的subroutine
但只需要一個function main()主程序, 只有主程序才會自動被執行
5. break(跳離迴圈), return(可附返回值) 都是很好用的返回函數
***進階迴圈控制(保留)
7. debug
還沒想到怎麼寫, 除了經驗還是經驗
***進階debug函數(保留)
8. memoryRead()
讀取指定應用的內存
參數
參數1 (字符串) : 想要讀取的軟件的包名
參數2 (數字) : 想要讀取的内存地址
參數3 (字符串) : 想要讀取的類型,
神魔的資料類型如下
- I32: 有符號的32位整數 [D]
- U16: 無符號的16位整數[W]
- U8: 無符號的8位整數 [B]
- F32: 有符號的32位浮點數 [F]
返回值
返回值1 (boolean) : 是否成功
返回值2 (數字) : 讀取到的數據, 僅當返回值1為真時有效
示例
success, data = memoryRead("com.test.test", 0x1000000, "U32"); -- 讀取app為com.test.test的應用中,內存地址為0x1000000處的無符號的32位整數
if success then
notifyMessage(string.format("%s", tostring(data)));
else
notifyMessage("fail");
end
PS. 當你無法確認輸出是否為有效數,請勿使用比較符號,lua只有nil才是false,其餘都是true(包含0)正確的用法是:
if xxx then
yyy
end
(如果xxx有效,則執行yyy)
9. 三元運算法
C語言: a?b:c --> (a and b) or c --a為真, 則返回b, 否則返回c
不過由於Lua邏輯運算優先權的關係, a為真的時候會優先返回a
所以可以稍微修改一下邏輯運算的方式, 如下
Lua: a=a or c --> if not a then a=c --當a為無效數時, 返回c
10. UI使用者介面
>>>說明請參考官網
配置流程
UI={... ... ...}
function main()
... ... ...
end
function abc()
... ... ...
end
function def()
... ... ...
end
|