June 16, 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. 取得艦娘狀態

如同影片所述,我們希望能印出像上圖右方的維修資訊。

艦娘的 等級名稱目前生命值最大生命值 都可以從 Port API 的 api_ship 取得。

小破中破大破 則分別代表目前生命值是最大値的 75%50%25%

更多資訊請參考這篇文章:小破 中破 大破 轟沈について

最右邊的「此艦娘還能承受多少傷害才會變成中(大)破」能藉由上述兩個資訊計算出來。

2. 預計維修時間

接下來我們要來計算艦娘維修所需的預計時間。

維修時間的公式請參考這個網頁:修理に掛かる時間

從維修公式中可看出,有三個參數會影響維修時間的長短,分別是

  • 艦娘等級。
  • 艦娘受損的生命值。
  • 艦娘的船艦型態(驅逐艦、潛水艇等)。

艦娘等級艦娘受損的生命值 都可由上述 Port API 的 api_ship 取得。

艦娘的船艦型態 則記錄在 api_start2api_mst_ship 內。

如同我在這篇文章:製作艦隊收藏(艦これ)外掛 (七) 快速更換艦娘、自訂艦隊 所述,api_stype 即為艦娘的船艦種類,如驅逐艦、潛水艇等等。

api_start2 內對 api_stype 的說明如下:

# 註:後方括號內為我自己的評論
api_stype 1  海防艦 (沒看過?尚未實裝?)
api_stype 2  駆逐艦
api_stype 3  軽巡洋艦
api_stype 4  重雷装巡洋艦
api_stype 5  重巡洋艦
api_stype 6  航空巡洋艦
api_stype 7  軽空母
api_stype 8  戦艦 (高速戰艦、金剛型戰艦)
api_stype 9  戦艦 (低速戰艦、非金剛型戰艦)
api_stype 10 航空戦艦
api_stype 11 正規空母
api_stype 12 超弩級戦艦 (沒看過?尚未實裝?)
api_stype 13 潜水艦
api_stype 14 潜水空母
api_stype 15 補給艦
api_stype 16 水上機母艦
api_stype 17 揚陸艦
api_stype 18 装甲空母
api_stype 19 工作艦
api_stype 20 潜水母艦
api_stype 21 練習巡洋艦

api_stype 得知艦娘的船艦種類,並套入上述公式,即可計算出艦娘維修所需時間。

3. 從圖鑑 API 看船艦類型

下面這部分跟維修資訊沒有任何關係,只是做個補充。

我在這篇文章:製作艦隊收藏(艦これ)外掛 (五) 解析 API part II 提過圖鑑 API。

其實從圖鑑 API 內也可以得知船艦類型資訊,如下:

"api_name": "吹雪",
"api_yomi": "ふぶき",
"api_stype": 2,
"api_ctype": 12,
"api_cnum": 1,

"api_name": "暁",
"api_yomi": "あかつき",
"api_stype": 2,
"api_ctype": 5,
"api_cnum": 1,

"api_name": "雷",
"api_yomi": "いかづち",
"api_stype": 2,
"api_ctype": 5,
"api_cnum": 3,

根據我專業的交叉比對得出各變數代表的意義:

"api_name": "電",
"api_yomi": "いなづま",
"api_stype": 2,  # ship_type,驅逐艦
"api_ctype": 5,  # class,驅逐艦中的曉型
"api_cnum": 4,   # index within its category,曉型中第四番艦

P.S 這只是我的觀察啦,我不是艦娘系的。


(二) 自動維修

0. 影片展示、說明

在 Youtube 可選擇 HD 高畫質。

1. 維修資訊

自動維修的資訊來自 Port API 的 api_ndock,可用 Time 或是 DateTime 物件來操作 api_complete_time (Epoch Time),將其轉成我們所需的資訊。

當維修廠都放入受傷的艦娘後,可用 time.sleep() 讓程式進入休眠,甦醒時間設定成艦娘維修完成的時間,然後重複此步驟。

2. 倒數效果

善用 Carriage Return 即可做出影片中維修倒數的效果。

如同大部分的程式語言,Python 用 \r 來代表 Carriage Return。

一個簡單的倒數效果如下:

def print_count_down():
    update_count_down_list()
    msg = "入渠 1:" + count_down[0] + " 2:" + count_down[0]
    sys.stdout.write( "\r{}".format(msg) )
    sys.stdout.flush()
while(True):
    print_count_down()
    time.sleep(1)

單純用 print 的話,有些作業系統會自動補上 Line Feed 導致 CR 失敗,因此改用 sys.stdout.write()

有些系統沒收到 LF 之前,會繼續將資料保存在 output buffer 內,因此我們用 sys.stdout.flush() 要求強制印出。

3. 中斷維修

我這邊懶得為自動維修寫另一個 Thread,所以當自動維修啟動時,會 block 住整個外掛,一直到自動維修完成為止。

但是這樣就 少一個 terminal,很不方便,最好能有手動中斷的功能。

於是我參考 Unix Shell 的設計,以鍵盤送出 Exception 來代表中斷自動維修。

作法很簡單,用 try block 抓取 KeyboardInterrupt 即可:

try:
    check_ndock_and_kanmusu(player)
except KeyboardInterrupt:
    u.uprint('自動修理が中断されました', 'red')

(三) 延伸閱讀

VoiceTube 看影片學英文