docs: 整理檔案

This commit is contained in:
momomochi
2023-09-05 10:28:23 +08:00
parent d572e41b7d
commit fdabe838cc
7 changed files with 0 additions and 1249 deletions

View File

@@ -1,6 +0,0 @@
# Linux 編譯教程
本文档已过时,请参考
- [简体中文](../2.1-Linux%E7%BC%96%E8%AF%91%E6%95%99%E7%A8%8B.md)
- [English](../en-us/2.1-LINUX_TUTORIAL.md)

View File

@@ -1,115 +0,0 @@
# 純網頁端PR教程
牛牛也能看懂的 GitHub Pull Request 使用指南 (\*´▽`)
⚠️ **PALLAS WARNING** ⚠️ **疊 buff 警告** ⚠️<br>
本教程中對很多概念進行了簡化,為了讓更多朋友能實際用起來,甚至有一些很不優雅~~但是簡單~~的操作,還有一些不那麼正確的解釋,還請大佬們輕噴。<br>
若您有一定的 git 使用經驗及編程基礎,~~那你還看個~~🔨,可以看稍微進階一點的教程 [Github Pull Request 流程簡述](2.2-開發相關.md)
## 基本概念及名詞解釋
這一章節內容略微枯燥,不感興趣可以直接跳過到下麵實操部分,有不理解的再回來看
### Repository倉庫
簡稱 repo存放我們代碼及其他資源檔的地方
👇 可以簡單理解為當前這個網頁及裏面所有的內容,就是 MAA 的倉庫(我們一般稱之為 MAA 的主倉庫)
![image](https://user-images.githubusercontent.com/18511905/193747349-5964bd12-de3c-4ce7-b444-29b0bd104acc.png)
### Fork複製
複製,字面意思,將 MAA 的代碼複製一份,然後可以進行後續修改等等的操作,避免把原來的弄壞了<br>
但一般說中文“複製”我們可能首先想到的是 copy 的意思fork 也沒有其他明確的翻譯,所以我們一般習慣直接說英文,比如“把代碼 fork 一份走”
既然是複製後的,那就是 `MAA (1)`bushi<br>
為了和原本的倉庫區分開,所以我們一般將原本的 MAA 倉庫稱為 “主倉庫”、“upstream上游倉庫”、“origin原倉庫<br>
因為每個人都可以自己複製一份走,所以複製後的稱之為“個人倉庫”
![image](https://user-images.githubusercontent.com/18511905/193750507-b8167df5-7a70-48d4-ba69-5dda8327e8ec.png)
### Pull Request拉取請求、合併請求
簡稱 PR“拉取請求”這個太直譯了聽起來很奇怪~~而且字太多了打起來太累~~所以也是一樣的大家一般就直接說“來個PR”<br>
書接上文,你 fork複製的個人倉庫修改完了怎麼把內容提供給主倉庫呢這時候我們就可以開一個 PR申請將自己修改的內容加入到主倉庫中。
當然啦既然是“請求”那自然是需要審批的MAA Team 的各位可能會針對你的修改提一些意見等,當然我們的意見也不一定完全正確,大家合理討論~
👇 下麵的是目前大佬們提的 PR正在等待審批的
![image](https://user-images.githubusercontent.com/18511905/193750539-9106d425-2087-4116-a599-61904690718b.png)
### Conflict衝突
假設一下,主倉庫中有個 A 檔,它的內容是 111<br>
你 fork 了一份,將其內容改成了 222但是你剛準備提交 PR這時候張三也 fork 了一份並提交了 PR並將 A 檔改成了 333<br>
這時候我們就會看到,你倆都修改了 A 檔,並且修改的不同,那聽誰的好呢?這就是 Conflict衝突<br>
衝突解決起來比較麻煩,這裏僅闡述概念,方便實際遇到時能理解發生了什麼,暫不闡述解決方案
## 純網頁端 PR 操作全流程
1. 首先進入 MAA 主倉庫fork 一份代碼
![~ NKHB1CIE8`G(UK@ %3 `H](https://user-images.githubusercontent.com/18511905/193751017-c052c3d4-fe77-433c-af21-eb8138f4b32e.png)
2. 把 “僅 master 分支” 這個選項去掉,然後點擊 Create Fork
![20221004144039](https://user-images.githubusercontent.com/18511905/193751300-ba9890fd-0916-4c85-8a46-756e686608b1.png)
3. 接下來來到了你的個人倉庫,可以看到標題是 “你的名字/MaaAssistantArknights”下麵一行小字 forked from MaaAssistantArknights/MaaAssistantArknights (複製自 MAA 主倉庫)
![image](https://user-images.githubusercontent.com/18511905/193751864-0d2d0caf-b5ef-4c91-9331-d9827f23f36b.png)
4. 切換到 dev 分支(分支這個概念和本文關係不大,~~其實是我懶得寫~~,有興趣可以搜索瞭解下,這裏只需要這樣操作即可,暫時不用關心原理)
![image](https://user-images.githubusercontent.com/18511905/193752379-90d5b317-b1aa-4563-b8b0-583c78373f9b.png)
5. 找到你要改的檔,可以點 “Go to file” 進行全局搜索,也可以直接在下面的檔夾裏翻(如果你知道檔在哪的話)
![image](https://user-images.githubusercontent.com/18511905/193752691-7102a405-dc08-4dce-9617-7f862b0b32b9.png)
6. 打開檔後,直接點擊檔右上角的 ✏️ 進行編輯
![image](https://user-images.githubusercontent.com/18511905/193752862-a9cf6019-b363-4c22-b7c7-35f4aca7377f.png)
7. 開改!(當然如果是資源檔這種,我們建議先在你電腦上的 MAA 檔夾裏測試修改,確認沒問題了再粘貼到網頁上,避免改錯了)
8. 改完了,翻到最下麵,寫一下你改了啥
![image](https://user-images.githubusercontent.com/18511905/193754154-b21f4176-1418-49c8-87a3-dab088868fdc.png)
9. 還有第二個檔要改的?改完了發現弄錯了想再改改?都沒關係!重複 5-8 即可!
10. 全改好了進行 PR !直接點 **個人倉庫** 裏的 Pull Request 標籤頁<br>
如果有 Compare & Pull Request 按鈕,那最好,直接點他!如果沒有也不用著急,點下麵的 New Pull Request 也是一樣的(請看步驟 11
![image](https://user-images.githubusercontent.com/18511905/193755450-59137215-4e0b-4eca-9ec9-8b35b52cd5ff.png)
11. 這時候來到了主倉庫,請核對一下你要 PR 的是否確認。<br>
如圖中,中間有個向左的箭頭,是將右邊的的 個人姓名/MAA 的 dev 分支,申請合併到 主倉庫/MAA 的 dev 分支。<br>
然後寫一下標題,你要修改了的具體內容等等的,然後點確認
![20221004151004](https://user-images.githubusercontent.com/18511905/193756875-556df699-96b3-411f-815e-47050e283f4d.png)
12. 等待 MAA Team 的大佬們審核吧!當然他們也可能會提意見<br>
👇 比如(純屬娛樂切勿當真)
![image](https://user-images.githubusercontent.com/18511905/193757006-75170e78-4c8d-4cd2-b8eb-ca590ea7aa50.png)
13. 如果大佬們說要再修改一些小問題的話,回到 **你的個人倉庫**,切換到先前的 dev 分支,重複 步驟 3-9 即可!<br>
注意不需要操作步驟 2重新 fork也不需要操作步驟 10重新 Pull Request你當前的 Pull Request 仍處於待審核狀態,後續的修改會直接進入到這個 Pull Request 中<br>
👇 比如可以看到最下麵多了一條“重新修改演示”的內容
![image](https://user-images.githubusercontent.com/18511905/193757668-4064273c-576d-4259-bbaa-e9f65ae486c1.png)
14. 等大佬們審批通過,就全部完成啦!**版本發佈後**,你的 GitHub 頭像將會自動進入到貢獻者列表名單中,非常感謝各位的無私奉獻!<br>
~~怎麼全是二次元啊,哦我也是啊,那沒事了~~
![image](https://user-images.githubusercontent.com/18511905/193758284-7a38f6e5-a2d1-4898-b7d3-27b4f9d0641b.png)
15. 下次如果還想提別的 PR請先切換到 dev 分支,然後直接如下圖操作<br>
**請注意!** 這個操作會強制將你的個人倉庫同步到和主倉庫一模一樣的狀態,這是最簡單粗暴但行之有效的解決衝突的方法。但如果你的個人倉庫已經有額外的編輯了,會被直接刪掉!<br>
如果確定不會造成衝突,請使用右側綠色的 `Update Branch` 按鈕<br>
如果你不清楚/不 care 我上面說的這一大堆,也請點擊左側的按鈕
![image](https://user-images.githubusercontent.com/18511905/194709964-3ea0d5b0-1bfe-4d0e-a1dc-bf4f735af655.png)
接著重複步驟 3-14修改、提 PR 即可~

View File

@@ -1,138 +0,0 @@
# 外服適配
## 準備工作
在開始這個教程之前,請確保你已經:
1. 安裝並正確配置了所需軟體。在國服或相應客戶端的 `readme.md` 中應該會有相關資訊,確保所支持的功能可以正常運行。
2. 閱讀了 `3.4-任務流程協議.md`,對各個字段的含義和用法有基本瞭解,並能理解 `@``#` 類型任務的含義和用法。
3. 瞭解外服的 `task.json` 和範本圖片中未提及的和缺少的內容會使用國服的 `task.json` 和範本圖片等內容作為備選。外服的 `task.json` 中的內容會覆蓋並重寫國服對應任務的相應字段。
4. 具備一定的英語能力,能夠閱讀英文日誌,並能通過日誌找出缺失的圖片等資訊。
5. 推建議按照任務鏈進行修改。例如,對於 `Award` 任務,根據國服 `task.json``Award` 任務的 `next` 順序逐步替換 `範本圖片` / `文本` / `修改 roi`,以確保修改後的每一步都能正常運行,或者能夠迅速發現錯誤。這樣可以避免因為一次修改修改了太多內容而不清楚程式因為哪一步卡住而不能運行。
### 修改前準備
在進行修改之前,有幾個準備工作需要注意:
1. 參考國服 task.json確保你已經準備好了與國服不同的用於外服的範本圖片和文本內容。
2. 確保你能夠隨時獲取這些圖片和文本內容。
## 獲取截圖
為了獲取高質量的截圖,請遵循以下指南:
1. 使用模擬器自帶的截圖工具進行截圖並保存。
2. 確保截圖的尺寸大於 `1280*720`,長寬比為 `16:9`
3. 確保截圖中不包含任何無關內容,例如任務欄、狀態欄、通知欄等。
4. 確保截圖中包含所有需要識別的內容。
為了裁剪圖片並獲取文本/圖片 `roi`,你需要安裝 `python``opencv`,並下載 `MaaAssistantArknights/tools/CropRoi/main.py` 檔。
然後,按照以下步驟操作:
1.`main.py` 同目錄下新建 `src``dst` 檔夾。
2. 將需要修改大小或獲取文本/圖片 `roi`**完整截圖** 放入 `src` 檔夾。
3. 運行 `main.py`
4. 使用滑鼠拖動選擇目標範圍,儘量不要包含無關內容。
5. 確定範圍後,按 `S` 鍵保存,按 `Q` 鍵退出。裁剪後的圖像將被保存在 `dst` 檔夾。
例如完成一次裁剪後的輸出內容為:
``` log
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\Release` 或 `x64\RelWithDebInfo` ,具體在哪個檔夾取決你編譯時選擇的編譯模式。
下麵是一段日誌示例:
``` log
[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` 是任務的編號。
- `class` 和 `subtask` 分別代表任務的類別和子任務。
- `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 指南](../2.2-开发相关.md)

View File

@@ -1,562 +0,0 @@
# 回呼訊息協定
**接口極速更新中,本文檔可能已經過時,建議您參考簡中或英文文檔**
## 回呼函式原型
```cpp
typedef void(ASST_CALL* AsstCallback)(int msg, const char* details, void* custom_arg);
```
## 參數總覽
- `int msg`<br>
訊息類型
```cpp
enum class AsstMsg
{
/* Global Info */
InternalError = 0, // 內部錯誤
InitFailed, // 初始化失敗
ConnectionInfo, // 連接相關資訊
AllTasksCompleted, // 全部任務完成
/* TaskChain Info */
TaskChainError = 10000, // 任務鏈執行/辨識錯誤
TaskChainStart, // 任務鏈開始
TaskChainCompleted, // 任務鏈完成
TaskChainExtraInfo, // 任務鏈額外資訊
TaskChainStopped, // 任務鏈手動停止
/* SubTask Info */
SubTaskError = 20000, // 原子任務執行/辨識錯誤
SubTaskStart, // 原子任務開始
SubTaskCompleted, // 原子任務完成
SubTaskExtraInfo, // 原子任務額外資訊
SubTaskStopped, // 原子任務手動停止
};
```
- `const char* details`<br>
訊息詳情json 字串,詳見 [欄位解釋](#欄位解釋)
- `void* custom_arg`<br>
呼叫方自定義參數,會原樣傳出 `AsstCreateEx` 介面中的 `custom_arg` 參數C 系語言可利用該參數傳出 `this` 指標
## 欄位解釋
### InternalError
Todo
### InitFailed
```json
{
"what": string, // 錯誤類型
"why": string, // 錯誤原因
"details": object // 錯誤詳情
}
```
### ConnectionInfo
```json
{
"what": string, // 資訊類型
"why": string, // 資訊原因
"uuid": string, // 設備唯一碼(連接失敗時為空)
"details": {
"adb": string, // AsstConnect 介面 adb_path 參數
"address": string, // AsstConnect 介面 address 參數
"config": string // AsstConnect 介面 config 參數
}
}
```
### 常見 `What` 欄位
- `ConnectFailed`<br>
連接失敗
- `Connected`<br>
已連接,注意此時的 `uuid` 欄位值為空(下一步才是獲取)
- `UuidGot`<br>
已獲取到設備唯一碼
- `UnsupportedResolution`<br>
解析度不被支援
- `ResolutionError`<br>
解析度獲取錯誤
- `Reconnecting`<br>
連接斷開adb / 模擬器 炸了),正在重連
- `Reconnected`<br>
連接斷開adb / 模擬器 炸了),重連成功
- `Disconnect`<br>
連接斷開adb / 模擬器 炸了),並重試失敗
- `ScreencapFailed`<br>
截圖失敗adb / 模擬器 炸了),並重試失敗
- `TouchModeNotAvailable`<br>
不支持的触控模式
### AllTasksCompleted
```json
{
"taskchain": string, // 最後的任務鏈
"uuid": string, // 設備唯一碼
"finished_tasks": [ // 已經執行過的任務 id
int,
...
]
}
```
#### 常見 `taskchain` 欄位
- `StartUp`<br>
開始喚醒
- `Fight`<br>
刷理智
- `Mall`<br>
信用點及購物
- `Recruit`<br>
自動公招
- `RecruitCalc`<br>
公招辨識
- `OperBox`<br>
Operator Box Recognition
- `Infrast`<br>
基建換班
- `Roguelike`<br>
無限刷肉鴿
- `Debug`<br>
調試
### TaskChain 相關訊息
```json
{
"taskchain": string, // 當前的任務鏈
"taskid": int, // 當前任務 TaskId
"uuid": string // 設備唯一碼
}
```
### TaskChainExtraInfo
Todo
### SubTask 相關訊息
```json
{
"subtask": string, // 子任務名
"class": string, // 子任務符號名
"taskchain": string, // 當前任務鏈
"taskid": int, // 當前任務 TaskId
"details": object, // 詳情
"uuid": string // 設備唯一碼
}
```
#### 常見 `subtask` 欄位
- `ProcessTask`<br>
```json
// 對應的 details 欄位舉例
{
"task": "StartButton2", // 任務名
"action": 512,
"exec_times": 1, // 已執行次數
"max_times": 999, // 最大執行次數
"algorithm": 0
}
```
- Todo 其他
##### 常見 `task` 欄位
- `StartButton2`<br>
開始戰鬥
- `MedicineConfirm`<br>
使用理智藥
- `StoneConfirm`<br>
碎石
- `RecruitRefreshConfirm`<br>
公招刷新標籤
- `RecruitConfirm`<br>
公招確認招募
- `RecruitNowConfirm`<br>
公招使用加急許可
- `ReportToPenguinStats`<br>
匯報到企鵝資料統計
- `ReportToYituliu`<br>
匯報到一圖流巨量資料
- `InfrastDormDoubleConfirmButton`<br>
基建宿舍的二次確認按鈕,僅當幹員衝突時才會有,請提示使用者
- `StartExplore`<br>
肉鴿開始探索
- `StageTraderInvestConfirm`<br>
肉鴿投資了源石錠
- `StageTraderInvestSystemFull`<br>
肉鴿投資達到了遊戲上限
- `ExitThenAbandon`<br>
肉鴿放棄了本次探索
- `MissionCompletedFlag`<br>
肉鴿戰鬥完成
- `MissionFailedFlag`<br>
肉鴿戰鬥失敗
- `StageTraderEnter`<br>
肉鴿關卡:詭異行商
- `StageSafeHouseEnter`<br>
肉鴿關卡:安全的角落
- `StageEncounterEnter`<br>
肉鴿關卡:不期而遇/古堡饋贈
- `StageCambatDpsEnter`<br>
肉鴿關卡:普通作戰
- `StageEmergencyDps`<br>
肉鴿關卡:緊急作戰
- `StageDreadfulFoe`<br>
肉鴿關卡:險路惡敵
- `StartGameTask`
打開用戶端失敗設定檔與傳入client_type不匹配
- Todo 其他
### SubTaskExtraInfo
```json
{
"taskchain": string, // 當前任務鏈
"class": string, // 子任務類型
"what": string, // 資訊類型
"details": object, // 資訊詳情
"uuid": string, // 設備唯一碼
}
```
#### 常見 `what` 及 `details` 欄位
- `StageDrops`<br>
關卡材料掉落資訊
```json
// 對應的 details 欄位舉例
{
"drops": [ // 本次辨識到的掉落材料
{
"itemId": "3301",
"quantity": 2,
"itemName": "技巧概要·卷1"
},
{
"itemId": "3302",
"quantity": 1,
"itemName": "技巧概要·卷2"
},
{
"itemId": "3303",
"quantity": 2,
"itemName": "技巧概要·卷3"
}
],
"stage": { // 關卡資訊
"stageCode": "CA-5",
"stageId": "wk_fly_5"
},
"stars": 3, // 行動結束星級
"stats": [ // 本次執行期間總的材料掉落
{
"itemId": "3301",
"itemName": "技巧概要·卷1",
"quantity": 4
},
{
"itemId": "3302",
"itemName": "技巧概要·卷2",
"quantity": 3
},
{
"itemId": "3303",
"itemName": "技巧概要·卷3",
"quantity": 4
}
]
}
```
- `RecruitTagsDetected`<br>
公招辨識到了 Tags
```json
// 對應的 details 欄位舉例
{
"tags": [
"費用回复",
"防護",
"先鋒幹員",
"輔助幹員",
"近戰位"
]
}
```
- `RecruitSpecialTag`<br>
公招辨識到了特殊 Tag
```json
// 對應的 details 欄位舉例
{
"tag": "高級資深幹員"
}
```
- `RecruitResult`<br>
公招辨識結果
```json
// 對應的 details 欄位舉例
{
"tags": [ // 所有辨識到的 tags目前來說一定是 5 個
"削弱",
"減速",
"術師幹員",
"輔助幹員",
"近戰位"
],
"level": 4, // 總的星級
"result": [
{
"tags": [
"削弱"
],
"level": 4, // 這組 tags 的星級
"opers": [
{
"name": "初雪",
"level": 5 // 幹員星級
},
{
"name": "隕星",
"level": 5
},
{
"name": "槐琥",
"level": 5
},
{
"name": "夜煙",
"level": 4
},
{
"name": "流星",
"level": 4
}
]
},
{
"tags": [
"減速",
"術師幹員"
],
"level": 4,
"opers": [
{
"name": "夜魔",
"level": 5
},
{
"name": "格雷伊",
"level": 4
}
]
},
{
"tags": [
"削弱",
"術師幹員"
],
"level": 4,
"opers": [
{
"name": "夜煙",
"level": 4
}
]
}
]
}
```
- `RecruitTagsRefreshed`<br>
公招刷新了 Tags
```json
// 對應的 details 欄位舉例
{
"count": 1, // 當前槽位已刷新次數
"refresh_limit": 3 // 當前槽位刷新次數上限
}
```
- `RecruitTagsSelected`<br>
公招選擇了 Tags
```json
// 對應的 details 欄位舉例
{
"tags": [
"減速",
"術師幹員"
]
}
```
- `RecruitSlotCompleted`<br>
當前公招槽位任務完成
- `RecruitError`<br>
公招辨識錯誤
- `EnterFacility`<br>
基建進入了設施
```json
// 對應的 details 欄位舉例
{
"facility": "Mfg", // 設施名
"index": 0 // 設施序號
}
```
- `NotEnoughStaff`<br>
基建可用幹員不足
```json
// 對應的 details 欄位舉例
{
"facility": "Mfg", // 設施名
"index": 0 // 設施序號
}
```
- `ProductOfFacility`<br>
基建產物
```json
// 對應的 details 欄位舉例
{
"product": "Money", // 產物名
"facility": "Mfg", // 設施名
"index": 0 // 設施序號
}
```
- `StageInfo`<br>
自動作戰關卡資訊
```json
// 對應的 details 欄位舉例
{
"name": string // 關卡名
}
```
- `StageInfoError`<br>
自動作戰關卡辨識錯誤
- `PenguinId`<br>
企鵝物流 ID
```json
// 對應的 details 欄位舉例
{
"id": string
}
```
- `DepotInfo`<br>
倉庫辨識結果
```json
// 對應的 details 欄位舉例
"done": bool, // 是否已經辨識完了,為 false 表示仍在辨識中(過程中的資料)
"arkplanner": { // https://penguin-stats.cn/planner
"object": {
"items": [
{
"id": "2004",
"have": 4,
"name": "高級作戰記錄"
},
{
"id": "mod_unlock_token",
"have": 25,
"name": "模組資料塊"
},
{
"id": "2003",
"have": 20,
"name": "中級作戰記錄"
}
],
"@type": "@penguin-statistics/depot"
},
"data": "{\"@type\":\"@penguin-statistics/depot\",\"items\":[{\"id\":\"2004\",\"have\":4,\"name\":\"高級作戰記錄\"},{\"id\":\"mod_unlock_token\",\"have\":25,\"name\":\"模組資料塊\"},{\"id\":\"2003\",\"have\":20,\"name\":\"中級作戰記錄\"}]}"
},
"lolicon": { // https://arkn.lolicon.app/#/material
"object": {
"2004" : 4,
"mod_unlock_token": 25,
"2003": 20
},
"data": "{\"2003\":20,\"2004\": 4,\"mod_unlock_token\": 25}"
}
// 目前只支援 ArkPlanner 和 Lolicon 的格式,以後可能會相容更多網站
```
- `OperBoxInfo`<br>
幹員box識別
```json
// 對應的 details 字段舉例
"done": bool, // 是否已經識別完了,為 false 表示仍在識別中(過程中的數據)
"all_oper": [
{
"id": "char_002_amiya",
"name": "阿米娅",
"own": true
},
{
"id": "char_003_kalts",
"name": "凯尔希",
"own": true
},
{
"id": "char_1020_reed2",
"name": "焰影苇草",
"own": false
},
]
"own_opers": [
{
"id": "char_002_amiya", // 幹員id
"name": "阿米娅", // 幹員名稱
"own": true, // 是否擁有
"elite": 2, // 精英度 0, 1, 2
"level": 50, // 幹員等級
"potential": 6, // 幹員潛能 [1, 6]
"rarity": 5 // [1, 6]
},
{
"id": "char_003_kalts",
"name": "凯尔希",
"own": true,
"elite": 2,
"level": 50,
"potential": 1,
"rarity": 6
}
]
```
- `UnsupportedLevel`<br>
自動抄作業,不支援的關卡名

View File

@@ -1,135 +0,0 @@
# 戰鬥流程協定
`resource/copilot/*.json` 的使用方法及各欄位說明
## 完整欄位一覽
```json
{
"stage_name": "暴君", // 關卡名必選。關卡中文名、code、stageId、levelId等只要能保證唯一均可。
"opers": [ // 指定幹員
{
"name": "棘刺", // 幹員名
"skill": 3, // 技能序號。可選,預設 1取值範圍 [1, 3]
"skill_usage": 0, // 技能用法。可選,預設 0
// 0 - 不自動使用(依賴 "actions" 欄位)
// 1 - 好了就用,有多少次用多少次(例如幹員 棘刺 3 技能、桃金孃 1 技能等)
// 2 - 好了就用,僅使用一次(例如幹員 山 2 技能)
// 3 - 自動判斷使用時機(畫餅.jpg
// 如果是全自動的技能,填 0
"requirements": { // 練度要求。保留介面,暫未實現。可選,預設為空
"elite": 2, // 精英化等級。可選,預設為 0, 不要求精英化等級
"level": 90, // 幹員等級。可選,預設為 0
"skill_level": 10, // 技能等級。可選,預設為 0
"module": 1, // 模組編號。可選,預設為 0
"potentiality": 1 // 潛能要求。可選,預設為 0
}
},
],
"groups": [
{
"name": "任意正常群補", // 群組名,必選
// 自己隨便取名字,與下面 deploy 中的 name 對應起來就行
"opers": [ // 幹員任選其一,無序,會優先選練度高的,用法同上述 opers 欄位
{
"name": "夜鶯",
"skill": 3,
"skill_usage": 2 // 若是指定時刻,不同的幹員技能 cd 可能不同,請留意
},
{
"name": "白面鴞",
"skill": 2,
"skill_usage": 2
}
]
}
],
"actions": [ // 戰鬥中的操作。有序,執行完前一個才會去執行下一個。必選
{
"type": "部署", // 操作類型,可選,預設 "Deploy"
// "Deploy" | "Skill" | "Retreat" | "SpeedUp" | "BulletTime" | "SkillUsage" | "Output" | "SkillDaemon"
// "部署" | "技能" | "撤退" | "二倍速" | "子彈時間" | "技能用法" | "列印" | "擺完掛起"
// 中英文皆可,效果相同
// 若為 "部署", 當費用不夠時,會一直等待到費用夠(除非 timeout
// 若為 "技能", 當技能 cd 沒轉好時,一直等待到技能 cd 好(除非 timeout
// "二倍速" 是可切換的,即使用一次變成二倍速,再次使用又變回一倍速
// "子彈時間" 保留介面,暫未實現,即點擊任意幹員後的 1/5 速度,再進行任意 action 會恢復正常速度
// "列印" 畫面不顯示這條步驟,僅用於輸出 doc 裡的內容(用來做字幕之類的)
// "擺完掛起" 僅使用 "好了就用" 的技能,其他什麼都不做,直到戰鬥結束
// 目前下面三個條件是且的關係,即 &&
"kills": 0, // 擊殺數條件,如果沒達到就一直等待。可選,預設為 0直接執行
"cost_changes": 5, // 費用變化量條件,如果沒達到就一直等待。可選,預設為 0直接執行
// 注意是從開始執行本 actions 開始計算的(即前一個 action 結束時的費用作為基準)
// 另外僅在費用是兩位數的時候辨識得比較準,三位數的費用可能會辨識錯,不推薦使用
"cooling": 2, // CD 中幹員數量條件,如果沒達到就一直等待。可選,預設 -1不辨識
// TODO: 其他條件
// TODO: "condition_type": 0, // 執行條件間的關係,可選,預設 0
// // 0 - 且; 1 - 或
"name": "棘刺", // 幹員名 或 群組名, type 為 "部署" 時必選,為 "技能" | "撤退" 時可選
"location": [ 5, 5 ], // 部署幹員的位置。
// type 為 "部署" 時必選。
// type 為 "技能" | "撤退" 時可選,
// "技能":僅推薦場地上自動的裝置等,不填寫 name並使用 location 開啟技能。正常部署的幹員推薦使用 name 開啟技能
// "撤退":僅推薦有多個同名召喚物時,不填寫 name, 並使用 location 進行撤退。正常部署的幹員推薦 name 進行撤退
"direction": "左", // 部署幹員的幹員朝向。 type 為 "部署" 時必選
// "Left" | "Right" | "Up" | "Down" | "None"
// "左" | "右" | "上" | "下" | "無"
// 中英文皆可,效果相同
"skill_usage": 1, // 修改技能用法。當 type 為 "技能用法" 時必選
// 舉例:剛下桃金娘需要她幫忙打幾個怪,不能自動開技能,中後期平穩了需要她自動開技能
// 則可以在對應時刻設置為 1
"pre_delay": 0, // 前置延時。可選,預設 0, 單位毫秒
"post_delay": 0, // 後置延時。可選,預設 0, 單位毫秒
// "timeout": 999999999, // 保留欄位,暫未實現。
// 超時時間。當 type 為 "部署" | "技能" 時可選。預設 INT_MAX, 單位毫秒
// 等待超時則放棄當前動作, 轉而執行下一個動作
"doc": "下棘刺了!", // 描述,可選。會顯示在畫面上,沒有實際作用
"doc_color": "orange" // 描述文字的顏色,可選,預設灰色。會顯示在畫面上,沒有實際作用。
},
// 舉例 1
{
"name": "任意正常群補",
"location": [ 5, 6 ],
"direction": "右"
},
// 舉例 2
{
"name": "史爾特爾",
"location": [ 4, 5 ],
"direction": "左",
"doc": "你史爾特爾奶奶來啦!",
"doc_color": "red"
},
// 舉例 3
{
"type": "二倍速"
}
],
"minimum_required": "v4.0", // 最低要求 maa 版本號,必選。保留欄位,暫未實現
"doc": { // 描述,可選。
"title": "低練度高成功率作業",
"title_color": "dark",
"details": "對練度要求很低balabala……", // 建議在這裡寫上你的名字! (作者名)、參考的影片攻略連結等
"details_color": "dark"
},
}
```
## 舉例
[OF-1](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/resource/copilot/OF-1_credit_fight.json)

View File

@@ -1,256 +0,0 @@
# 任務流程協議
`resource/tasks.json` 的使用方法及各欄位說明
::: tip
請注意 JSON 檔是不支援注釋的,文本中的注釋僅用於演示,請勿直接複製使用
:::
## 完整欄位一覽
```json
{
"TaskName" : { // 任務名
"baseTask": "xxx", // 以xxx任務為範本生成任務詳細見下方特殊任務類型中的Base Task
"algorithm": "MatchTemplate", // 可選項,表示識別演算法的類型
// 不填寫時默認為 MatchTemplate
// - JustReturn: 不進行識別,直接執行 action
// - MatchTemplate: 匹配圖片
// - OcrDetect: 文字識別
// - Hash: 哈希計算
"action": "ClickSelf", // 可選項,表示識別到後的動作
// 不填寫時默認為 DoNothing
// - ClickSelf: 點擊識別到的位置(識別到的目標範圍內隨機點)
// - ClickRand: 點擊整個畫面中隨機位置
// - ClickRect: 點擊指定的區域,對應 specificRect 欄位,不建議使用該選項
// - DoNothing: 什麼都不做
// - Stop: 停止當前任務
// - Swipe: 滑動,對應 specificRect 與 rectMove 欄位
"sub": [ "SubTaskName1", "SubTaskName2" ],
// 可選項,子任務。會在執行完當前任務後,依次執行每一個子任務
// 可以套娃,子任務再套子任務。但要注意不要寫出了死迴圈
"subErrorIgnored": true, // 可選項,是否忽略子任務的錯誤。
// 不填寫默認 false
// 為 false 時,若某個子任務出錯,則不繼續執行後續任務(相當於本任務出錯了)
// 為 true 時,子任務是否出錯沒有影響
"next": [ "OtherTaskName1", "OtherTaskName2" ],
// 可選項,表示執行完當前任務和 sub 任務後,下一個要執行的任務
// 會從前往後依次去識別,去執行第一個匹配上的
// 不填寫默認執行完當前任務直接停止
// 對於相同任務,第一次識別後第二次就不再識別:
// "next": [ "A", "B", "A", "A" ] -> "next": [ "A", "B" ]
// 不允許 JustReturn 型任務位於非最後一項
"maxTimes": 10, // 可選項,表示該任務最大執行次數
// 不填寫時默認無窮大
// 達到最大次數後,若存在 exceededNext 欄位,則執行 exceededNext否則直接任務停止
"exceededNext": [ "OtherTaskName1", "OtherTaskName2" ],
// 可選項,表示達到了最大執行次數後要執行的任務
// 不填寫時,達到了最大執行次數則停止;填寫後就執行這裡的,而不是 next 裡的
"onErrorNext": [ "OtherTaskName1", "OtherTaskName2" ],
// 可選項,表示執行出錯時,後續要執行的任務
"preDelay": 1000, // 可選項,表示識別到後延遲多久才執行 action單位毫秒不填寫時默認 0
"postDelay": 1000, // 可選項,表示 action 執行完後延遲多久才去識別 next, 單位毫秒;不填寫時默認 0
"roi": [ 0, 0, 1280, 720 ], // 可選項,表示識別的範圍,格式為 [ x, y, width, height ]
// 以 1280 * 720 為基準自動縮放;不填寫時默認 [ 0, 0, 1280, 720 ]
// 儘量填寫,減小識別範圍可以減少性能消耗,加快識別速度
"cache": true, // 可選項,表示該任務是否使用緩存,默認為 true;
// 第一次識別到後,以後永遠只在第一次識別到的位置進行識別,開啟可大幅節省性能
// 但僅適用於待識別目標位置完全不會變的任務,若待識別目標位置會變請設為 false
"rectMove": [ 0, 0, 0, 0 ], // 可選項,識別後的目標移動,不建議使用該選項。以 1280 * 720 為基準自動縮放
// 例如識別到了 A ,但實際要點擊的是 A 下方 10 圖元 5 * 2 區域的某個位置,
// 則可填寫[ 0, 10, 5, 2 ],可以的話儘量直接識別要點擊的位置,不建議使用該選項
// 額外的,當 action 為 Swipe 時有效且必選,表示滑動終點。
"reduceOtherTimes": [ "OtherTaskName1", "OtherTaskName2" ],
// 可選項,執行後減少其他任務的執行計數。
// 例如執行了吃理智藥,則說明上一次點擊藍色開始行動按鈕沒生效,所以藍色開始行動要-1
"specificRect": [ 100, 100, 50, 50 ],
// 當 action 為 ClickRect 時有效且必選,表示指定的點擊位置(範圍內隨機一點)。
// 當 action 為 Swipe 時有效且必選,表示滑動起點。
// 以 1280 * 720 為基準自動縮放
"specialParams": [ int, ... ], // 某些特殊識別器需要的參數
// 額外的,當 action 為 Swipe 時可選,[0] 表示 duration[1] 表示 是否啟用額外滑動
/* algorithm MatchTemplate */
"template": "xxx.png", // 可選項,要匹配的圖片檔案名
// 默認 "任務名.png"
"templThreshold": 0.8, // 可選項,圖片範本匹配得分的閾值,超過閾值才認為識別到了。
// 預設 0.8, 可根據日誌查看實際得分是多少
"maskRange": [ 1, 255 ], // 可選項,灰度遮罩範圍。例如將圖片不需要識別的部分塗成黑色(灰度值為 0
// 然後設置"maskRange"的範圍為 [ 1, 255 ], 匹配的時候即刻忽略塗黑的部分
/* algorithm OcrDetect */
"text": [ "接管作戰", "代理指揮" ], // 必選項,要識別的文字內容,只要任一匹配上了即認為識別到了
"ocrReplace": [ // 可選項,針對常見識別錯的文字進行替換(支援正則)
[ "千員", "幹員" ],
[ ".+擊幹員", "狙擊幹員" ]
],
"fullMatch": false, // 可選項,文字識別是否需要全字匹配(不能多字),默認為 false
// false 時只要是子串即可:例如 text: [ "開始" ],實際識別到了 "開始行動",也算識別成功;
// true 時則必須識別到了 "開始",多一個字都不行
"isAscii": false, // 可選項,要識別的文字內容是否為 ASCII 碼字元
// 不填寫默認 false
"withoutDet": false // 可選項,是否不使用檢測模型
// 不填寫默認 false
/* algorithm Hash */
// 演算法不成熟,僅部分特例情況中用到了,暫不推薦使用
// Todo
}
}
```
## 特殊任務類型
### Template Task`@` 型任務)
Template task 與 base task 合稱**範本任務**。
允許把某個任務 "A" 當作範本,然後 "B@A" 表示由 "A" 生成的任務。
- 如果 `tasks.json` 中未顯式定義任務 "B@A",則在 `sub`, `next`, `onErrorNext`, `exceededNext`, `reduceOtherTimes` 欄位中增加 `B@` 首碼(如遇任務名開頭為 `#` 則增加 `B` 首碼),其餘參數與 "A" 任務相同。就是說如果任務 "A" 有以下參數:
```json
"A": {
"template": "A.png",
...,
"next": [ "N1", "N2" ]
}
```
就相當於同時定義了
```json
"B@A": {
"template": "A.png",
...,
"next": [ "B@N1", "B@N2" ]
}
```
- 如果 `tasks.json` 中定義了任務 "B@A",則:
1. 如果 "B@A" 與 "A" 的 `algorithm` 欄位不同,則派生類參數不繼承(只繼承 `TaskInfo` 定義的參數)
2. 如果是圖像匹配任務,`template` 若未顯式定義則為 `B@A.png`(而不是繼承"A"的 `template` 名),其餘情況任何派生類參數若未顯式定義,直接繼承 "A" 任務的參數
3. 對於 `TaskInfo` 基類中定義的參數(任何類型任務都有的參數,例如 `algorithm`, `roi`, `next` 等),若沒有在 "B@A" 內顯式定義,則除了上面提到的 `sub` 等五個欄位在繼承時會增加 "B@" 首碼外,其餘參數直接繼承 "A" 任務的參數
### Base Task
Base task 與 template task 合稱**範本任務**。
有欄位 `baseTask` 的任務即為 base task。
Base task 的邏輯優先於 template task。這意味著 `"B@A": { "baseTask": "C", ... }` 與任務 A 沒有任何相關。
任何參數若未顯式定義則不加首碼地直接使用 `baseTask` 對應任務的參數,除了 `template` 未顯式定義時仍為 `"任務名.png"`。
#### 多檔任務
- 後載入的任務檔 (例如外服 `tasks.json`; 下稱檔二) 中定義的同名任務直接繼承先載入的任務檔 (例如國服 `tasks.json`; 下稱文件一) 的參數。
- 如果檔二中定義的任務在檔一中也定義了同名任務,那麼:
1. 如果檔二中任務沒有 `baseTask` 欄位,則直接繼承檔一中同名任務的參數。
2. 如果檔二中任務有欄位 `"baseTask": "#none"`,則不繼承檔一中同名任務的參數。
- **若有定義任務 "A",則以 template task 的邏輯處理 "B@A"**
- 若未定義任務 "A",則以普通任務的邏輯處理 "B@A"
### Virtual Task虛任務
Virtual task 也稱 sharp task`#` 型任務)。
任務名帶 `#` 的任務即為 virtual task。 `#` 後可接 `next`, `back`, `self`, `sub`, `on_error_next`, `exceeded_next`, `reduce_other_times`。
| 虛任務類型 | 含義 | 簡單示例 |
|:---------:|:---:|:--------:|
| self | 父任務名 | `"A": {"next": "#self"}` 中的 `"#self"` 被解釋為 `"A"`<br>`"B": {"next": "A@B@C#self"}` 中的 `"A@B@C#self"` 被解釋為 `"B"`。<sup>1</sup> |
| back | # 前面的任務名 | `"A@B#back"` 被解釋為 `"A@B"`<br>`"#back"` 直接出現則會被跳過 |
| next, sub 等 | # 前任務名對應欄位 | 以 `next` 為例:<br>`"A#next"` 被解釋為 `Task.get("A")->next`<br>`"#next"` 直接出現則會被跳過 |
_Note<sup>1</sup>: `"XXX#self"` 與 `"#self"` 含義相同。_
#### 簡單示例
```json
{
"A": { "next": [ "N1", "N2" ] },
"C": { "next": [ "B@A#next" ] },
"Loading": {
"next": [ "#self", "#next", "#back" ]
},
"B": {
"next": [ "Other", "B@Loading" ]
}
}
```
可以得到:
```cpp
Task.get("C")->next = { "B@N1", "B@N2" };
Task.get("B@Loading")->next = { "B@Loading", "Other", "B" };
Task.get("Loading")->next = { "Loading" };
Task.get_raw("B@Loading")->next = { "B#self", "B#next", "B#back" };
```
#### 一些用途
- 當幾個任務有 `"next": [ "#back" ]` 時,`"Task1@Task2@Task3"` 代表依次執行 `Task3`, `Task2`, `Task1`。
#### 其它相關
```json
{
"A": { "next": [ "N0" ] },
"B": { "next": [ "A#next" ] },
"C@A": { "next": [ "N1" ] }
}
```
以上這種情況, `"C@B" -> next`(即 `C@A#next`)為 `[ "N1" ]` 而不是 `[ "C@N0" ]`.
## 運算式計算
| 符號 | 含義 | 實例 |
|:---------:|:---:|:--------:|
| `@` | 範本任務 | `Fight@ReturnTo` |
| `#`(單目) | 虛任務 | `#self` |
| `#`(雙目) | 虛任務 | `StartUpThemes#next` |
| `*` | 重複多個任務 | `(ClickCornerAfterPRTS+ClickCorner)*5` |
| `+` | 任務清單合併(在 next 系列屬性中同名任務只保留最靠前者) | `A+B` |
| `^` | 任務列表差(在前者但不在後者,順序不變)| `(A+A+B+C)^(A+B+D)`(結果為 `C` |
運算子 `@`, `#`, `*`, `+`, `^` 有優先順序:`#`(單目)> `@` = `#`(雙目)> `*` > `+` = `^`。
## Schema 檢驗
本項目為 `tasks.json` 配置了 json schema 檢驗schema 文件為`docs/maa_tasks_schema.json`。
### Visual Studio
在 `MaaCore.vcxporj` 中已對其進行配置,開箱即用。提示效果較為晦澀,且有部分資訊缺失。
### Visual Studio Code
在 `.vscode/settings.json` 中已對其進行配置,用 vscode 打開該**專案檔案夾**即可使用。提示效果較好。

View File

@@ -1,37 +0,0 @@
# 肉鴿戰鬥流程協定
`resource/roguelike_copilot.json` 的使用方法及各欄位說明
## 完整欄位一覽
```json
[
{
"stage_name": "驯兽小屋", // 關卡名,必選
"replacement_home": { // 替換掉家門的位置,可選,預設為空
"location": [ // 會使用這裡面的坐標來代替藍門的坐標,然後堵門
6,
4
],
"direction": "left" // 优先朝向,但并不代表绝对是这个方向(算法自行判断)
// 不填默认 none即没有推荐方向完全由算法自行判断
// "none / left / right / up / down / 无 / 上 / 下 / 左 / 右"
},
"blacklist_location": [ // 黑名单位置,永远不会在这个格子上部署干员
[
0,
0
],
[
1,
1
]
],
"key_kills": [ // 關鍵擊殺數,可選,預設為空
15, // 若不為空,幹員技能會攢著,不是好了就放,而是等到擊殺數達到時再釋放
... // 當跑完陣列裡所有的元素之後,再把幹員技能變成好了就放
]
},
...
]
```