Skip to content

Latest commit

 

History

History
138 lines (90 loc) · 8.53 KB

2.5-外服適配教程.md

File metadata and controls

138 lines (90 loc) · 8.53 KB

外服適配

準備工作

在開始這個教程之前,請確保你已經:

  1. 安裝並正確配置了所需軟體。在國服或相應客戶端的 readme.md 中應該會有相關資訊,確保所支持的功能可以正常運行。
  2. 閱讀了 MaaAssistantArknights/docs/3.4-任務流程協議.md,對各個字段的含義和用法有基本瞭解,並能理解 @# 類型任務的含義和用法。
  3. 瞭解外服的 task.json 和範本圖片中未提及的和缺少的內容會使用國服的 task.json 和範本圖片等內容作為備選。外服的 task.json 中的內容會覆蓋並重寫國服對應任務的相應字段。
  4. 具備一定的英語能力,能夠閱讀英文日誌,並能通過日誌找出缺失的圖片等資訊。
  5. 推建議按照任務鏈進行修改。例如,對於 Award 任務,根據國服 task.jsonAward 任務的 next 順序逐步替換 範本圖片 / 文本 / 修改 roi,以確保修改後的每一步都能正常運行,或者能夠迅速發現錯誤。這樣可以避免因為一次修改修改了太多內容而不清楚程式因為哪一步卡住而不能運行。

修改前準備

在進行修改之前,有幾個準備工作需要注意:

  1. 參考國服 task.json,確保你已經準備好了與國服不同的用於外服的範本圖片和文本內容。
  2. 確保你能夠隨時獲取這些圖片和文本內容。

獲取截圖

為了獲取高質量的截圖,請遵循以下指南:

  1. 使用模擬器自帶的截圖工具進行截圖並保存。
  2. 確保截圖的尺寸大於 1280*720,長寬比為 16:9
  3. 確保截圖中不包含任何無關內容,例如任務欄、狀態欄、通知欄等。
  4. 確保截圖中包含所有需要識別的內容。

為了裁剪圖片並獲取文本/圖片 roi,你需要安裝 pythonopencv,並下載 MaaAssistantArknights/tools/CropRoi/main.py 檔。

然後,按照以下步驟操作:

  1. main.py 同目錄下新建 srcdst 檔夾。
  2. 將需要修改大小或獲取文本/圖片 roi完整截圖 放入 src 檔夾。
  3. 運行 main.py
  4. 使用滑鼠拖動選擇目標範圍,儘量不要包含無關內容。
  5. 確定範圍後,按 S 鍵保存,按 Q 鍵退出。裁剪後的圖像將被保存在 dst 檔夾。

例如完成一次裁剪後的輸出內容為:

src: Screenshot_xxx.png
dst: Screenshot_xxx.png_426,272,177,201.png
original roi: 476, 322, 77, 101,
amplified roi: 426, 272, 177, 201

其中,

Screenshot_xxx.png 為放入 src 檔夾的完整截圖的名稱。Screenshot_xxx.png_426,272,177,201.png 為截取後的圖片。

original roi 為滑鼠選取的區域。amplified roi 為擴大後的區域,你需要的是擴大後的範圍,因此在 task.json 中的 roi 字段填入的就是這個值。

修改範本圖片

在修改範本圖片之前,需要打開對應客戶端的範本圖片檔夾和國服的範本圖片檔夾。

例如:

  • 美服的範本圖片檔夾位置為 MaaAssistantArknights\resource\global\YoStarEN\resource\template
  • 國服的範本圖片檔夾位置為 MaaAssistantArknights\resource\template

參考 task.json 中提到的範本圖片,對比國服和外服的範本圖片,找出外服中缺少的範本。

通常情況下,除了標誌等圖片,包含文字的範本都需要通過截圖來替換。如果圖片尺寸明顯大於國服對應範本圖片,則需要修改 roi 的大小。

將截取並重命名完成的範本圖片放入對應客戶端的範本圖片檔夾。

修改文本內容

在修改文本內容之前,需要打開對應伺服器的 task.json 和國服的 task.json

例如:

  • 美服的 task.json 位置為 MaaAssistantArknights\resource\global\YoStarEN\resource\tasks.json
  • 國服的 task.json 位置為 MaaAssistantArknights\resource\tasks.json

找到對應任務,將 text 字段修改為對應伺服器內顯示的內容。注意,識別的內容可以是遊戲內完整內容的子串。

通常情況下,除非是純 ASCII 字元識別,否則包含文字的 text 都需要替換。如果文字長度明顯大於國服,則需要修改 roi 的大小,如 "任務""Mission" 長度差距過大,則需要修改外服該任務 roi 的大小。

如果對應外服的 task.json 中沒有該任務,則需要添加任務,只需要填寫 text 字段即可。

