+import { NButton, NIcon, NAutoComplete } from 'naive-ui'
+import { computed } from 'vue'
+import { NavigateNextOutlined } from '@vicons/material'
+import { taskData } from '@/data'
+
+defineProps<{
+ navigate: (to: string) => void
+}>()
+
+const val = defineModel
('value', {
+ required: true
+})
+
+const options = computed(() => {
+ const lowerSearch = val.value.toLowerCase()
+ return Object.keys(taskData.data)
+ .map(name => ({
+ name,
+ type: name.toLowerCase().startsWith(lowerSearch)
+ ? 0
+ : name.toLowerCase().indexOf(lowerSearch) !== -1
+ ? 1
+ : 2
+ }))
+ .filter(({ type }) => type < 2)
+ .sort((a, b) => a.type - b.type)
+ .map(x => ({
+ label: x.name,
+ value: x.name
+ }))
+})
+
+
+
+
+
+
+
+
+
+
+ 跳转
+
+
+
+
diff --git a/src/data.ts b/src/data.ts
index 4710907..a1e1bc4 100644
--- a/src/data.ts
+++ b/src/data.ts
@@ -1,6 +1,7 @@
import type { TreeOption } from 'naive-ui'
import { computed, reactive } from 'vue'
import type { Task } from './types'
+import { loadData } from './demo/loader'
export interface TaskData {
[task: string]: Task
@@ -63,483 +64,4 @@ export const taskTree = computed(() => {
return result
})
-taskData.data = JSON.parse(`{
- "Combat": {
- "next": [
- "EnterTheShow",
- "Sub_StartUp"
- ]
- },
- "EnterTheShow": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/EnterTheShow.png",
- "roi": [
- 926,
- 221,
- 229,
- 153
- ],
- "action": "Click",
- "next_doc": "Set in code."
- },
- "MainChapter_1": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/MainChapter_1.png",
- "roi": [
- 60,
- 98,
- 318,
- 455
- ],
- "action": "Click",
- "next": "SwipeLeftAndFindStage"
- },
- "MainChapter_2": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/MainChapter_2.png",
- "roi": [
- 340,
- 99,
- 310,
- 452
- ],
- "action": "Click",
- "next": "SwipeLeftAndFindStage"
- },
- "MainChapter_3": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/MainChapter_3.png",
- "roi": [
- 618,
- 98,
- 313,
- 455
- ],
- "action": "Click",
- "next": "SwipeLeftAndFindStage"
- },
- "MainChapter_4": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/MainChapter_4.png",
- "roi": [
- 897,
- 108,
- 316,
- 444
- ],
- "action": "Click",
- "next": "SwipeLeftAndFindStage"
- },
- "Sub_ResourceChapterLabel": {
- "is_sub": true,
- "recognition": "TemplateMatch",
- "template": "template/Combat/ResourceChapterLabel.png",
- "threshold": 0.98,
- "roi": [
- 230,
- 577,
- 145,
- 142
- ],
- "action": "Click"
- },
- "ResourceChapter_LP": {
- "doc": "尘埃运动",
- "next": [
- "ResourceChapter_LPEnter",
- "Sub_ResourceChapterLabel"
- ]
- },
- "ResourceChapter_LPEnter": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/ResourceChapter_LPEnter.png",
- "threshold": 0.9,
- "roi": [
- 0,
- 153,
- 1280,
- 367
- ],
- "action": "Click",
- "next": "SwipeLeftAndFindStage"
- },
- "ResourceChapter_MA": {
- "doc": "猪鼻美学",
- "next": [
- "ResourceChapter_MAEnter",
- "Sub_ResourceChapterLabel",
- "Sub_SwipeRightForChapter"
- ]
- },
- "ResourceChapter_MAEnter": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/ResourceChapter_MAEnter.png",
- "threshold": 0.9,
- "roi": [
- 0,
- 153,
- 1280,
- 367
- ],
- "action": "Click",
- "next": "SwipeLeftAndFindStage"
- },
- "ResourceChapter_HP": {
- "doc": "丰收时令",
- "next": [
- "ResourceChapter_HPEnter",
- "Sub_ResourceChapterLabel",
- "Sub_SwipeRightForChapter"
- ]
- },
- "ResourceChapter_HPEnter": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/ResourceChapter_HPEnter.png",
- "threshold": 0.9,
- "roi": [
- 0,
- 153,
- 1280,
- 367
- ],
- "action": "Click",
- "next": "SwipeLeftAndFindStage"
- },
- "Sub_PromotionChapterLabel": {
- "is_sub": true,
- "recognition": "TemplateMatch",
- "template": "template/Combat/PromotionChapterLabel.png",
- "threshold": 0.98,
- "roi": [
- 388,
- 578,
- 157,
- 133
- ],
- "action": "Click"
- },
- "PromotionChapter_ME": {
- "doc": "群山之声",
- "next": [
- "PromotionChapter_MEEnter",
- "Sub_PromotionChapterLabel"
- ]
- },
- "PromotionChapter_MEEnter": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/PromotionChapter_MEEnter.png",
- "threshold": 0.9,
- "roi": [
- 0,
- 153,
- 1280,
- 367
- ],
- "action": "Click",
- "next": "SwipeLeftAndFindStage"
- },
- "PromotionChapter_SL": {
- "doc": "星陨之所",
- "next": [
- "PromotionChapter_SLEnter",
- "Sub_PromotionChapterLabel"
- ]
- },
- "PromotionChapter_SLEnter": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/PromotionChapter_SLEnter.png",
- "threshold": 0.9,
- "roi": [
- 0,
- 153,
- 1280,
- 367
- ],
- "action": "Click",
- "next": "SwipeLeftAndFindStage"
- },
- "PromotionChapter_SS": {
- "doc": "深林之形",
- "next": [
- "PromotionChapter_SSEnter",
- "Sub_PromotionChapterLabel",
- "Sub_SwipeRightForChapter"
- ]
- },
- "PromotionChapter_SSEnter": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/PromotionChapter_SSEnter.png",
- "threshold": 0.9,
- "roi": [
- 0,
- 153,
- 1280,
- 367
- ],
- "action": "Click",
- "next": "SwipeLeftAndFindStage"
- },
- "PromotionChapter_BW": {
- "doc": "荒兽之野",
- "next": [
- "PromotionChapter_BWEnter",
- "Sub_PromotionChapterLabel",
- "Sub_SwipeRightForChapter"
- ]
- },
- "PromotionChapter_BWEnter": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/PromotionChapter_BWEnter.png",
- "threshold": 0.9,
- "roi": [
- 0,
- 153,
- 1280,
- 367
- ],
- "action": "Click",
- "next": "SwipeLeftAndFindStage"
- },
- "Sub_SwipeRightForChapter": {
- "is_sub": true,
- "action": "Swipe",
- "begin": [
- 1100,
- 300,
- 100,
- 100
- ],
- "end": [
- 100,
- 300,
- 100,
- 100
- ]
- },
- "SwipeLeftAndFindStage": {
- "next": [
- "TargetStageName",
- "TheFarLeftOfStageList",
- "SwipeLeftForStageList"
- ]
- },
- "TargetStageName": {
- "recognition": "OCR",
- "text_doc": "Set in code.",
- "roi": [
- 0,
- 470,
- 1280,
- 160
- ],
- "action": "Click",
- "next": [
- "StageDifficulty"
- ]
- },
- "TheFarLeftOfStageList": {
- "recognition": "OCR",
- "text": "01",
- "roi": [
- 0,
- 470,
- 1280,
- 160
- ],
- "next": [
- "Combat"
- ]
- },
- "SwipeLeftForStageList": {
- "action": "Swipe",
- "begin": [
- 100,
- 550,
- 100,
- 50
- ],
- "end": [
- 1100,
- 550,
- 100,
- 50
- ],
- "next": [
- "SwipeLeftAndFindStage"
- ]
- },
- "StageDifficulty": {
- "next_doc": "Set in code."
- },
- "StageDifficulty_Story": {
- "recognition": "OCR",
- "text": [
- "故事"
- ],
- "roi": [
- 837,
- 167,
- 443,
- 194
- ],
- "action": "Click",
- "next": [
- "ReadyForAction"
- ]
- },
- "StageDifficulty_Hard": {
- "recognition": "OCR",
- "text": [
- "厄险"
- ],
- "roi": [
- 837,
- 167,
- 443,
- 194
- ],
- "action": "Click",
- "next": [
- "ReadyForAction"
- ]
- },
- "StageDifficulty_None": {
- "next": [
- "ReadyForAction"
- ]
- },
- "ReadyForAction": {
- "recognition": "OCR",
- "text": [
- "开始行动"
- ],
- "roi": [
- 900,
- 500,
- 380,
- 220
- ],
- "action": "Click",
- "next": [
- "SwitchToReplay",
- "OpenReplaysTimes"
- ]
- },
- "SwitchToReplay": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/SwitchToReplay.png",
- "roi": [
- 781,
- 581,
- 145,
- 139
- ],
- "action": "Click",
- "next": [
- "OpenReplaysTimes"
- ]
- },
- "OpenReplaysTimes": {
- "recognition": "TemplateMatch",
- "template": "template/Combat/OpenReplaysTimes.png",
- "roi": [
- 737,
- 586,
- 174,
- 134
- ],
- "action": "Click",
- "next": [
- "SetReplaysTimes",
- "StartReplay"
- ]
- },
- "SetReplaysTimes": {
- "recognition": "OCR",
- "text_doc": "Set in code.",
- "roi": [
- 791,
- 391,
- 73,
- 238
- ],
- "action": "Click",
- "next": [
- "StartReplay"
- ]
- },
- "StartReplay": {
- "recognition": "OCR",
- "text": [
- "复现"
- ],
- "roi": [
- 958,
- 537,
- 235,
- 136
- ],
- "action": "Click",
- "next": [
- "Replaying",
- "StartReplay",
- "RecoveryPage"
- ]
- },
- "RecoveryPage": {
- "recognition": "OCR",
- "text": [
- "活性",
- "恢复"
- ],
- "roi": [
- 465,
- 571,
- 277,
- 149
- ],
- "action": "Click",
- "target": "StartReplay",
- "next": [
- "HomeFlag",
- "Sub_StartUp"
- ]
- },
- "Replaying": {
- "recognition": "OCR",
- "text": [
- "行为",
- "复现"
- ],
- "roi": [
- 1078,
- 77,
- 202,
- 143
- ],
- "post_delay": 5000,
- "next": [
- "Replaying",
- "Victory"
- ]
- },
- "Victory": {
- "recognition": "OCR",
- "text": [
- "战斗",
- "胜利"
- ],
- "roi": [
- 678,
- 10,
- 473,
- 240
- ],
- "action": "Click",
- "next": [
- "Victory",
- "HomeFlag",
- "Sub_StartUp"
- ]
- }
-}`)
+loadData()
diff --git a/src/demo/awards.json b/src/demo/awards.json
new file mode 100644
index 0000000..af1dffc
--- /dev/null
+++ b/src/demo/awards.json
@@ -0,0 +1,91 @@
+{
+ "Awards": {
+ "next": [
+ "Sub_MailBadge",
+ "Sub_DailyBadge",
+ "HomeFlag",
+ "Sub_ObtainedAwards",
+ "Sub_StartUp"
+ ]
+ },
+ "Sub_MailBadge": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": "Awards/MailBadge.png",
+ "threshold": 0.98,
+ "roi": [47, 115, 108, 108],
+ "action": "Click",
+ "next": ["CollectMailAwards", "Sub_MailBadge"]
+ },
+ "CollectMailAwards": {
+ "recognition": "TemplateMatch",
+ "template": "Awards/CollectMailAwards.png",
+ "roi": [109, 551, 191, 132],
+ "action": "Click",
+ "next": ["Sub_ObtainedAwards", "NoMailAwards", "CollectMailAwards"]
+ },
+ "Sub_ObtainedAwards": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": "Awards/ObtainedAwards.png",
+ "roi": [524, 62, 232, 158],
+ "action": "Click"
+ },
+ "NoMailAwards": {
+ "recognition": "TemplateMatch",
+ "template": "Awards/NoMailAwards.png",
+ "roi": [952, 39, 164, 163],
+ "next": ["HomeFlag", "Sub_HomeButton", "Sub_BackButton"]
+ },
+ "Sub_DailyBadge": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": "Awards/DailyBadge.png",
+ "threshold": 0.98,
+ "action": "Click",
+ "roi": [44, 194, 111, 110],
+ "next": [
+ "Sub_CollectDailyAwards",
+ "Sub_ObtainedDailyAwards",
+ "WeeklyAwardsBadge",
+ "DailyAwardsPageFlag"
+ ]
+ },
+ "Sub_CollectDailyAwards": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": [
+ "Awards/CollectDailyAwards.png",
+ "Awards/CollectSingleDailyAwards.png"
+ ],
+ "action": "Click",
+ "post_wait_freezes": 1,
+ "roi": [1075, 63, 201, 183]
+ },
+ "Sub_ObtainedDailyAwards": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": "Awards/ObtainedAwards.png",
+ "roi": [524, 62, 232, 158],
+ "action": "Click"
+ },
+ "WeeklyAwardsBadge": {
+ "recognition": "TemplateMatch",
+ "template": "Awards/WeeklyAwardsBadge.png",
+ "threshold": 0.98,
+ "action": "Click",
+ "roi": [1165, 0, 111, 113],
+ "next": [
+ "Sub_CollectDailyAwards",
+ "Sub_ObtainedDailyAwards",
+ "WeeklyAwardsBadge",
+ "Sub_BackButton",
+ "HomeFlag"
+ ]
+ },
+ "DailyAwardsPageFlag": {
+ "recognition": "TemplateMatch",
+ "template": "Awards/DailyAwardsPageFlag.png",
+ "roi": [458, 0, 138, 136]
+ }
+}
diff --git a/src/demo/combat.json b/src/demo/combat.json
new file mode 100644
index 0000000..4ecb99d
--- /dev/null
+++ b/src/demo/combat.json
@@ -0,0 +1,264 @@
+{
+ "Combat": {
+ "next": ["EnterTheShow", "Sub_StartUp"]
+ },
+ "EnterTheShow": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/EnterTheShow.png",
+ "roi": [926, 221, 229, 153],
+ "action": "Click",
+ "next_doc": "Set in code."
+ },
+ "MainChapter_1": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/MainChapter_1.png",
+ "roi": [60, 98, 318, 455],
+ "action": "Click",
+ "next": "SwipeLeftAndFindStage"
+ },
+ "MainChapter_2": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/MainChapter_2.png",
+ "roi": [340, 99, 310, 452],
+ "action": "Click",
+ "next": "SwipeLeftAndFindStage"
+ },
+ "MainChapter_3": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/MainChapter_3.png",
+ "roi": [618, 98, 313, 455],
+ "action": "Click",
+ "next": "SwipeLeftAndFindStage"
+ },
+ "MainChapter_4": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/MainChapter_4.png",
+ "roi": [897, 108, 316, 444],
+ "action": "Click",
+ "next": "SwipeLeftAndFindStage"
+ },
+ "Sub_ResourceChapterLabel": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": "Combat/ResourceChapterLabel.png",
+ "threshold": 0.98,
+ "roi": [230, 577, 145, 142],
+ "action": "Click"
+ },
+ "ResourceChapter_LP": {
+ "doc": "尘埃运动",
+ "next": ["ResourceChapter_LPEnter", "Sub_ResourceChapterLabel"]
+ },
+ "ResourceChapter_LPEnter": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/ResourceChapter_LPEnter.png",
+ "threshold": 0.9,
+ "roi": [0, 153, 1280, 367],
+ "action": "Click",
+ "next": "SwipeLeftAndFindStage"
+ },
+ "ResourceChapter_MA": {
+ "doc": "猪鼻美学",
+ "next": [
+ "ResourceChapter_MAEnter",
+ "Sub_ResourceChapterLabel",
+ "Sub_SwipeRightForChapter"
+ ]
+ },
+ "ResourceChapter_MAEnter": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/ResourceChapter_MAEnter.png",
+ "threshold": 0.9,
+ "roi": [0, 153, 1280, 367],
+ "action": "Click",
+ "next": "SwipeLeftAndFindStage"
+ },
+ "ResourceChapter_HP": {
+ "doc": "丰收时令",
+ "next": [
+ "ResourceChapter_HPEnter",
+ "Sub_ResourceChapterLabel",
+ "Sub_SwipeRightForChapter"
+ ]
+ },
+ "ResourceChapter_HPEnter": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/ResourceChapter_HPEnter.png",
+ "threshold": 0.9,
+ "roi": [0, 153, 1280, 367],
+ "action": "Click",
+ "next": "SwipeLeftAndFindStage"
+ },
+ "Sub_PromotionChapterLabel": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": "Combat/PromotionChapterLabel.png",
+ "threshold": 0.98,
+ "roi": [388, 578, 157, 133],
+ "action": "Click"
+ },
+ "PromotionChapter_ME": {
+ "doc": "群山之声",
+ "next": ["PromotionChapter_MEEnter", "Sub_PromotionChapterLabel"]
+ },
+ "PromotionChapter_MEEnter": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/PromotionChapter_MEEnter.png",
+ "threshold": 0.9,
+ "roi": [0, 153, 1280, 367],
+ "action": "Click",
+ "next": "SwipeLeftAndFindStage"
+ },
+ "PromotionChapter_SL": {
+ "doc": "星陨之所",
+ "next": ["PromotionChapter_SLEnter", "Sub_PromotionChapterLabel"]
+ },
+ "PromotionChapter_SLEnter": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/PromotionChapter_SLEnter.png",
+ "threshold": 0.9,
+ "roi": [0, 153, 1280, 367],
+ "action": "Click",
+ "next": "SwipeLeftAndFindStage"
+ },
+ "PromotionChapter_SS": {
+ "doc": "深林之形",
+ "next": [
+ "PromotionChapter_SSEnter",
+ "Sub_PromotionChapterLabel",
+ "Sub_SwipeRightForChapter"
+ ]
+ },
+ "PromotionChapter_SSEnter": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/PromotionChapter_SSEnter.png",
+ "threshold": 0.9,
+ "roi": [0, 153, 1280, 367],
+ "action": "Click",
+ "next": "SwipeLeftAndFindStage"
+ },
+ "PromotionChapter_BW": {
+ "doc": "荒兽之野",
+ "next": [
+ "PromotionChapter_BWEnter",
+ "Sub_PromotionChapterLabel",
+ "Sub_SwipeRightForChapter"
+ ]
+ },
+ "PromotionChapter_BWEnter": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/PromotionChapter_BWEnter.png",
+ "threshold": 0.9,
+ "roi": [0, 153, 1280, 367],
+ "action": "Click",
+ "next": "SwipeLeftAndFindStage"
+ },
+ "Sub_SwipeRightForChapter": {
+ "is_sub": true,
+ "action": "Swipe",
+ "begin": [1100, 300, 100, 100],
+ "end": [100, 300, 100, 100]
+ },
+ "SwipeLeftAndFindStage": {
+ "next": [
+ "TargetStageName",
+ "TheFarLeftOfStageList",
+ "SwipeLeftForStageList"
+ ]
+ },
+ "TargetStageName": {
+ "recognition": "OCR",
+ "text_doc": "Set in code.",
+ "roi": [0, 470, 1280, 160],
+ "action": "Click",
+ "next": ["StageDifficulty"]
+ },
+ "TheFarLeftOfStageList": {
+ "recognition": "OCR",
+ "text": "01",
+ "roi": [0, 470, 1280, 160]
+ },
+ "SwipeLeftForStageList": {
+ "action": "Swipe",
+ "begin": [300, 550, 100, 50],
+ "end": [900, 550, 100, 50],
+ "next": ["SwipeLeftAndFindStage"]
+ },
+ "StageDifficulty": {
+ "next_doc": "Set in code."
+ },
+ "StageDifficulty_Story": {
+ "recognition": "OCR",
+ "text": ["故事"],
+ "roi": [837, 167, 443, 194],
+ "action": "Click",
+ "next": ["ReadyForAction"]
+ },
+ "StageDifficulty_Hard": {
+ "recognition": "OCR",
+ "text": ["厄险"],
+ "roi": [837, 167, 443, 194],
+ "action": "Click",
+ "next": ["ReadyForAction"]
+ },
+ "StageDifficulty_None": {
+ "next": ["ReadyForAction"]
+ },
+ "ReadyForAction": {
+ "recognition": "OCR",
+ "text": ["开始行动"],
+ "roi": [900, 500, 380, 220],
+ "action": "Click",
+ "next": ["SwitchToReplay", "OpenReplaysTimes"]
+ },
+ "SwitchToReplay": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/SwitchToReplay.png",
+ "roi": [781, 581, 145, 139],
+ "action": "Click",
+ "next": ["OpenReplaysTimes"]
+ },
+ "OpenReplaysTimes": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/OpenReplaysTimes.png",
+ "roi": [737, 586, 174, 134],
+ "action": "Click",
+ "next": ["SetReplaysTimes", "StartReplay"]
+ },
+ "SetReplaysTimes": {
+ "recognition": "OCR",
+ "text_doc": "Set in code.",
+ "roi": [791, 391, 73, 238],
+ "action": "Click",
+ "next": ["StartReplay"]
+ },
+ "StartReplay": {
+ "recognition": "OCR",
+ "text": ["复现"],
+ "roi": [958, 537, 235, 136],
+ "action": "Click",
+ "next": ["Replaying", "StartReplay", "RecoveryPage"]
+ },
+ "RecoveryPage": {
+ "recognition": "OCR",
+ "text": ["活性", "恢复"],
+ "roi": [465, 571, 277, 149],
+ "action": "Click",
+ "target": "StartReplay",
+ "next": ["HomeFlag", "Sub_StartUp"]
+ },
+ "Replaying": {
+ "recognition": "OCR",
+ "text": ["行为", "复现"],
+ "roi": [1078, 77, 202, 143],
+ "post_delay": 5000,
+ "next": ["Replaying", "Victory"]
+ },
+ "Victory": {
+ "recognition": "OCR",
+ "text": ["战斗", "胜利"],
+ "roi": [678, 10, 473, 240],
+ "action": "Click",
+ "next": ["Victory", "HomeFlag", "Sub_StartUp"]
+ }
+}
diff --git a/src/demo/combat_activity.json b/src/demo/combat_activity.json
new file mode 100644
index 0000000..2512769
--- /dev/null
+++ b/src/demo/combat_activity.json
@@ -0,0 +1,36 @@
+{
+ "ANightmareAtGreenLake": {
+ "next": ["ANightmareAtGreenLakeEnterTheShow", "Sub_StartUp"]
+ },
+ "ANightmareAtGreenLakeEnterTheShow": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/Activity/ANightmareAtGreenLakeEnterTheShow.png",
+ "roi": [940, 144, 244, 146],
+ "action": "Click",
+ "post_wait_freezes": 1,
+ "next": ["ANightmareAtGreenLakeMainChapter"]
+ },
+ "ANightmareAtGreenLakeMainChapter": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/Activity/ANightmareAtGreenLakeMainChapter.png",
+ "roi": [892, 400, 146, 177],
+ "action": "Click",
+ "next": "SwipeLeftAndFindStage"
+ },
+ "ActivityStageDifficulty": {
+ "next": ["ActivityStageDifficulty_Hard", "ActivityStageDifficultyToRight"]
+ },
+ "ActivityStageDifficulty_Hard": {
+ "recognition": "OCR",
+ "text": ["艰难"],
+ "roi": [945, 168, 210, 171],
+ "next": ["ReadyForAction"]
+ },
+ "ActivityStageDifficultyToRight": {
+ "recognition": "TemplateMatch",
+ "template": "Combat/Activity/ActivityStageDifficultyToRight.png",
+ "roi": [1126, 183, 130, 139],
+ "action": "Click",
+ "next": ["ActivityStageDifficulty"]
+ }
+}
diff --git a/src/demo/loader.ts b/src/demo/loader.ts
new file mode 100644
index 0000000..fe7cec8
--- /dev/null
+++ b/src/demo/loader.ts
@@ -0,0 +1,28 @@
+import Awards from './awards.json'
+import Combat_Act from './combat_activity.json'
+import Combat from './combat.json'
+import Psychube from './psychube.json'
+import Startup from './startup.json'
+import Wilderness from './wilderness.json'
+import { taskData, type TaskData } from '@/data'
+
+function appendPath(data: TaskData, path: string) {
+ for (const key in data) {
+ data[key].editor_info = {
+ path,
+ ...(data[key].editor_info ?? {})
+ }
+ }
+ return data
+}
+
+export function loadData() {
+ taskData.data = {
+ ...appendPath(Awards as any, 'Awards'),
+ ...appendPath(Combat_Act as any, 'CombatActivity'),
+ ...appendPath(Combat as any, 'Combat'),
+ ...appendPath(Psychube as any, 'Psychube'),
+ ...appendPath(Startup as any, 'Startup'),
+ ...appendPath(Wilderness as any, 'Wilderness')
+ }
+}
diff --git a/src/demo/psychube.json b/src/demo/psychube.json
new file mode 100644
index 0000000..2924539
--- /dev/null
+++ b/src/demo/psychube.json
@@ -0,0 +1,74 @@
+{
+ "Psychube": {
+ "next": [
+ "PsychubeEnterTheShow",
+ "PsychubeResourceStages",
+ "FreePsychubeStages",
+ "PsychubeStages_7",
+ "Sub_StartUp"
+ ]
+ },
+ "PsychubeEnterTheShow": {
+ "recognition": "TemplateMatch",
+ "template": "Psychube/EnterTheShow.png",
+ "roi": [926, 221, 229, 153],
+ "action": "Click",
+ "next": ["PsychubeResourceStages"]
+ },
+ "PsychubeResourceStages": {
+ "recognition": "TemplateMatch",
+ "template": "Psychube/ResourceStages.png",
+ "roi": [218, 571, 169, 149],
+ "action": "Click",
+ "next": ["FreePsychubeStages", "NoFreePsychubeStagesFlag"]
+ },
+ "FreePsychubeStages": {
+ "recognition": "TemplateMatch",
+ "template": "Psychube/FreePsychubeStages.png",
+ "roi": [180, 203, 246, 306],
+ "action": "Click",
+ "next": ["PsychubeStages_7", "PsychubeReadyForAction"]
+ },
+ "NoFreePsychubeStagesFlag": {
+ "recognition": "TemplateMatch",
+ "template": "Psychube/NoFreePsychubeStagesFlag.png",
+ "roi": [732, 210, 233, 297],
+ "next": ["HomeFlag", "Sub_StartUp"]
+ },
+ "PsychubeStages_7": {
+ "recognition": "TemplateMatch",
+ "template": "Psychube/PsychubeStages_7.png",
+ "roi": [306, 492, 271, 179],
+ "action": "Click",
+ "next": ["PsychubeReadyForAction", "PsychubeStages_7"]
+ },
+ "PsychubeReadyForAction": {
+ "recognition": "OCR",
+ "text": ["开始行动"],
+ "roi": [958, 537, 235, 136],
+ "action": "Click",
+ "next": ["PsychubeSwitchToReplay", "PsychubeSetReplaysTimes", "StartReplay"]
+ },
+ "PsychubeSwitchToReplay": {
+ "recognition": "TemplateMatch",
+ "template": "Psychube/SwitchToReplay.png",
+ "roi": [781, 581, 145, 139],
+ "action": "Click",
+ "next": ["PsychubeSetReplaysTimes", "StartReplay"]
+ },
+ "PsychubeSetReplaysTimes": {
+ "recognition": "TemplateMatch",
+ "template": "Psychube/SetReplaysTimes.png",
+ "threshold": 0.8,
+ "roi": [737, 586, 174, 134],
+ "action": "Click",
+ "next": ["PsychubeReplayTwice", "PsychubeSetReplaysTimes"]
+ },
+ "PsychubeReplayTwice": {
+ "recognition": "TemplateMatch",
+ "template": "Psychube/ReplayTwice.png",
+ "roi": [740, 463, 168, 148],
+ "action": "Click",
+ "next": ["PsychubeReplayTwice", "StartReplay"]
+ }
+}
diff --git a/src/demo/startup.json b/src/demo/startup.json
new file mode 100644
index 0000000..9ba6f84
--- /dev/null
+++ b/src/demo/startup.json
@@ -0,0 +1,136 @@
+{
+ "Sub_StartUp": {
+ "is_sub": true,
+ "next": [
+ "HomeFlag",
+ "Sub_HomeButton",
+ "Sub_BackButton",
+ "Sub_HomeLoading",
+ "Sub_ObtainedAwards",
+ "Sub_AccumulatedSignIn",
+ "Sub_BirthdayReward",
+ "Sub_Reward",
+ "StartGame",
+ "CloseAnnouncement",
+ "Download",
+ "GameLoading",
+ "BluePochLogo",
+ "Disclaimer",
+ "Stop"
+ ]
+ },
+ "Start1999": {
+ "action": "StartApp",
+ "package": "com.shenlan.m.reverse1999/com.ssgame.mobile.gamesdk.frame.AppStartUpActivity"
+ },
+ "BluePochLogo": {
+ "recognition": "TemplateMatch",
+ "template": "StartUp/BluePochLogo.png",
+ "roi": [298, 163, 620, 336],
+ "next": [
+ "BluePochLogo",
+ "Disclaimer",
+ "GameLoading",
+ "Download",
+ "StartGame",
+ "CloseAnnouncement"
+ ]
+ },
+ "Disclaimer": {
+ "recognition": "TemplateMatch",
+ "template": "StartUp/Disclaimer.png",
+ "roi": [512, 107, 238, 214],
+ "next": [
+ "Disclaimer",
+ "GameLoading",
+ "Download",
+ "StartGame",
+ "CloseAnnouncement"
+ ]
+ },
+ "GameLoading": {
+ "recognition": "TemplateMatch",
+ "template": "StartUp/GameLoading.png",
+ "roi": [323, 0, 599, 563],
+ "next": ["GameLoading", "Download", "StartGame", "CloseAnnouncement"]
+ },
+ "Download": {
+ "recognition": "TemplateMatch",
+ "template": "StartUp/Download.png",
+ "roi": [712, 390, 187, 150],
+ "action": "Click",
+ "next": ["GameLoading", "Download", "StartGame", "CloseAnnouncement"]
+ },
+ "CloseAnnouncement": {
+ "recognition": "TemplateMatch",
+ "template": "StartUp/CloseAnnouncement.png",
+ "roi": [1105, 40, 143, 140],
+ "action": "Click",
+ "next": ["Sub_HomeLoading", "HomeFlag", "StartGame", "CloseAnnouncement"]
+ },
+ "StartGame": {
+ "recognition": "TemplateMatch",
+ "template": "StartUp/StartGame.png",
+ "roi": [517, 458, 242, 163],
+ "action": "Click",
+ "next": [
+ "Sub_BackButton",
+ "Sub_ObtainedAwards",
+ "Sub_AccumulatedSignIn",
+ "Sub_BirthdayReward",
+ "Sub_Reward",
+ "Sub_HomeLoading",
+ "HomeFlag",
+ "StartGame",
+ "CloseAnnouncement"
+ ]
+ },
+ "Sub_HomeLoading": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": "StartUp/HomeLoading.png",
+ "roi": [459, 359, 364, 152]
+ },
+ "HomeFlag": {
+ "recognition": "TemplateMatch",
+ "template": "StartUp/HomeFlag.png",
+ "roi": [1022, 419, 194, 166]
+ },
+ "Sub_BackButton": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": ["StartUp/BackButton.png", "StartUp/BackButton_White.png"],
+ "roi": [0, 0, 134, 138],
+ "action": "Click"
+ },
+ "Sub_HomeButton": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": ["StartUp/HomeButton.png", "StartUp/HomeButton_White.png"],
+ "roi": [70, 0, 144, 144],
+ "action": "Click"
+ },
+ "Stop": {},
+ "Sub_Reward": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": "StartUp/Reward.png",
+ "roi": [419, 90, 297, 148],
+ "action": "Click",
+ "target": [0, 0, 526, 590]
+ },
+ "Sub_AccumulatedSignIn": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": "StartUp/AccumulatedSignIn.png",
+ "roi": [562, 483, 347, 163],
+ "action": "Click"
+ },
+ "Sub_BirthdayReward": {
+ "is_sub": true,
+ "recognition": "TemplateMatch",
+ "template": "StartUp/BirthdayReward.png",
+ "roi": [803, 273, 121, 121],
+ "action": "Click"
+ }
+}
diff --git a/src/demo/wilderness.json b/src/demo/wilderness.json
new file mode 100644
index 0000000..4a00005
--- /dev/null
+++ b/src/demo/wilderness.json
@@ -0,0 +1,101 @@
+{
+ "Wilderness": {
+ "next": [
+ "EnterWilderness",
+ "CollectEXP",
+ "CollectMoney",
+ "CollectTrust",
+ "TrustDialogueNext",
+ "TrustDialogueInteraction",
+ "Sub_StartUp"
+ ]
+ },
+ "EnterWilderness": {
+ "recognition": "TemplateMatch",
+ "template": "Wilderness/EnterWilderness.png",
+ "roi": [889, 348, 242, 132],
+ "action": "Click",
+ "next": [
+ "EnterWilderness",
+ "CollectEXP",
+ "CollectMoney",
+ "CollectTrust",
+ "TrustDialogueNext",
+ "TrustDialogueInteraction",
+ "Sub_HomeLoading"
+ ]
+ },
+ "CollectEXP": {
+ "recognition": "TemplateMatch",
+ "template": "Wilderness/CollectEXP.png",
+ "roi": [455, 87, 139, 134],
+ "action": "Click",
+ "post_wait_freezes": 1,
+ "next": [
+ "CollectMoney",
+ "CollectTrust",
+ "TrustDialogueNext",
+ "TrustDialogueInteraction",
+ "Sub_HomeButton",
+ "HomeFlag"
+ ]
+ },
+ "CollectMoney": {
+ "recognition": "TemplateMatch",
+ "template": "Wilderness/CollectMoney.png",
+ "roi": [685, 34, 132, 134],
+ "action": "Click",
+ "post_wait_freezes": 1,
+ "next": [
+ "CollectTrust",
+ "TrustDialogueNext",
+ "TrustDialogueInteraction",
+ "Sub_HomeButton",
+ "HomeFlag"
+ ]
+ },
+ "CollectTrust": {
+ "recognition": "TemplateMatch",
+ "template": "Wilderness/CollectTrust.png",
+ "roi": [0, 58, 188, 438],
+ "action": "Click",
+ "next": [
+ "TrustMax",
+ "CollectTrust",
+ "TrustDialogueNext",
+ "TrustDialogueInteraction",
+ "Sub_HomeButton",
+ "HomeFlag"
+ ]
+ },
+ "TrustDialogueNext": {
+ "recognition": "TemplateMatch",
+ "template": "Wilderness/TrustDialogueNext.png",
+ "roi": [1119, 631, 124, 89],
+ "action": "Click",
+ "next": [
+ "TrustDialogueNext",
+ "TrustDialogueInteraction",
+ "Sub_HomeButton",
+ "HomeFlag"
+ ]
+ },
+ "TrustDialogueInteraction": {
+ "recognition": "TemplateMatch",
+ "template": "Wilderness/TrustDialogueInteraction.png",
+ "roi": [1095, 42, 185, 593],
+ "action": "Click",
+ "next": [
+ "TrustDialogueNext",
+ "TrustDialogueInteraction",
+ "Sub_HomeButton",
+ "HomeFlag"
+ ]
+ },
+ "TrustMax": {
+ "recognition": "OCR",
+ "text": ["MAX"],
+ "roi": [0, 24, 185, 638],
+ "next": ["Sub_HomeButton", "HomeFlag"]
+ }
+}
diff --git a/src/types.ts b/src/types.ts
index fc61039..13e4a87 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -1,3 +1,5 @@
+import { computed, type Ref } from 'vue'
+
export type Rect = [number, number, number, number]
export type TextRepl = [string, string]
@@ -46,46 +48,74 @@ type Recognition = {
custom_recognizer_param?: unknown
}
-type DoNothing = {
- action?: 'DoNothing'
-}
+// type DoNothing = {
+// action?: 'DoNothing'
+// }
+
+// type Click = {
+// action: 'Click'
+// target?: true | string | Rect
+// target_offset?: Rect
+// }
+
+// type Swipe = {
+// action: 'Swipe'
+// begin?: true | string | Rect
+// begin_offset?: Rect
+// end: true | string | Rect
+// end_offset?: Rect
+// duration?: number
+// }
+
+// type Key = {
+// action: 'Key'
+// key: string | number | number[]
+// }
+
+// type StartApp = {
+// action: 'StartApp'
+// package?: string
+// }
+
+// type StopApp = {
+// action: 'StopApp'
+// package?: string
+// }
+
+// type StopTask = {
+// action: 'StopTask'
+// }
+
+// type ActCustom = {
+// action: 'Custom'
+// custom_action: string
+// custom_action_param: unknown
+// }
+
+type Action = {
+ action?:
+ | 'DoNothing'
+ | 'Click'
+ | 'Swipe'
+ | 'Key'
+ | 'StartApp'
+ | 'StopApp'
+ | 'StopTask'
+ | 'Custom'
-type Click = {
- action: 'Click'
target?: true | string | Rect
target_offset?: Rect
-}
-type Swipe = {
- action: 'Swipe'
begin?: true | string | Rect
begin_offset?: Rect
- end: true | string | Rect
+ end?: true | string | Rect
end_offset?: Rect
duration?: number
-}
-type Key = {
- action: 'Key'
- key: string | number | number[]
-}
+ key?: string | number | number[]
-type StartApp = {
- action: 'StartApp'
package?: string
-}
-type StopApp = {
- action: 'StopApp'
- package?: string
-}
-
-type StopTask = {
- action: 'StopTask'
-}
-
-type ActCustom = {
- action: 'Custom'
custom_action: string
custom_action_param: unknown
}
@@ -99,15 +129,15 @@ type WaitFreezes = {
}
// type Recognition = DirectHit | TemplateMatch | OCR | RecCustom
-type Action =
- | DoNothing
- | Click
- | Swipe
- | Key
- | StartApp
- | StopApp
- | StopTask
- | ActCustom
+// type Action =
+// | DoNothing
+// | Click
+// | Swipe
+// | Key
+// | StartApp
+// | StopApp
+// | StopTask
+// | ActCustom
export type Task = Recognition &
Action & {
@@ -127,3 +157,24 @@ export type Task = Recognition &
path?: string
}
}
+
+type RemUndefined = T extends undefined ? never : T
+export function wrapProp, K extends string>(
+ obj: Ref,
+ key: K
+) {
+ return computed | null>({
+ set(v: RemUndefined | null) {
+ if (v === null) {
+ if (key in obj.value) {
+ delete obj.value[key]
+ }
+ } else {
+ obj.value[key] = v
+ }
+ },
+ get(): RemUndefined | null {
+ return (obj.value[key] ?? null) as RemUndefined | null
+ }
+ })
+}
diff --git a/tsconfig.app.json b/tsconfig.app.json
index 3e5b621..d0cc4d7 100644
--- a/tsconfig.app.json
+++ b/tsconfig.app.json
@@ -1,6 +1,6 @@
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
- "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "src/**/*.json"],
"exclude": ["src/**/__tests__/*"],
"compilerOptions": {
"composite": true,