June 6, 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. 給予艦娘代號 / 暱稱

如同影片所提,假設 c1 是切換第一個艦娘的指令,c1 akagi 鐵定比 c1 赤城 還要容易輸入。

因此建議建立一個簡易的艦娘代號對照表,動態或靜態都可以,反正自己的檔案自己 parse。

2. 讀取官方船艦資訊

我們在 快速搜尋裝備 這篇文章已經抓過「官方裝備資訊」,

同樣的方式,我們現在要從 api_start2 中抓取「官方船艦資訊」。

我們需要的是 api_start2api_mst_ship 這個陣列。

api_mst_ship 裡面的物件長這個樣子:

      {
        "api_id": 1,
        "api_sortno": 31,
        "api_name": "睦月",
        "api_yomi": "むつき",
        "api_stype": 2,
        "api_afterlv": 20,
        "api_aftershipid": "254",
        "api_taik": [
          13,
          24
        ],
        "api_souk": [
          5,
          18
        ],
        "api_houg": [
          6,
          29
        ],
        "api_raig": [
          18,
          59
        ],
        "api_tyku": [
          7,
          29
        ],
        "api_luck": [
          12,
          49
        ],
        "api_soku": 10,
        "api_leng": 1,
        "api_slot_num": 2,
        "api_maxeq": [
          0,
          0,
          0,
          0,
          0
        ],
        "api_buildtime": 18,
        "api_broken": [
          1,
          1,
          4,
          0
        ],
        "api_powup": [
          1,
          1,
          0,
          0
        ],
        "api_backs": 3,
        "api_getmes": "睦月です。<br>はりきって、まいりましょー!",
        "api_afterfuel": 100,
        "api_afterbull": 100,
        "api_fuel_max": 15,
        "api_bull_max": 15,
        "api_voicef": 0
      },

我們需要的資訊是:

  • 艦娘的圖鑑號碼(api_sortno),唯一且獨立。
  • 艦娘的名稱(api_name),唯一且獨立。
  • 艦娘的船艦種類(api_stype),可重複(e.g. 驅逐艦、輕巡洋艦、等等)。

寫一個簡單的程式去 Parse api_start2,擷取出下列資訊並另存新檔:

    {
      "api_sortno": 1,
      "api_name": "長門",
      "api_stype": 9
    },
    {
      "api_sortno": 102,
      "api_name": "伊勢改",
      "api_stype": 10
    },
    {
      "api_sortno": 6,
      "api_name": "赤城",
      "api_stype": 11
    },
    ...

如此一來我們就有了所有 艦娘的圖鑑號碼艦娘的名稱 的對照表。

艦娘的船艦種類 在這邊沒有用處,但之後撰寫自動維修時會用到,所以留下來。

3. 找出艦娘所在位置

在編成頁面選擇艦娘時,可以選擇要以什麼方式排序艦娘,分別為:

  • 艦娘等級 (Lv)
  • 艦娘種類 (航空母艦、戰艦…)
  • 艦娘受損程度
  • 艦娘入手順序 (New),如下圖

看到「艦娘入手順序」這幾個字有沒有覺得很熟悉?

沒錯,這個排序方式跟 Port API 中 艦娘的 local ID 息息相關。

舉例來說:

# 假設你現在有五隻艦娘,其 local ID 分別是
11, 22, 33, 44, 55

# 則按照 「New」來排序的話,顯示在編成選單的艦娘順序會是
55, 44, 33, 22, 11

# 資料結構用陣列表示的話,可得到
ships == [55, 44, 33, 22, 11]

藉由上述轉換,我們就能把 艦娘的 Local ID 對應到 艦娘位於編成選單的位置(是在第幾頁第幾個)。有了這個資訊,再利用 前述的 Shell 工具 就能完成自動更換艦娘的動作。

4. 步驟與 Tips

總結上述各資訊,「快速更換指定艦娘」的步驟如下:

  • 自行建立 艦娘代號艦娘暱稱 對照表 (表1)。

  • api_start2api_mst_ship 取得 艦娘的圖鑑號碼艦娘的名稱 對照表 (表2)。

  • 程式開始執行時,讀取上述兩個檔案進資料結構。

  • 使用者在 Shell 輸入更換艦娘的指令:c1 akagi。想將第一隻艦娘換成赤城。

  • 檢查是否能更換該艦娘,利用 Port API 的 api_deck_portapi_mission 檢查該艦娘是否在遠征。

  • 從 表1 將 akagi 替換成 赤城

  • 從 表2 將 赤城 替換成其 圖鑑號碼

  • 從 Port API 的 api_ship 找出對應該 圖鑑號碼 的艦娘,並取得其 Local ID。若兩隻以上,我選擇照 Lv 排序。

  • Local ID 去推斷這個艦娘應該在第幾頁的第幾個。如上上圖的「電改」就是在第 10 頁的第 3 個。

  • 將「第幾頁第幾個」的資訊丟給 Shell 的 頁面與按鈕對照表,執行更換艦娘的動作。

  • ね、簡単でしょう?


(二) 快速更換整支自訂艦隊

0. 影片展示、說明

在 Youtube 可選擇 HD 高畫質。

1. 定義自訂艦隊名稱、代號、艦隊艦娘編成

跟更換單隻艦娘的方式一樣,我將更換自訂艦隊的資訊抽出成另一個檔案,使程式架構更清晰。

這部份一樣是自己的檔案自己 parse,就不再多做評論。

2. 更換整支自訂艦隊

「快速更換整支自訂艦隊」的步驟如下:

  • 自行建立 自訂艦隊 的檔案。

  • 程式開始執行時,讀該檔案進資料結構。

  • 使用者在 Shell 輸入更換自訂艦隊的指令: f1 ensoku

  • 選擇要更換的艦隊(第 1 ~ 4 艦隊),f1 是第 1 艦隊。

  • 清空除了旗艦以外的所有僚艦。

  • 依照使用者輸入的自訂艦隊名稱從上述檔案找出 此自訂艦隊由哪些艦娘組成

  • Iternate 這些艦娘,對這些艦娘一個一個執行上述「快速更換指定艦娘」的動作,如下圖:

3. 儲存自訂艦隊資訊

「自訂艦隊資訊」跟上述「艦娘代號對照表」一樣,都是外部檔案,可直接用文字編輯器修改。

但是有些艦娘名稱不好輸入,用文字編輯器也不方便修改。

於是我又寫了另一個功能,可直接儲存使用者在遊戲內編成的艦隊組合,詳情請見上方影片。

步驟如下:

  • 使用者在 Shell 輸入更換自訂艦隊的指令: f1 save kobe

  • 程式看到指令,得知要將 第一艦隊 的編成儲存起來,此自訂艦隊代號叫做 kobe

  • 程式回到主畫面,強迫 Port API 更新以取得目前艦娘編成。

  • 程式抓取 Port API 的 api_deck_port,得到 第一艦隊 艦娘們的 Local ID

  • 透過資料結構將 Local ID 轉換成 艦娘名稱

  • 將自訂艦隊的資訊寫入檔案中 (Tip: fileinput)。


(三) 延伸閱讀