修改 ROI 範圍

  1. 打開對應伺服器的 task.json,如美服的位置為 MaaAssistantArknights\resource\global\YoStarEN\resource\tasks.json
  2. 找到對應需要修改的 roi 範圍的任務,使用您準備好的外服遊戲介面截圖,根據 amplified roi,調整 roi 範圍的大小。
  3. 通常情況下, roi 不需要修改,只有和國服的識別內容大小差距過大時才需要修改。
  4. 如對應外服的 task.json 中任務不存在,則添加任務,寫上 roi 字段。

保存設置並重新啟動軟體

在修改完成後,重新啟動軟體,重新加載檔,使修改生效。或在軟體目錄下新建一個 DEBUG.txt,這樣每次點擊開始都會重新加載範本和文件,不需要重啟。

檢查是否成功:

  1. 檢查軟體的運行情況,確保軟體能夠在外服中正常使用。
  2. 如不能正常運行,需要檢查修改是否正確,或查看日誌輸出,從而找到出錯的地方。

解讀日誌

有些時候,我們修改完了 task.json 之後發現程式仍然不能正確運行,這時候我們考慮考慮查看日誌找到出錯的地方,從而修改對應任務。

日誌檔的位置在軟體的根目錄下,檔案名為 asst.log。如果你是自己編譯的 MAA ,則在 \x64\Releasex64\RelWithDebInfo ,具體在哪個檔夾取決你編譯時選擇的編譯模式。

下麵是一段日誌示例:

[2022-12-18 17:43:17.535][INF][Px7ec][Tx15c8] {"taskchain":"Award","details":{"to_be_recognized":["Award@ReturnTo","Award","ReceiveAward","DailyTask","WeeklyTask","Award@CloseAnno","Award@CloseAnnoTexas","Award@TodaysSupplies","Award@FromStageSN"],"cur_retry":10,"retry_times":20},"first":["AwardBegin"],"taskid":2,"class":"asst::ProcessTask","subtask":"ProcessTask","pre_task":"AwardBegin"}
[2022-12-18 17:43:18.398][INF][Px7ec][Tx15c8] Call ` C:\Program Files\BlueStacks_nxt\.\HD-Adb.exe -s 127.0.0.1:5555 exec-out "screencap | gzip -1" ` ret 0 , cost 862 ms , stdout size: 2074904 , socket size: 0
[2022-12-18 17:43:18.541][TRC][Px7ec][Tx15c8] OcrPack::recognize | roi: [ 500, 50, 300, 150 ]
[2022-12-18 17:43:18.541][TRC][Px7ec][Tx15c8] Ocr Pipeline with asst::WordOcr | enter
[2022-12-18 17:43:18.634][TRC][Px7ec][Tx15c8] Ocr Pipeline with asst::WordOcr | leave, 93 ms
[2022-12-18 17:43:18.634][TRC][Px7ec][Tx15c8] OcrPack::recognize | raw: [{ : [ 0, 0, 300, 150 ], score: 0.000000 }]
[2022-12-18 17:43:18.634][TRC][Px7ec][Tx15c8] OcrPack::recognize | proc: []
[2022-12-18 17:43:18.637][TRC][Px7ec][Tx15c8] asst::ProcessTask::_run | leave, 1101 ms
[2022-12-18 17:43:18.638][TRC][Px7ec][Tx15c8] ready to sleep 500
[2022-12-18 17:43:19.144][TRC][Px7ec][Tx15c8] end of sleep 500
[2022-12-18 17:43:19.144][TRC][Px7ec][Tx15c8] asst::ProcessTask::_run | enter

在這段日誌中,你可以看到:

  • taskchain 代表當前進行中的任務。
  • details 是任務的內容,包括需要識別的字段(to_be_recognized)和當前重試次數(cur_retry)和總重試次數(retry_times)。
  • first 代表任務的開始。
  • taskid 是任務的編號。
  • classsubtask 分別代表任務的類別和子任務。
  • pre_task 代表前一個任務。 此外,日誌中還會記錄命令的執行情況(如 Call)和 OCR 的資訊(如 OcrPack::recognize)。

在這段日誌中"to_be_recognized","cur_retry":3,"retry_times":20 表示已經重複識別了 10 次,最大識別次數為 20 次,到了最大識別次數後會跳過該任務並報錯,繼續執行下一個任務。如果前面的任務沒有問題,我們基本可以確定是這裏的識別出了問題,需要查看日誌中的提到的任務,尋找是否有對應的 範本檔,對應任務的 text 是否錯誤,任務識別 roi 範圍是否正確,從而找出問題所在並修改。

通過查看對應範本圖片,發現美服範本檔夾中有這張圖的範本,但是大小明顯大於國服圖片,導致國服的 roi 用在美服上識別不出來,所以需要修改美服的 task.json 中的對應任務 roi,使其與美服圖片大小對應。

提交你的修改

请参考 Github Pull Requst 指南