June 20, 2015

製作艦隊收藏(艦これ)外掛 (九) 自動練等、快速建造


目錄


(零) 聲明

此程式僅為個人學習 Python 的實作練習,並藉由此遊戲來分析與驗證網路傳輸行為,所有程式及文章僅為程式學習目的,架設於 Bitbucket 的私人 repository 中,無任何公開、散佈或任何營利行為,

不正ツール使用は規約違反です。お辞め頂けますようお願い申し上げます。 – 艦これ開発/運営 公式ツイート

本人不鼓勵也不贊同於艦これ使用任何形式的外掛或任何不正的工具,使用此類工具違反 艦これ 的 利用規約,並可能導致帳號被永久刪除。

The program was built for Python learning purpose only. Both the source codes and the program are stored in Bitbucket’s private repository. They are not disclosed to anyone in any form. Using such programs violates kancolle’s Terms of Use and may result in a permanent account ban.


(一) 快速建造

0. 影片展示、說明

在 Youtube 可選擇 HD 高畫質。

1. 開發提示

艦娘與裝備的配方來自 艦隊これくしょん -艦これ- 攻略 Wiki建造レシピ開発レシピ

用上述資料,配合之前在 製作艦隊收藏(艦これ)外掛 (三) 外掛的使用者介面、快速補給 建立的 Shell,即可做出快速建造的效果。

程式邏輯很直覺,實作上並不困難。


(二) 提升稀有艦娘/裝備的建造成功率

0. 影片展示、說明

在 Youtube 可選擇 HD 高畫質。

1. 開發提示

這與其說是個 Feature,不如說是個 ネタ。

如果程式的 OOP 架構切割的夠好的話,這邊就只在用之前定義的函數寫腳本而已。


(三) 自動練等、自動提升艦娘狀態值(キラ付け)

0. 影片展示、說明

在 Youtube 可選擇 HD 高畫質。

1. 戰鬥 API

到目前為止,不管是 快速搜尋裝備快速更換艦娘快速更換自訂艦隊 還是 自動維修,都是藉由 擷取 API 來獲得我們想要的資訊。

如果我們也可以在戰鬥中抓取遊戲 API 的話,就能如法炮製開發出自動練功的工具。

但是代誌絕對不是憨人所想的那麼簡單。

如同我在 製作艦隊收藏(艦これ)外掛 (四) 解析 API part I 所提到的:

有些 API 已經更新過,跟以前完全不一樣了。舉例來說,我已經攔截不到戰鬥過程的 JSON,導致無法分析是否該夜戰或是撤退,必須用其他方法來判斷,相信這項 API 的變動應該就是為了防止自動練功的程式。

A. 猫る前に母港に帰還しましょう

艦これ剛開始營運那段時間,每場戰鬥之間客戶端與伺服器端都會傳送資料,只需抓取封包即可獲得所有戰鬥資訊。

但在某次更新後,改成只有在戰鬥結束回到母港時,客戶端與伺服器才會傳送資料,這個變動有效壓制自動練功的外掛,但卻也造成另一個潛在的悲劇:

進入戰鬥地圖後,所有客戶端發生的事件,包含戰鬥勝利、獲得資源、得到新艦娘等等,都必須在回到母港後跟伺服器同步才算數

在回到母港前,若是發生網路斷線、重新整理頁面、停電等,就一切都 GG 了。

猫る前に帰還して!

因此,當作戰勝利或得到稀有建娘時,例如:

記得趕快回母港與伺服器同步,否則一旦 猫る 就欲哭無淚惹。

B. エラーが発生したため、ページ更新します

另一個可怕的陷阱如下圖:

若尚未回到母港前不小心按下去的話…。

解決方法請參閱這篇文章:製作艦隊收藏(艦これ)外掛 (二) 處理 VPN、遊戲頁面與資訊重新導向錯誤訊息 章節。

2. SikuliX

大破状態で進軍をした後の戦闘でHPが 0 になると轟沈状態となる – 小破 中破 大破 轟沈について

大破狀態繼續進擊的話,艦娘有可能會被轟沉(永遠消失)的,程式必須要能掌握艦娘的血量以避免悲劇。

既然無法從 API 中獲取戰鬥資訊,那麼該如何判斷艦隊狀態呢?

Q: 換個想法想,我們平常在玩艦娘的時候,是怎麼判斷該不該進擊的呢?

A: 用眼睛看有沒有艦娘大破,有艦娘大破的話就撤退,不進擊。

也就是說,如果程式可以模擬人類用「看」的方式來判斷艦娘狀態,就能決定該不該進擊。

這裡我使用 SikuliX 來達成需求。

關於 SikuliX 的介紹與安裝方式請參閱我之前寫的:在 OSX 10.10.3 Yosemite 上安裝 SikuliX

3. SikuliX 開發提示

SikuliX 非常的直覺,稍微看一下 Tutorial 後,即使沒寫過程式也能快速上手。

但若要整合到外掛內,可能還是需要些額外的資工知識。

以下是一些心得提示:

  • 在 Shell 用 Multithread 執行 SikuliX,才不會 block 住 Terminal。
  • SikuliX 預設位置為 /Applications/SikuliX.app/run -r your_path/test.sikuli
  • 在 Shell 內用 subprocess.check_call() 或其他方法 掌握 SikuliX 的 Thread 狀態。
  • Sikuli 專案其實是由 Python 檔、圖片檔與其他檔案所構成的
  • 擷取要給 SikuliX 的圖片(進擊、撤退、是否回到母港、大破、小破)。
  • 在 SikuliX 內用 Region() 方法指定監看的區塊。
  • 在 SikuliX 內用 Region.setAutoWaitTimeout() 設定某 Pattern 的監看時間。
  • 其他可能會用到的方法:Region.exists()Pattern().similar()click() 等等。

自動練等的 SikuliX 部分完成後,可結合之前的功能:

  • 結合 快速補給,達到 自動出擊→返回母港→自動補給 的效果。
  • 結合 進階維修資訊,在每次練等完後,在 Terminal 顯示艦娘資訊。

實際效果請參考上方自動練等的展示影片。


(四) 慢心はダメ、絶対

每個傑作的背後總是會伴隨著必要的犧牲。

調教 SikuliX 的自動戰鬥參數時,一個小 bug 都可能導致錯誤進擊。

僅在此紀念撰寫外掛時不幸遭轟沉的三艘艦娘:夕立(Lv1)、初春(Lv1)、如月(Lv1)。

1. もしかして…沈んじゃうっぽい…?

夕立 (Lv1)

Pattern().similar() 的參數沒調整好,SikuliX 將大破誤認為中破,大破進擊遭轟沉。

2. わらわも…沈む……か…。

初春 (Lv1)

SikuliX 內的 Python Syntax 出錯導致程式發生 Exception,大破進擊遭轟沉。

3. 如月のこと、忘れないでね・・・

如月 (Lv1)

測試 map1-1(キラ付け) 時,Shell 程式邏輯錯誤,大破進擊遭轟沉。


慢心はダメ、絶対!

※ 事故なら仕方ない、反省はしません。


(五) 延伸閱讀