東西在GitHub上
前言
正好最近事情比較少叉存,就抓緊時間簡單寫了一個FGO腳本(API)撑毛,當初的想法相當簡單恋脚,就是想寫一個abstract的FGO的API來實現(xiàn)對FGO的操作恋腕,同時還可以當腳本來用抹锄。
思路
因為是關于FGO操作的API,所以只要把各種操作抽象出來就好了:
- 選擇關卡
- 選擇助戰(zhàn)
- 開始戰(zhàn)斗
- 選擇指令卡(包括寶具卡)
- 選擇從者技能
- 普通的技能
- 有目標從者的技能
- 選擇御主技能
- 普通的技能
- 有目標從者的技能
- 換人技能
- 戰(zhàn)斗結束
基本上的內容就那么多荠藤,還有像是金蘋果之類的就打算之后再加上去伙单。
還有要考慮的其他東西有:
- 戰(zhàn)斗界面比例
- 隨機點按和點按位置的偏移
- 戰(zhàn)斗界面識別
然后,和之前的自動戰(zhàn)斗的腳本一樣哈肖,同樣使用ADB進行操作吻育。
實現(xiàn)
1.輔助函數(shù)
主要的輔助函數(shù)有以下幾個:(放在util.py
之中)
- 截圖(ADB)
- 裁剪(PIL)
- 界面識別(OpenCV)
- template matching的坐標獲取(OpenCV)
- 點按(ADB)
- 坐標偏移(random)
2.游戲界面坐標采集
這個沒啥好說的,就是對者 Photoshop 把每一個需要用到的按鈕的坐標記錄下來淤井。主要都放在了crds.py
里面布疼,還有一些像是checkpoint和support這樣坐標不確定的則通過OpenCV識別。
3.主程序
其實具體的代碼的Structure已經在前面講過了币狠,在這里舉幾個例子:
初始化
def __init__(self, ckp : str, spt : str = None, sft = (0, 0)):
self.shifts = sft
self.checkpoint = ckp
self.support = spt
構造這樣一個類的好處就是在后面應用別的函數(shù)時會比較方便游两,特別是關于界面偏移(非16:9適配)而且如果之后加上金蘋果計數(shù)時也很方便。這里就初始化了關卡和助戰(zhàn)漩绵。
指令卡選擇
def select_cards(self, cards : [int]):
while not util.standby(util.get_sh(self.shifts), "assets/attack.png"):
time.sleep(0.2)
# tap ATTACK
self.tap(crds.ATTACK, 100, 100)
time.sleep(1)
while len(cards) < 3:
x = random.randrange(1, 6)
if x in cards:
continue
cards.append(x)
# tap CARDS
for card in cards:
self.tap(crds.CARDS[card-1], 50, 100)
time.sleep(0.2)
這段代碼要做的就是首先檢測是不是在戰(zhàn)斗界面(因為界面變化需要一定時間)贱案,然后注意這個函數(shù)接受一個List,這個list對應的就會是儲存的指令卡的坐標渐行。當接受的list的長度小于3時(不滿三張卡)轰坊,程序就會自動往其中添加其他的普通卡(非寶具)直至三張铸董,這樣對只需要點寶具的速刷相當友好,同時隨機點按減少了當腳本使用時被封的可能性肴沫。
技能選擇
def select_servant_skill(self, skill : int, tar :int = 0):
while not util.standby(util.get_sh(self.shifts), "assets/attack.png"):
time.sleep(0.2)
self.tap(crds.SERVANT_SKILLS[skill-1], 8, 8)
time.sleep(1)
if tar != 0:
self.select_servant(tar)
這個整體來說還是很好理解粟害,甚至比選擇指令卡更加簡單。注意里面第二個參數(shù)tar
是可選參數(shù)颤芬,當是0的時候表示沒有目標從者(像是式姐的一技能)悲幅,如果是其他數(shù)字時則代表目標從者(像是梅林三技能)。
結尾
總的來說站蝠,因為這個腳本整體思路并不難所以寫出來相當?shù)娜菀住?/p>
剩下的感受還有一些詳細的東西到時候再補充OWO