fix: 肉鸽跳一战打一战刷钱 (#14450)
* refactor: 在 RoguelikeConfig 中加入 skip_recruit_in_fast_pass flag,用于判断是否在特定情况下跳过招募 * refactor: refine 一下 RoguelikeRecruit-GiveUp 任务 * refactor: 重命名 RoutingStrategy * feat: 一战快速投资/烧水 * refactor: 合并冗余 Roguelike@RoutingConfig 任务,重命名为 RoguelikeRouting-Config * refactor: 统一 RoguelikeRoutingAction 命名 * refactor: 统一导航插件任务命名 * refactor: 这些任务不需要用 RoguelileRoutingAction * fix: 重命名相关模版 * chore: Auto update by pre-commit hooks [skip changelog] * chore: Auto update by pre-commit hooks [skip changelog] * fix: 漏网之鱼 * refactor: MapNode 模版搬家 * refactor: 岁兽残识导航相关任务搬家 * refactor: 改改任务名 * refactor: 模版改名 Roguelike@MapNodeX -> RoguelikeMapNode-X * refactor: 换一个似乎更简单的写法 * fix: 忘了外服了 * refactor: 漏了这个 * chore: Auto update by pre-commit hooks [skip changelog] * fix: 修修 * fix: 继续修修 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
@@ -26,10 +26,6 @@
|
||||
],
|
||||
"roi": [513, 564, 248, 63]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingRefreshNodeConfirm": {
|
||||
"roi": [993, 472, 90, 34],
|
||||
"text": ["Confirm"]
|
||||
},
|
||||
"Sarkaz@Roguelike@SelectTheme": {
|
||||
"ocrReplace": [["Hypothese.*", "Hypotheses Compilation"]],
|
||||
"text": ["Hypotheses Compilation"]
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"Sarkaz@RoguelikeRouting-ConfirmToRefreshNode": {
|
||||
"roi": [993, 472, 90, 34],
|
||||
"text": ["Confirm"]
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -17,9 +17,6 @@
|
||||
"ocrReplace": [["虚[構横]の境[目E=]?", "虚構の境"]],
|
||||
"text": ["溶魂の端緒", "錬鉄の根系", "灰燼の迷城", "蓋然の異域", "虚構の境", "輝ける天上", "奇妙な断章"]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingRefreshNodeConfirm": {
|
||||
"text": ["確定"]
|
||||
},
|
||||
"Sarkaz@Roguelike@SelectTheme": {
|
||||
"text": ["仮説集"]
|
||||
},
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"Sarkaz@RoguelikeRouting-ConfirmToRefreshNode": {
|
||||
"text": ["確定"]
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
@@ -36,9 +36,6 @@
|
||||
"괴이한단장"
|
||||
]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingRefreshNodeConfirm": {
|
||||
"text": ["확인"]
|
||||
},
|
||||
"Sarkaz@Roguelike@SelectTheme": {
|
||||
"text": ["가설", "수록"]
|
||||
},
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"Sarkaz@RoguelikeRouting-ConfirmToRefreshNode": {
|
||||
"text": ["확인"]
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 714 B After Width: | Height: | Size: 714 B |
@@ -17,9 +17,6 @@
|
||||
"Sarkaz@Roguelike@NextLevel": {
|
||||
"text": ["熔魂之始", "鍛鐵根須", "灰鑄迷城", "或然歧域", "虛實疆界", "輝光天頂", "詭譎斷章"]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingRefreshNodeConfirm": {
|
||||
"text": ["確定"]
|
||||
},
|
||||
"Sarkaz@Roguelike@SelectTheme": {
|
||||
"text": ["假說輯錄", "假說", "輯錄"]
|
||||
},
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"Sarkaz@RoguelikeRouting-ConfirmToRefreshNode": {
|
||||
"text": ["確定"]
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -3,65 +3,65 @@
|
||||
"nodes": [
|
||||
{
|
||||
"type": "CombatOps",
|
||||
"template": ["JieGarden@Roguelike@MapNodeCombatOps.png", "JieGarden@Roguelike@MapNodeCombatOpsGrey.png"]
|
||||
"template": ["JieGarden@RoguelikeMapNode-CombatOps.png", "JieGarden@RoguelikeMapNode-CombatOpsGrey.png"]
|
||||
},
|
||||
{
|
||||
"type": "EmergencyOps",
|
||||
"template": [
|
||||
"JieGarden@Roguelike@MapNodeEmergencyOps.png",
|
||||
"JieGarden@Roguelike@MapNodeEmergencyOpsGrey.png"
|
||||
"JieGarden@RoguelikeMapNode-EmergencyOps.png",
|
||||
"JieGarden@RoguelikeMapNode-EmergencyOpsGrey.png"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Encounter",
|
||||
"template": ["JieGarden@Roguelike@MapNodeEncounter.png", "JieGarden@Roguelike@MapNodeEncounterGrey.png"]
|
||||
"template": ["JieGarden@RoguelikeMapNode-Encounter.png", "JieGarden@RoguelikeMapNode-EncounterGrey.png"]
|
||||
},
|
||||
{
|
||||
"type": "Boons",
|
||||
"template": ["JieGarden@Roguelike@MapNodeBoons.png", "JieGarden@Roguelike@MapNodeBoonsGrey.png"]
|
||||
"template": ["JieGarden@RoguelikeMapNode-Boons.png", "JieGarden@RoguelikeMapNode-BoonsGrey.png"]
|
||||
},
|
||||
{
|
||||
"type": "RogueTrader",
|
||||
"template": ["JieGarden@Roguelike@MapNodeRogueTrader.png", "JieGarden@Roguelike@MapNodeRogueTraderGrey.png"]
|
||||
"template": ["JieGarden@RoguelikeMapNode-RogueTrader.png", "JieGarden@RoguelikeMapNode-RogueTraderGrey.png"]
|
||||
},
|
||||
{
|
||||
"type": "BoskyPassage",
|
||||
"template": [
|
||||
"JieGarden@Roguelike@MapNodeBoskyPassage.png",
|
||||
"JieGarden@Roguelike@MapNodeBoskyPassageGrey.png"
|
||||
"JieGarden@RoguelikeMapNode-BoskyPassage.png",
|
||||
"JieGarden@RoguelikeMapNode-BoskyPassageGrey.png"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Legend",
|
||||
"template": ["JieGarden@Roguelike@MapNodeLegend.png", "JieGarden@Roguelike@MapNodeLegendGrey.png"]
|
||||
"template": ["JieGarden@RoguelikeMapNode-Legend.png", "JieGarden@RoguelikeMapNode-LegendGrey.png"]
|
||||
},
|
||||
{
|
||||
"type": "Omissions",
|
||||
"template": ["JieGarden@Roguelike@MapNodeOmissions.png", "JieGarden@Roguelike@MapNodeOmissionsGrey.png"]
|
||||
"template": ["JieGarden@RoguelikeMapNode-Omissions.png", "JieGarden@RoguelikeMapNode-OmissionsGrey.png"]
|
||||
},
|
||||
{
|
||||
"type": "Doubts",
|
||||
"template": ["JieGarden@Roguelike@MapNodeDoubts.png", "JieGarden@Roguelike@MapNodeDoubtsGrey.png"]
|
||||
"template": ["JieGarden@RoguelikeMapNode-Doubts.png", "JieGarden@RoguelikeMapNode-DoubtsGrey.png"]
|
||||
},
|
||||
{
|
||||
"type": "Disaster",
|
||||
"template": ["JieGarden@Roguelike@MapNodeDisaster.png", "JieGarden@Roguelike@MapNodeDisasterGrey.png"]
|
||||
"template": ["JieGarden@RoguelikeMapNode-Disaster.png", "JieGarden@RoguelikeMapNode-DisasterGrey.png"]
|
||||
},
|
||||
{
|
||||
"type": "Playtime",
|
||||
"template": ["JieGarden@Roguelike@MapNodePlaytime.png"]
|
||||
"template": ["JieGarden@RoguelikeMapNode-Playtime.png"]
|
||||
},
|
||||
{
|
||||
"type": "OldShop",
|
||||
"template": ["JieGarden@Roguelike@MapNodeOldShop.png"]
|
||||
"template": ["JieGarden@RoguelikeMapNode-OldShop.png"]
|
||||
},
|
||||
{
|
||||
"type": "YiTrader",
|
||||
"template": ["JieGarden@Roguelike@MapNodeYiTrader.png"]
|
||||
"template": ["JieGarden@RoguelikeMapNode-YiTrader.png"]
|
||||
},
|
||||
{
|
||||
"type": "Scheme",
|
||||
"template": ["JieGarden@Roguelike@MapNodeScheme.png"]
|
||||
"template": ["JieGarden@RoguelikeMapNode-Scheme.png"]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -3,19 +3,19 @@
|
||||
"nodes": [
|
||||
{
|
||||
"type": "CombatOps",
|
||||
"template": ["Sarkaz@Roguelike@MapNodeCombatOps.png", "Sarkaz@Roguelike@MapNodeCombatOpsGrey.png"]
|
||||
"template": ["Sarkaz@RoguelikeMapNode-CombatOps.png", "Sarkaz@RoguelikeMapNode-CombatOpsGrey.png"]
|
||||
},
|
||||
{
|
||||
"type": "EmergencyOps",
|
||||
"template": ["Sarkaz@Roguelike@MapNodeEmergencyOps.png", "Sarkaz@Roguelike@MapNodeEmergencyOpsGrey.png"]
|
||||
"template": ["Sarkaz@RoguelikeMapNode-EmergencyOps.png", "Sarkaz@RoguelikeMapNode-EmergencyOpsGrey.png"]
|
||||
},
|
||||
{
|
||||
"type": "Encounter",
|
||||
"template": ["Sarkaz@Roguelike@MapNodeEncounter.png", "Sarkaz@Roguelike@MapNodeEncounterGrey.png"]
|
||||
"template": ["Sarkaz@RoguelikeMapNode-Encounter.png", "Sarkaz@RoguelikeMapNode-EncounterGrey.png"]
|
||||
},
|
||||
{
|
||||
"type": "RogueTrader",
|
||||
"template": ["Sarkaz@Roguelike@MapNodeRogueTraderGrey.png"]
|
||||
"template": ["Sarkaz@RoguelikeMapNode-RogueTraderGrey.png"]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -332,38 +332,6 @@
|
||||
"action": "ClickSelf",
|
||||
"next": ["JieGarden@Roguelike@GiveUpOperation", "JieGarden@Roguelike@LeaveOperation"]
|
||||
},
|
||||
"JieGarden@Roguelike@MapNodeDisaster": {
|
||||
"template": "empty.png",
|
||||
"next": ["JieGarden@Roguelike@RoutingAction-StageCombatDpsEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@MapNodeDoubts": {
|
||||
"template": "empty.png",
|
||||
"next": ["JieGarden@Roguelike@RoutingAction-StageEncounterEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@MapNodeLegend": {
|
||||
"template": "empty.png",
|
||||
"next": ["JieGarden@Roguelike@RoutingAction-StageEncounterEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@MapNodeOldShop": {
|
||||
"template": "empty.png",
|
||||
"next": ["JieGarden@Roguelike@RoutingAction-StageEncounterEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@MapNodeOmissions": {
|
||||
"template": "empty.png",
|
||||
"next": ["JieGarden@Roguelike@RoutingAction-StageEncounterEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@MapNodePlaytime": {
|
||||
"template": "empty.png",
|
||||
"next": ["JieGarden@Roguelike@RoutingAction-StageEncounterEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@MapNodeScheme": {
|
||||
"template": "empty.png",
|
||||
"next": ["JieGarden@Roguelike@RoutingAction-StageEncounterEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@MapNodeYiTrader": {
|
||||
"template": "empty.png",
|
||||
"next": ["JieGarden@Roguelike@RoutingAction-StageYiTraderEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@MapObject": {
|
||||
"roi": [255, 491, 192, 119],
|
||||
"next": ["JieGarden@StartExplore@Roguelike@RecruitOther"]
|
||||
@@ -477,210 +445,6 @@
|
||||
"template": "JieGarden@Roguelike@LastRewardConfirm.png"
|
||||
},
|
||||
"JieGarden@Roguelike@RolesDefault": {},
|
||||
"JieGarden@Roguelike@Routing": {
|
||||
"template": [
|
||||
"JieGarden@Roguelike@StageCombatDps.png",
|
||||
"JieGarden@Roguelike@StageEmergencyDps.png",
|
||||
"JieGarden@Roguelike@StageDreadfulFoe.png",
|
||||
"JieGarden@Roguelike@StageDreadfulFoe-5.png",
|
||||
"JieGarden@Roguelike@StageEncounter.png",
|
||||
"JieGarden@Roguelike@StageBoons.png",
|
||||
"JieGarden@Roguelike@StageGuidance.png",
|
||||
"JieGarden@Roguelike@StageSafeHouse.png",
|
||||
"JieGarden@Roguelike@StageTrader.png",
|
||||
"JieGarden@Roguelike@StageWindAndRain.png",
|
||||
"JieGarden@Roguelike@StageEmergencyTransportation.png",
|
||||
"JieGarden@Roguelike@StageBoskyPassage.png",
|
||||
"JieGarden@Roguelike@StageProphecy.png",
|
||||
"JieGarden@Roguelike@StageConfrontation.png"
|
||||
],
|
||||
"next": ["JieGarden@Roguelike@RoutingAction"]
|
||||
},
|
||||
"JieGarden@Roguelike@Routing-FastInvestment": {
|
||||
"template": [
|
||||
"JieGarden@Roguelike@MapNodeCombatOps.png",
|
||||
"JieGarden@Roguelike@MapNodeEmergencyOps.png",
|
||||
"JieGarden@Roguelike@MapNodeEncounter.png",
|
||||
"JieGarden@Roguelike@MapNodeRogueTrader.png",
|
||||
"JieGarden@Roguelike@MapNodeBoskyPassage.png"
|
||||
],
|
||||
"next": ["JieGarden@Roguelike@RoutingAction"]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingAction": {
|
||||
"algorithm": "JustReturn"
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingAction-ClickRemainingCandleFlame": {
|
||||
"doc": "用于替换 JieGarden@Roguelike@RoutingAction 的 BaseTask",
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@ClickRemainingCandleFlame"]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingAction-ExitThenAbandon": {
|
||||
"doc": "用于替换 JieGarden@Roguelike@RoutingAction 的 BaseTask",
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@ExitThenAbandon"]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingAction-StageCombatDpsEnter": {
|
||||
"doc": "用于替换 JieGarden@Roguelike@RoutingAction 的 BaseTask",
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageCombatDpsEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingAction-StageCombatOpsEnterThenLeave": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageCombatOpsEnterThenLeave"]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingAction-StageEncounterEnter": {
|
||||
"doc": "用于替换 JieGarden@Roguelike@RoutingAction 的 BaseTask",
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageEncounterEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingAction-StageTraderEnter": {
|
||||
"doc": "用于替换 JieGarden@Roguelike@RoutingAction 的 BaseTask",
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageTraderEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingAction-StageYiTraderEnter": {
|
||||
"doc": "用于替换 JieGarden@Roguelike@RoutingAction 的 BaseTask",
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageYiTraderEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingBoskyPassageConfig": {
|
||||
"doc": [
|
||||
"RoguelikeRoutingTaskPlugin用参数",
|
||||
"| specialParams[0]: 第一列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[1]: 第一行节点的默认纵坐标 (Rect.y)",
|
||||
"| specialParams[2]: 中间列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[3]: 中间行节点的默认纵坐标 (Rect.y)",
|
||||
"| specialParams[4]: 最后列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[5]: 最后行节点的默认纵坐标 (Rect.y)",
|
||||
"| specialParams[6]: 节点 Rect.width",
|
||||
"| specialParams[7]: 节点 Rect.height",
|
||||
"| specialParams[8]: 两列节点之间的距离",
|
||||
"| specialParams[9]: 两行节点之间的距离",
|
||||
"| specialParams[10]: roi 的 margin offset"
|
||||
],
|
||||
"template": "empty.png",
|
||||
"specialParams": [188, 107, 608, 321, 1028, 535, 64, 57, 140, 107, 15]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingBoskyPassageNodeAnalyze": {
|
||||
"template": [
|
||||
"JieGarden@Roguelike@MapNodeOldShop.png",
|
||||
"JieGarden@Roguelike@MapNodeScheme.png",
|
||||
"JieGarden@Roguelike@MapNodeYiTrader.png",
|
||||
"JieGarden@Roguelike@MapNodePlaytime.png",
|
||||
"JieGarden@Roguelike@MapNodeOmissions.png",
|
||||
"JieGarden@Roguelike@MapNodeOmissionsGrey.png",
|
||||
"JieGarden@Roguelike@MapNodeLegend.png",
|
||||
"JieGarden@Roguelike@MapNodeLegendGrey.png",
|
||||
"JieGarden@Roguelike@MapNodeDoubts.png",
|
||||
"JieGarden@Roguelike@MapNodeDoubtsGrey.png",
|
||||
"JieGarden@Roguelike@MapNodeDisaster.png",
|
||||
"JieGarden@Roguelike@MapNodeDisasterGrey.png"
|
||||
],
|
||||
"roi": [0, 60, 1280, 575],
|
||||
"postDelay": 300
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingBoskyPassagePriority_Default": {
|
||||
"doc": [
|
||||
"界园树洞节点优先级策略配置",
|
||||
"按优先级从高到低排列节点类型名称",
|
||||
"拾遗>传说>故肆>易与>筹谋>常乐>杂疑(暂时取消)>灾祸(暂时取消)"
|
||||
],
|
||||
"template": "empty.png",
|
||||
"next": [
|
||||
"JieGarden@Roguelike@MapNodeOmissions",
|
||||
"JieGarden@Roguelike@MapNodeLegend",
|
||||
"JieGarden@Roguelike@MapNodeOldShop",
|
||||
"JieGarden@Roguelike@MapNodeYiTrader",
|
||||
"JieGarden@Roguelike@MapNodeScheme",
|
||||
"JieGarden@Roguelike@MapNodePlaytime"
|
||||
]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingBoskyPassagePriority_FindPlaytime": {
|
||||
"doc": ["常乐>拾遗>传说>故肆>易与>筹谋>杂疑(暂时取消)>灾祸(暂时取消)"],
|
||||
"template": "empty.png",
|
||||
"next": [
|
||||
"JieGarden@Roguelike@MapNodePlaytime",
|
||||
"JieGarden@Roguelike@MapNodeOmissions",
|
||||
"JieGarden@Roguelike@MapNodeLegend",
|
||||
"JieGarden@Roguelike@MapNodeOldShop",
|
||||
"JieGarden@Roguelike@MapNodeYiTrader",
|
||||
"JieGarden@Roguelike@MapNodeScheme"
|
||||
]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingConfig": {
|
||||
"doc": [
|
||||
"RoguelikeRoutingTaskPlugin用参数",
|
||||
"| specialParams[0]: 第一列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[1]: 中间列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[2]: 最后列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[3]: 节点 Rect.width",
|
||||
"| specialParams[4]: 节点 Rect.height",
|
||||
"| specialParams[5]: 两列节点之间的距离",
|
||||
"| specialParams[6]: 节点 Rect 下边缘到节点铭牌下边缘的距离",
|
||||
"| specialParams[7]: roi 的 margin offset",
|
||||
"| specialParams[8]: 节点间连线方向判定的阈值"
|
||||
],
|
||||
"template": "empty.png",
|
||||
"specialParams": [321, 341, 586, 138, 47, 450, 32, 15, 7]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingContinue": {
|
||||
"template": "JieGarden@Roguelike@Continue.png",
|
||||
"roi": [1008, 523, 265, 197],
|
||||
"action": "ClickSelf",
|
||||
"next": ["JieGarden@Roguelike@RoutingContinueConfirm"]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingContinueConfirm": {
|
||||
"Doc": "next 里的 RoutingNodeAnalyze 是为了确保回到地图",
|
||||
"algorithm": "JustReturn",
|
||||
"action": "ClickRect",
|
||||
"specificRect": [50, 360, 0, 0],
|
||||
"next": ["JieGarden@Roguelike@RoutingNodeAnalyze", "JieGarden@Roguelike@RoutingContinueConfirm"]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingExitThenContinue": {
|
||||
"template": "Roguelike@ExitThenAbandon.png",
|
||||
"roi": [18, 8, 53, 53],
|
||||
"action": "ClickSelf",
|
||||
"next": ["JieGarden@Roguelike@RoutingContinue"]
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingNodeAnalyze": {
|
||||
"template": [
|
||||
"JieGarden@Roguelike@MapNodeCombatOps.png",
|
||||
"JieGarden@Roguelike@MapNodeCombatOpsGrey.png",
|
||||
"JieGarden@Roguelike@MapNodeEmergencyOps.png",
|
||||
"JieGarden@Roguelike@MapNodeEmergencyOpsGrey.png",
|
||||
"JieGarden@Roguelike@MapNodeEncounter.png",
|
||||
"JieGarden@Roguelike@MapNodeEncounterGrey.png",
|
||||
"JieGarden@Roguelike@MapNodeBoons.png",
|
||||
"JieGarden@Roguelike@MapNodeBoonsGrey.png",
|
||||
"JieGarden@Roguelike@MapNodeRogueTrader.png",
|
||||
"JieGarden@Roguelike@MapNodeRogueTraderGrey.png",
|
||||
"JieGarden@Roguelike@MapNodeBoskyPassage.png",
|
||||
"JieGarden@Roguelike@MapNodeBoskyPassageGrey.png"
|
||||
],
|
||||
"roi": [0, 60, 1280, 575],
|
||||
"postDelay": 300
|
||||
},
|
||||
"JieGarden@Roguelike@RoutingSwipeRight": {
|
||||
"doc": "生成地图时向左滑动",
|
||||
"algorithm": "JustReturn",
|
||||
"action": "Swipe",
|
||||
"specificRect": [1000, 360, 0, 0],
|
||||
"rectMove": [570, 360, 0, 0],
|
||||
"specialParams": [200, 1]
|
||||
},
|
||||
"JieGarden@Roguelike@Routing_BoskyPassage": {
|
||||
"template": [
|
||||
"JieGarden@Roguelike@MapNodeOldShop.png",
|
||||
"JieGarden@Roguelike@MapNodeScheme.png",
|
||||
"JieGarden@Roguelike@MapNodeYiTrader.png",
|
||||
"JieGarden@Roguelike@MapNodePlaytime.png",
|
||||
"JieGarden@Roguelike@MapNodeOmissions.png",
|
||||
"JieGarden@Roguelike@MapNodeLegend.png",
|
||||
"JieGarden@Roguelike@MapNodeDoubts.png",
|
||||
"JieGarden@Roguelike@MapNodeDisaster.png"
|
||||
],
|
||||
"next": ["JieGarden@Roguelike@RoutingAction"]
|
||||
},
|
||||
"JieGarden@Roguelike@SelectTheme": {
|
||||
"text": ["游园纪念"]
|
||||
},
|
||||
@@ -1149,7 +913,7 @@
|
||||
],
|
||||
"onErrorNext": ["JieGarden@Roguelike@ExitThenAbandon"]
|
||||
},
|
||||
"JieGarden@Roguelike@Stages_fastInvestment": {
|
||||
"JieGarden@Roguelike@Stages_fastPass": {
|
||||
"doc": "指挥分队专用投资策略,调用 RoguelikeRoutingTaskPlugin",
|
||||
"algorithm": "JustReturn",
|
||||
"next": [
|
||||
@@ -1157,7 +921,7 @@
|
||||
"JieGarden@Roguelike@RandomPickAfterNextLevel",
|
||||
"JieGarden@Roguelike@CloseCollectionContinue",
|
||||
"JieGarden@Roguelike@CloseCollectionClose",
|
||||
"JieGarden@Roguelike@Routing-FastInvestment"
|
||||
"JieGarden@Roguelike@Routing-FastPass"
|
||||
],
|
||||
"onErrorNext": ["JieGarden@Roguelike@ExitThenAbandon"]
|
||||
},
|
||||
@@ -1191,17 +955,6 @@
|
||||
],
|
||||
"onErrorNext": ["JieGarden@Roguelike@ExitThenAbandon"]
|
||||
},
|
||||
"JieGarden@Roguelike@Stages_routing": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": [
|
||||
"JieGarden@Roguelike@NextLevel",
|
||||
"JieGarden@Roguelike@RandomPickAfterNextLevel",
|
||||
"JieGarden@Roguelike@CloseCollectionContinue",
|
||||
"JieGarden@Roguelike@CloseCollectionClose",
|
||||
"JieGarden@Roguelike@Routing"
|
||||
],
|
||||
"onErrorNext": ["JieGarden@Roguelike@ExitThenAbandon"]
|
||||
},
|
||||
"JieGarden@Roguelike@StartExplore": {
|
||||
"roi": [1001, 524, 273, 196]
|
||||
},
|
||||
@@ -1209,23 +962,6 @@
|
||||
"template": "JieGarden@Roguelike@StartExplore.png",
|
||||
"roi": [1014, 481, 266, 219]
|
||||
},
|
||||
"JieGarden@Roguelike@StrategyChange-FastInvestment": {
|
||||
"baseTask": "JieGarden@Roguelike@StrategyChange_mode1",
|
||||
"text": ["_fastInvestment", "_restart", "_leaveBoskyPassage"],
|
||||
"ocrReplace": [
|
||||
["洪陆楼", "_fastInvestment"],
|
||||
["山水阁", "_restart"],
|
||||
["云(瓦)?(亭|亨)", "_restart"],
|
||||
["汝吾(门)?", "_restart"],
|
||||
["见字祠", "_restart"],
|
||||
["始末陵", "_restart"],
|
||||
["是非境", "_leaveBoskyPassage"]
|
||||
],
|
||||
"roi": [627, 14, 71, 28],
|
||||
"withoutDet": true,
|
||||
"binThreshold": [200, 255],
|
||||
"useRaw": false
|
||||
},
|
||||
"JieGarden@Roguelike@StrategyChange_mode0": {
|
||||
"text": ["_default", "_boskyPassageDefault"],
|
||||
"ocrReplace": [
|
||||
@@ -1275,15 +1011,33 @@
|
||||
"binThreshold": [200, 255],
|
||||
"useRaw": false
|
||||
},
|
||||
"JieGarden@Roguelike@StrategyChange_mode10001": {
|
||||
"text": ["_routing", "_exit", "_leaveBoskyPassage"],
|
||||
"JieGarden@Roguelike@StrategyChange_mode1-FastPass": {
|
||||
"baseTask": "JieGarden@Roguelike@StrategyChange_mode1",
|
||||
"text": ["_fastPass", "_restart", "_leaveBoskyPassage"],
|
||||
"ocrReplace": [
|
||||
["洪陆楼", "_routing"],
|
||||
["山水阁", "_exit"],
|
||||
["云(瓦)?(亭|亨)", "_exit"],
|
||||
["汝吾(门)?", "_exit"],
|
||||
["见字祠", "_exit"],
|
||||
["始末陵", "_exit"],
|
||||
["洪陆楼", "_fastPass"],
|
||||
["山水阁", "_restart"],
|
||||
["云(瓦)?(亭|亨)", "_restart"],
|
||||
["汝吾(门)?", "_restart"],
|
||||
["见字祠", "_restart"],
|
||||
["始末陵", "_restart"],
|
||||
["是非境", "_leaveBoskyPassage"]
|
||||
],
|
||||
"roi": [627, 14, 71, 28],
|
||||
"withoutDet": true,
|
||||
"binThreshold": [200, 255],
|
||||
"useRaw": false
|
||||
},
|
||||
"JieGarden@Roguelike@StrategyChange_mode10001": {
|
||||
"baseTask": "JieGarden@Roguelike@StrategyChange_mode1",
|
||||
"text": ["_fastPass", "_restart", "_leaveBoskyPassage"],
|
||||
"ocrReplace": [
|
||||
["洪陆楼", "_fastPass"],
|
||||
["山水阁", "_restart"],
|
||||
["云(瓦)?(亭|亨)", "_restart"],
|
||||
["汝吾(门)?", "_restart"],
|
||||
["见字祠", "_restart"],
|
||||
["始末陵", "_restart"],
|
||||
["是非境", "_leaveBoskyPassage"]
|
||||
],
|
||||
"roi": [627, 14, 71, 28],
|
||||
@@ -1325,9 +1079,9 @@
|
||||
},
|
||||
"JieGarden@Roguelike@StrategyChange_mode4-FastPass": {
|
||||
"baseTask": "JieGarden@Roguelike@StrategyChange_mode1",
|
||||
"text": ["_fastInvestment", "_exit", "_leaveBoskyPassage"],
|
||||
"text": ["_fastPass", "_exit", "_leaveBoskyPassage"],
|
||||
"ocrReplace": [
|
||||
["洪陆楼", "_fastInvestment"],
|
||||
["洪陆楼", "_fastPass"],
|
||||
["山水阁", "_exit"],
|
||||
["云(瓦)?(亭|亨)", "_exit"],
|
||||
["汝吾(门)?", "_exit"],
|
||||
@@ -1377,9 +1131,11 @@
|
||||
"template": "Roguelike@QuickFormation.png"
|
||||
},
|
||||
"JieGarden@RoguelikeRecruit-GiveUp": {
|
||||
"doc": "在集成战略模式招募干员界面点击右下角 <放弃> 文字左侧图标位置,放弃招募机会",
|
||||
"roi": [848, 610, 140, 110],
|
||||
"action": "ClickSelf"
|
||||
"doc": [
|
||||
"在集成战略模式招募干员界面点击右下角 <放弃> 文字左侧图标位置,放弃招募机会",
|
||||
"界园的招募界面 UI 和其他主题略有不同,图标缩小且位置向左偏移"
|
||||
],
|
||||
"roi": [891, 648, 58, 58]
|
||||
},
|
||||
"JieGarden@RoguelikeSettlementConfirm": {}
|
||||
}
|
||||
|
||||
@@ -459,136 +459,6 @@
|
||||
"template": "Sarkaz@Roguelike@LastRewardConfirm.png"
|
||||
},
|
||||
"Sarkaz@Roguelike@RolesDefault": {},
|
||||
"Sarkaz@Roguelike@Routing": {
|
||||
"template": [
|
||||
"Sarkaz@Roguelike@StageCombatDps.png",
|
||||
"Sarkaz@Roguelike@StageEmergencyDps.png",
|
||||
"Sarkaz@Roguelike@StageDreadfulFoe.png",
|
||||
"Sarkaz@Roguelike@StageDreadfulFoe-5.png",
|
||||
"Sarkaz@Roguelike@StageEncounter.png",
|
||||
"Sarkaz@Roguelike@StageBoons.png",
|
||||
"Sarkaz@Roguelike@StageSafeHouse.png",
|
||||
"Sarkaz@Roguelike@StageSafeHouseCR.png",
|
||||
"Sarkaz@Roguelike@StageSafeHouseHD.png",
|
||||
"Sarkaz@Roguelike@StageGambling.png",
|
||||
"Sarkaz@Roguelike@StageTrader.png",
|
||||
"Sarkaz@Roguelike@StageTraderCR.png",
|
||||
"Sarkaz@Roguelike@StageTraderHD.png",
|
||||
"Sarkaz@Roguelike@StageWindAndRain.png",
|
||||
"Sarkaz@Roguelike@StageEmergencyTransportation.png",
|
||||
"Sarkaz@Roguelike@StageBoskyPassage.png",
|
||||
"Sarkaz@Roguelike@StageProphecy.png",
|
||||
"Sarkaz@Roguelike@StageFilterTruth.png",
|
||||
"Sarkaz@Roguelike@StageFilterTruthCR.png",
|
||||
"Sarkaz@Roguelike@StageFilterTruthHD.png",
|
||||
"Sarkaz@Roguelike@StageConfrontation.png"
|
||||
],
|
||||
"next": ["Sarkaz@Roguelike@RoutingAction"]
|
||||
},
|
||||
"Sarkaz@Roguelike@Routing-CombatOps": {
|
||||
"doc": "点击普通战斗节点",
|
||||
"baseTask": "Sarkaz@Roguelike@StageCombatDps",
|
||||
"template": "Sarkaz@Roguelike@StageCombatDps.png",
|
||||
"next": []
|
||||
},
|
||||
"Sarkaz@Roguelike@Routing-FastInvestment": {
|
||||
"template": ["Sarkaz@Roguelike@StageCombatDps.png"],
|
||||
"next": ["Sarkaz@Roguelike@RoutingAction"]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingAction": {
|
||||
"algorithm": "JustReturn"
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingAction-ExitThenAbandon": {
|
||||
"doc": "用于替换 Sarkaz@Roguelike@RoutingAction 的 BaseTask",
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["Sarkaz@Roguelike@ExitThenAbandon"]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingAction-StageEncounterEnter": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["Sarkaz@Roguelike@StageEncounterEnter"]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingAction-StageTraderEnter": {
|
||||
"doc": "用于替换 Sarkaz@Roguelike@RoutingAction 的 BaseTask",
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["Sarkaz@Roguelike@StageTraderEnter"]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingConfig": {
|
||||
"doc": [
|
||||
"RoguelikeRoutingTaskPlugin用参数",
|
||||
"| specialParams[0]: 第一列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[1]: 中间列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[2]: 最后列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[3]: 节点 Rect.width",
|
||||
"| specialParams[4]: 节点 Rect.height",
|
||||
"| specialParams[5]: 两列节点之间的距离",
|
||||
"| specialParams[6]: 节点 Rect 下边缘到节点铭牌下边缘的距离",
|
||||
"| specialParams[7]: roi 的 margin offset",
|
||||
"| specialParams[8]: 节点间连线方向判定的阈值"
|
||||
],
|
||||
"template": "empty.png",
|
||||
"specialParams": [321, 341, 586, 138, 47, 450, 32, 15, 7]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingContinue": {
|
||||
"template": "Sarkaz@Roguelike@Continue.png",
|
||||
"roi": [1050, 550, 210, 100],
|
||||
"action": "ClickSelf",
|
||||
"next": ["Sarkaz@Roguelike@RoutingContinueConfirm"]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingContinueConfirm": {
|
||||
"Doc": "next 里的 RoutingNodeAnalyze 是为了确保回到地图",
|
||||
"algorithm": "JustReturn",
|
||||
"action": "ClickRect",
|
||||
"specificRect": [50, 360, 0, 0],
|
||||
"next": ["Sarkaz@Roguelike@RoutingNodeAnalyze", "Sarkaz@Roguelike@RoutingContinueConfirm"]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingExitThenContinue": {
|
||||
"template": "Roguelike@ExitThenAbandon.png",
|
||||
"roi": [18, 8, 53, 53],
|
||||
"action": "ClickSelf",
|
||||
"next": ["Sarkaz@Roguelike@RoutingContinue"]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingNodeAnalyze": {
|
||||
"template": [
|
||||
"Sarkaz@Roguelike@MapNodeCombatOps.png",
|
||||
"Sarkaz@Roguelike@MapNodeCombatOpsGrey.png",
|
||||
"Sarkaz@Roguelike@MapNodeEmergencyOps.png",
|
||||
"Sarkaz@Roguelike@MapNodeEmergencyOpsGrey.png",
|
||||
"Sarkaz@Roguelike@MapNodeEncounter.png",
|
||||
"Sarkaz@Roguelike@MapNodeEncounterGrey.png",
|
||||
"Sarkaz@Roguelike@MapNodeRogueTraderGrey.png"
|
||||
],
|
||||
"roi": [246, 60, 288, 575],
|
||||
"postDelay": 300
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingRefreshNode": {
|
||||
"roi": [796, 130, 50, 170],
|
||||
"action": "ClickSelf",
|
||||
"next": ["Sarkaz@Roguelike@RoutingRefreshNodeConfirm"]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingRefreshNodeCompleted": {
|
||||
"algorithm": "JustReturn"
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingRefreshNodeConfirm": {
|
||||
"algorithm": "OcrDetect",
|
||||
"roi": [993, 472, 53, 26],
|
||||
"text": ["确定"],
|
||||
"action": "ClickSelf",
|
||||
"postDelay": 300,
|
||||
"next": ["Sarkaz@Roguelike@RoutingRefreshNodeWaiting", "Sarkaz@Roguelike@RoutingRefreshNodeCompleted"]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingRefreshNodeWaiting": {
|
||||
"baseTask": "LoadingText",
|
||||
"postDelay": 300,
|
||||
"next": ["Sarkaz@Roguelike@RoutingRefreshNodeWaiting", "Sarkaz@Roguelike@RoutingRefreshNodeCompleted"]
|
||||
},
|
||||
"Sarkaz@Roguelike@RoutingSwipeRight": {
|
||||
"doc": "生成地图时向左滑动",
|
||||
"algorithm": "JustReturn",
|
||||
"action": "Swipe",
|
||||
"specificRect": [1000, 360, 0, 0],
|
||||
"rectMove": [570, 360, 0, 0],
|
||||
"specialParams": [200, 1]
|
||||
},
|
||||
"Sarkaz@Roguelike@SelectTheme": {
|
||||
"text": ["假说辑录"]
|
||||
},
|
||||
@@ -1313,10 +1183,5 @@
|
||||
"Sarkaz@Roguelike@WaitForStartButtonClicked": {
|
||||
"template": "Roguelike@QuickFormation.png"
|
||||
},
|
||||
"Sarkaz@RoguelikeRecruit-GiveUp": {
|
||||
"doc": "在集成战略模式招募干员界面点击右下角 <放弃> 文字左侧图标位置,放弃招募机会",
|
||||
"roi": [912, 648, 58, 58],
|
||||
"action": "ClickSelf"
|
||||
},
|
||||
"Sarkaz@RoguelikeSettlementConfirm": {}
|
||||
}
|
||||
|
||||
@@ -125,6 +125,11 @@
|
||||
"algorithm": "JustReturn",
|
||||
"postDelay": 100
|
||||
},
|
||||
"RoguelikeRecruit-GiveUp": {
|
||||
"doc": "在集成战略模式招募干员界面点击右下角 <放弃> 文字左侧图标位置,放弃招募机会",
|
||||
"roi": [912, 648, 58, 58],
|
||||
"action": "ClickSelf"
|
||||
},
|
||||
"RoguelikeRecruitElite": {
|
||||
"Doc": "base_task",
|
||||
"template": "empty.png",
|
||||
|
||||
283
resource/tasks/Roguelike/routing.json
Normal file
@@ -0,0 +1,283 @@
|
||||
{
|
||||
"RoguelikeRoutingConfig": {
|
||||
"algorithm": "JustReturn",
|
||||
"doc": [
|
||||
"RoguelikeRoutingTaskPlugin用参数",
|
||||
"| specialParams[0]: 第一列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[1]: 中间列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[2]: 最后列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[3]: 节点 Rect.width",
|
||||
"| specialParams[4]: 节点 Rect.height",
|
||||
"| specialParams[5]: 两列节点之间的距离",
|
||||
"| specialParams[6]: 节点 Rect 下边缘到节点铭牌下边缘的距离",
|
||||
"| specialParams[7]: roi 的 margin offset",
|
||||
"| specialParams[8]: 节点间连线方向判定的阈值"
|
||||
],
|
||||
"specialParams": [321, 341, 586, 138, 47, 450, 32, 15, 7]
|
||||
},
|
||||
"RoguelikeRouting-MoveRightToPeek": {
|
||||
"doc": "在地图初始位置向左滑动以检视前三列节点",
|
||||
"algorithm": "JustReturn",
|
||||
"action": "Swipe",
|
||||
"specificRect": [1000, 360, 0, 0],
|
||||
"rectMove": [800, 360, 0, 0],
|
||||
"specialParams": [200, 1, 2, 0]
|
||||
},
|
||||
"RoguelikeRouting-MoveRight": {
|
||||
"doc": "生成地图时向左滑动",
|
||||
"algorithm": "JustReturn",
|
||||
"action": "Swipe",
|
||||
"specificRect": [1000, 360, 0, 0],
|
||||
"rectMove": [570, 360, 0, 0],
|
||||
"specialParams": [200, 1]
|
||||
},
|
||||
"RoguelikeRoutingAction": {
|
||||
"algorithm": "JustReturn"
|
||||
},
|
||||
"Sarkaz@Roguelike@Routing": {
|
||||
"template": [
|
||||
"Sarkaz@RoguelikeMapNode-CombatOps.png",
|
||||
"Sarkaz@RoguelikeMapNode-EmergencyOps.png",
|
||||
"Sarkaz@Roguelike@StageDreadfulFoe.png",
|
||||
"Sarkaz@Roguelike@StageDreadfulFoe-5.png",
|
||||
"Sarkaz@RoguelikeMapNode-Encounter.png",
|
||||
"Sarkaz@Roguelike@StageBoons.png",
|
||||
"Sarkaz@Roguelike@StageSafeHouse.png",
|
||||
"Sarkaz@Roguelike@StageSafeHouseCR.png",
|
||||
"Sarkaz@Roguelike@StageSafeHouseHD.png",
|
||||
"Sarkaz@Roguelike@StageGambling.png",
|
||||
"Sarkaz@Roguelike@StageTrader.png",
|
||||
"Sarkaz@Roguelike@StageTraderCR.png",
|
||||
"Sarkaz@Roguelike@StageTraderHD.png",
|
||||
"Sarkaz@Roguelike@StageWindAndRain.png",
|
||||
"Sarkaz@Roguelike@StageEmergencyTransportation.png",
|
||||
"Sarkaz@Roguelike@StageBoskyPassage.png",
|
||||
"Sarkaz@Roguelike@StageProphecy.png",
|
||||
"Sarkaz@Roguelike@StageFilterTruth.png",
|
||||
"Sarkaz@Roguelike@StageFilterTruthCR.png",
|
||||
"Sarkaz@Roguelike@StageFilterTruthHD.png",
|
||||
"Sarkaz@Roguelike@StageConfrontation.png"
|
||||
],
|
||||
"next": ["RoguelikeRoutingAction"]
|
||||
},
|
||||
"Sarkaz@Roguelike@Routing-FastInvestment": {
|
||||
"template": ["Sarkaz@RoguelikeMapNode-CombatOps.png"],
|
||||
"next": ["RoguelikeRoutingAction"]
|
||||
},
|
||||
"Sarkaz@RoguelikeRoutingNodeAnalyze": {
|
||||
"template": [
|
||||
"Sarkaz@RoguelikeMapNode-CombatOps.png",
|
||||
"Sarkaz@RoguelikeMapNode-CombatOpsGrey.png",
|
||||
"Sarkaz@RoguelikeMapNode-EmergencyOps.png",
|
||||
"Sarkaz@RoguelikeMapNode-EmergencyOpsGrey.png",
|
||||
"Sarkaz@RoguelikeMapNode-Encounter.png",
|
||||
"Sarkaz@RoguelikeMapNode-EncounterGrey.png",
|
||||
"Sarkaz@RoguelikeMapNode-RogueTraderGrey.png"
|
||||
],
|
||||
"roi": [246, 60, 288, 575],
|
||||
"postDelay": 300
|
||||
},
|
||||
"Sarkaz@RoguelikeRouting-CombatOps": {
|
||||
"doc": "点击普通战斗节点",
|
||||
"baseTask": "Sarkaz@Roguelike@StageCombatDps",
|
||||
"template": "Sarkaz@Roguelike@StageCombatDps.png",
|
||||
"next": []
|
||||
},
|
||||
"Sarkaz@RoguelikeRouting-RefreshNode": {
|
||||
"roi": [796, 130, 50, 170],
|
||||
"action": "ClickSelf",
|
||||
"next": ["Sarkaz@RoguelikeRouting-ConfirmToRefreshNode"]
|
||||
},
|
||||
"Sarkaz@RoguelikeRouting-ConfirmToRefreshNode": {
|
||||
"algorithm": "OcrDetect",
|
||||
"roi": [993, 472, 53, 26],
|
||||
"text": ["确定"],
|
||||
"action": "ClickSelf",
|
||||
"postDelay": 300,
|
||||
"next": ["Sarkaz@RoguelikeRouting-WaitAfterRefreshNode", "Stop"]
|
||||
},
|
||||
"Sarkaz@RoguelikeRouting-WaitAfterRefreshNode": {
|
||||
"baseTask": "LoadingText",
|
||||
"postDelay": 300,
|
||||
"next": ["#self", "Stop"]
|
||||
},
|
||||
"Sarkaz@RoguelikeRouting-ExitThenContinue": {
|
||||
"template": "Roguelike@ExitThenAbandon.png",
|
||||
"roi": [18, 8, 53, 53],
|
||||
"action": "ClickSelf",
|
||||
"next": ["Sarkaz@RoguelikeRouting-Continue"]
|
||||
},
|
||||
"Sarkaz@RoguelikeRouting-Continue": {
|
||||
"template": "Sarkaz@Roguelike@Continue.png",
|
||||
"roi": [1050, 550, 210, 100],
|
||||
"action": "ClickSelf",
|
||||
"next": ["Sarkaz@RoguelikeRouting-ConfirmToContinue"]
|
||||
},
|
||||
"Sarkaz@RoguelikeRouting-ConfirmToContinue": {
|
||||
"doc": "next 里的 RoguelikeRoutingNodeAnalyze 是为了确保回到地图",
|
||||
"algorithm": "JustReturn",
|
||||
"action": "ClickRect",
|
||||
"specificRect": [50, 360, 0, 0],
|
||||
"next": ["Sarkaz@RoguelikeRoutingNodeAnalyze", "#self"]
|
||||
},
|
||||
"Sarkaz@RoguelikeRoutingAction-ExitThenAbandon": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["Sarkaz@Roguelike@ExitThenAbandon"]
|
||||
},
|
||||
"Sarkaz@RoguelikeRoutingAction-StageEncounterEnter": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["Sarkaz@Roguelike@StageEncounterEnter"]
|
||||
},
|
||||
"Sarkaz@RoguelikeRoutingAction-StageTraderEnter": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["Sarkaz@Roguelike@StageTraderEnter"]
|
||||
},
|
||||
"JieGarden@Roguelike@Routing-FastPass": {
|
||||
"template": [
|
||||
"JieGarden@RoguelikeMapNode-CombatOps.png",
|
||||
"JieGarden@RoguelikeMapNode-EmergencyOps.png",
|
||||
"JieGarden@RoguelikeMapNode-Encounter.png",
|
||||
"JieGarden@RoguelikeMapNode-Boons.png",
|
||||
"JieGarden@RoguelikeMapNode-RogueTrader.png",
|
||||
"JieGarden@RoguelikeMapNode-BoskyPassage.png"
|
||||
],
|
||||
"next": ["RoguelikeRoutingAction"]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingNodeAnalyze": {
|
||||
"template": [
|
||||
"JieGarden@RoguelikeMapNode-CombatOps.png",
|
||||
"JieGarden@RoguelikeMapNode-CombatOpsGrey.png",
|
||||
"JieGarden@RoguelikeMapNode-EmergencyOps.png",
|
||||
"JieGarden@RoguelikeMapNode-EmergencyOpsGrey.png",
|
||||
"JieGarden@RoguelikeMapNode-Encounter.png",
|
||||
"JieGarden@RoguelikeMapNode-EncounterGrey.png",
|
||||
"JieGarden@RoguelikeMapNode-Boons.png",
|
||||
"JieGarden@RoguelikeMapNode-BoonsGrey.png",
|
||||
"JieGarden@RoguelikeMapNode-RogueTrader.png",
|
||||
"JieGarden@RoguelikeMapNode-RogueTraderGrey.png",
|
||||
"JieGarden@RoguelikeMapNode-BoskyPassage.png",
|
||||
"JieGarden@RoguelikeMapNode-BoskyPassageGrey.png"
|
||||
],
|
||||
"roi": [0, 60, 1280, 575],
|
||||
"postDelay": 300
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingAction-ExitThenAbandon": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@ExitThenAbandon"]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingAction-StageCombatOpsEnterThenLeave": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageCombatOpsEnterThenLeave"]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingConfig_BoskyPassage": {
|
||||
"algorithm": "JustReturn",
|
||||
"doc": [
|
||||
"RoguelikeBoskyPassageRoutingTaskPlugin用参数",
|
||||
"| specialParams[0]: 第一列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[1]: 第一行节点的默认纵坐标 (Rect.y)",
|
||||
"| specialParams[2]: 中间列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[3]: 中间行节点的默认纵坐标 (Rect.y)",
|
||||
"| specialParams[4]: 最后列节点的默认横坐标 (Rect.x)",
|
||||
"| specialParams[5]: 最后行节点的默认纵坐标 (Rect.y)",
|
||||
"| specialParams[6]: 节点 Rect.width",
|
||||
"| specialParams[7]: 节点 Rect.height",
|
||||
"| specialParams[8]: 两列节点之间的距离",
|
||||
"| specialParams[9]: 两行节点之间的距离",
|
||||
"| specialParams[10]: roi 的 margin offset"
|
||||
],
|
||||
"specialParams": [188, 107, 608, 321, 1028, 535, 64, 57, 140, 107, 15]
|
||||
},
|
||||
"JieGarden@Roguelike@Routing_BoskyPassage": {
|
||||
"template": [
|
||||
"JieGarden@RoguelikeMapNode-OldShop.png",
|
||||
"JieGarden@RoguelikeMapNode-Scheme.png",
|
||||
"JieGarden@RoguelikeMapNode-YiTrader.png",
|
||||
"JieGarden@RoguelikeMapNode-Playtime.png",
|
||||
"JieGarden@RoguelikeMapNode-Omissions.png",
|
||||
"JieGarden@RoguelikeMapNode-Legend.png",
|
||||
"JieGarden@RoguelikeMapNode-Doubts.png",
|
||||
"JieGarden@RoguelikeMapNode-Disaster.png"
|
||||
],
|
||||
"next": ["RoguelikeRoutingAction"]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingNodeAnalyze_BoskyPassage": {
|
||||
"template": [
|
||||
"JieGarden@RoguelikeMapNode-OldShop.png",
|
||||
"JieGarden@RoguelikeMapNode-Scheme.png",
|
||||
"JieGarden@RoguelikeMapNode-YiTrader.png",
|
||||
"JieGarden@RoguelikeMapNode-Playtime.png",
|
||||
"JieGarden@RoguelikeMapNode-Omissions.png",
|
||||
"JieGarden@RoguelikeMapNode-OmissionsGrey.png",
|
||||
"JieGarden@RoguelikeMapNode-Legend.png",
|
||||
"JieGarden@RoguelikeMapNode-LegendGrey.png",
|
||||
"JieGarden@RoguelikeMapNode-Doubts.png",
|
||||
"JieGarden@RoguelikeMapNode-DoubtsGrey.png",
|
||||
"JieGarden@RoguelikeMapNode-Disaster.png",
|
||||
"JieGarden@RoguelikeMapNode-DisasterGrey.png"
|
||||
],
|
||||
"roi": [0, 60, 1280, 575],
|
||||
"postDelay": 300
|
||||
},
|
||||
"JieGarden@RoguelikeRouting-BoskyPassagePriority_Default": {
|
||||
"doc": [
|
||||
"界园树洞节点优先级策略配置",
|
||||
"按优先级从高到低排列节点类型名称",
|
||||
"拾遗>传说>故肆>易与>筹谋>常乐>杂疑(暂时取消)>灾祸(暂时取消)"
|
||||
],
|
||||
"template": [
|
||||
"JieGarden@RoguelikeMapNode-Omissions.png",
|
||||
"JieGarden@RoguelikeMapNode-Legend.png",
|
||||
"JieGarden@RoguelikeMapNode-OldShop.png",
|
||||
"JieGarden@RoguelikeMapNode-YiTrader.png",
|
||||
"JieGarden@RoguelikeMapNode-Scheme.png",
|
||||
"JieGarden@RoguelikeMapNode-Playtime.png"
|
||||
]
|
||||
},
|
||||
"JieGarden@RoguelikeRouting-BoskyPassagePriority_FindPlaytime": {
|
||||
"doc": ["常乐>拾遗>传说>故肆>易与>筹谋>杂疑(暂时取消)>灾祸(暂时取消)"],
|
||||
"template": [
|
||||
"JieGarden@RoguelikeMapNode-Playtime.png",
|
||||
"JieGarden@RoguelikeMapNode-Omissions.png",
|
||||
"JieGarden@RoguelikeMapNode-Legend.png",
|
||||
"JieGarden@RoguelikeMapNode-OldShop.png",
|
||||
"JieGarden@RoguelikeMapNode-YiTrader.png",
|
||||
"JieGarden@RoguelikeMapNode-Scheme.png"
|
||||
]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingAction-LeaveBoskyPassage": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@Stages_leaveBoskyPassage#next"]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingAction-StageLegendEnter": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageEncounterEnter"]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingAction-StageOmissionsEnter": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageEncounterEnter"]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingAction-StageDoubtsEnter": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageEncounterEnter"]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingAction-StageDisasterEnter": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageCombatDpsEnter"]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingAction-StagePlaytimeEnter": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageEncounterEnter"]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingAction-StageOldShopEnter": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageEncounterEnter"]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingAction-StageYiTraderEnter": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageYiTraderEnter"]
|
||||
},
|
||||
"JieGarden@RoguelikeRoutingAction-StageSchemeEnter": {
|
||||
"algorithm": "JustReturn",
|
||||
"next": ["JieGarden@Roguelike@StageEncounterEnter"]
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 721 B After Width: | Height: | Size: 1022 B |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
@@ -11,8 +11,7 @@ bool asst::RoguelikeBoskyPassageRoutingTaskPlugin::load_params([[maybe_unused]]
|
||||
{
|
||||
if (m_config->get_theme() == RoguelikeTheme::JieGarden) {
|
||||
// ———————— 加载 BoskyPassage 配置 ————————
|
||||
const std::shared_ptr<MatchTaskInfo> bosky_config =
|
||||
Task.get<MatchTaskInfo>("JieGarden@Roguelike@RoutingBoskyPassageConfig");
|
||||
const TaskPtr bosky_config = Task.get("JieGarden@RoguelikeRoutingConfig_BoskyPassage");
|
||||
m_bosky_config = bosky_config->special_params;
|
||||
|
||||
// ———————— 选择导航策略 ————————
|
||||
@@ -106,7 +105,7 @@ void asst::RoguelikeBoskyPassageRoutingTaskPlugin::bosky_update_map()
|
||||
}
|
||||
|
||||
MultiMatcher node_analyzer(image);
|
||||
node_analyzer.set_task_info("JieGarden@Roguelike@RoutingBoskyPassageNodeAnalyze");
|
||||
node_analyzer.set_task_info("JieGarden@RoguelikeRoutingNodeAnalyze_BoskyPassage");
|
||||
if (!node_analyzer.analyze()) {
|
||||
Log.error(__FUNCTION__, "| no nodes are recognised");
|
||||
return;
|
||||
@@ -199,9 +198,7 @@ void asst::RoguelikeBoskyPassageRoutingTaskPlugin::bosky_decide_and_click(
|
||||
|
||||
if (!found) {
|
||||
Log.info(__FUNCTION__, "| no open unvisited nodes available");
|
||||
Task.set_task_base(
|
||||
"JieGarden@Roguelike@RoutingAction",
|
||||
"JieGarden@Roguelike@RoutingAction-ClickRemainingCandleFlame");
|
||||
Task.set_task_base("RoguelikeRoutingAction", "JieGarden@RoguelikeRoutingAction-LeaveBoskyPassage");
|
||||
return;
|
||||
}
|
||||
int gx = RoguelikeBoskyPassageMap::get_instance().get_node_x(chosen);
|
||||
@@ -239,9 +236,9 @@ void asst::RoguelikeBoskyPassageRoutingTaskPlugin::bosky_decide_and_click(
|
||||
const std::string& theme = m_config->get_theme();
|
||||
std::string node_name = type2name(node_type);
|
||||
|
||||
const std::string node_task_name = theme + "@Roguelike@MapNode" + node_name;
|
||||
const std::string node_task_name = theme + "@RoguelikeRoutingAction-Stage" + node_name + "Enter";
|
||||
// 设置 next
|
||||
Task.set_task_base("JieGarden@Roguelike@RoutingAction", node_task_name);
|
||||
Task.set_task_base("RoguelikeRoutingAction", node_task_name);
|
||||
}
|
||||
|
||||
std::vector<asst::RoguelikeNodeType>
|
||||
@@ -250,44 +247,26 @@ std::vector<asst::RoguelikeNodeType>
|
||||
LogTraceFunction;
|
||||
|
||||
const std::string& theme = m_config->get_theme();
|
||||
const std::string config_name = theme + "@Roguelike@RoutingBoskyPassagePriority_" + strategy;
|
||||
const std::string config_name = theme + "@RoguelikeRouting-BoskyPassagePriority_" + strategy;
|
||||
|
||||
auto task_info = Task.get(config_name);
|
||||
const auto& task_info = Task.get<MatchTaskInfo>(config_name);
|
||||
if (!task_info) {
|
||||
Log.error(__FUNCTION__, "| priority config not found:", config_name);
|
||||
return {};
|
||||
}
|
||||
|
||||
// 从 next 字段中读取优先级配置
|
||||
const auto& next_tasks = task_info->next;
|
||||
if (next_tasks.empty()) {
|
||||
const auto& template_list = task_info->templ_names;
|
||||
if (template_list.empty()) {
|
||||
Log.warn(__FUNCTION__, "| Priority config is empty in:", config_name);
|
||||
return {};
|
||||
}
|
||||
|
||||
// 从任务名称中解析节点类型
|
||||
std::vector<RoguelikeNodeType> priority_order;
|
||||
priority_order.reserve(next_tasks.size());
|
||||
|
||||
for (const std::string& task_name : next_tasks) {
|
||||
// 解析类似 "JieGarden@Roguelike@MapNodeYiTrader" 这样的任务名 -> "YiTrader"
|
||||
constexpr std::string_view map_node_prefix = "MapNode";
|
||||
const size_t pos = task_name.rfind(map_node_prefix);
|
||||
if (pos == std::string::npos) {
|
||||
Log.warn(__FUNCTION__, "| Invalid task name in priority config:", task_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
const std::string node_name = task_name.substr(pos + map_node_prefix.length());
|
||||
RoguelikeNodeType node_type = name2type(node_name);
|
||||
if (node_type != RoguelikeNodeType::Unknown) {
|
||||
priority_order.push_back(node_type);
|
||||
Log.debug(__FUNCTION__, "| Added priority node type:", type2name(node_type), "from task:", task_name);
|
||||
}
|
||||
else {
|
||||
Log.warn(__FUNCTION__, "| Failed to parse node type from task:", task_name);
|
||||
}
|
||||
}
|
||||
auto priority_order_view = template_list | std::views::transform([&](const std::string& templ_name) {
|
||||
return RoguelikeMapInfo.templ2type(theme, templ_name);
|
||||
});
|
||||
std::vector<RoguelikeNodeType> priority_order(priority_order_view.begin(), priority_order_view.end());
|
||||
|
||||
Log.info(__FUNCTION__, "| Loaded", priority_order.size(), "node types from priority config");
|
||||
return priority_order;
|
||||
|
||||
@@ -22,23 +22,28 @@ bool asst::RoguelikeRoutingTaskPlugin::load_params([[maybe_unused]] const json::
|
||||
return false;
|
||||
}
|
||||
|
||||
const std::shared_ptr<MatchTaskInfo> config = Task.get<MatchTaskInfo>(theme + "@Roguelike@RoutingConfig");
|
||||
const TaskPtr config_task = Task.get("RoguelikeRoutingConfig");
|
||||
|
||||
m_origin_x = config->special_params.at(0);
|
||||
m_middle_x = config->special_params.at(1);
|
||||
m_last_x = config->special_params.at(2);
|
||||
m_node_width = config->special_params.at(3);
|
||||
m_node_height = config->special_params.at(4);
|
||||
m_column_offset = config->special_params.at(5);
|
||||
m_nameplate_offset = config->special_params.at(6);
|
||||
m_roi_margin = config->special_params.at(7);
|
||||
m_direction_threshold = config->special_params.at(8);
|
||||
m_origin_x = config_task->special_params.at(0);
|
||||
m_middle_x = config_task->special_params.at(1);
|
||||
m_last_x = config_task->special_params.at(2);
|
||||
m_node_width = config_task->special_params.at(3);
|
||||
m_node_height = config_task->special_params.at(4);
|
||||
m_column_offset = config_task->special_params.at(5);
|
||||
m_nameplate_offset = config_task->special_params.at(6);
|
||||
m_roi_margin = config_task->special_params.at(7);
|
||||
m_direction_threshold = config_task->special_params.at(8);
|
||||
|
||||
const RoguelikeMode& mode = m_config->get_mode();
|
||||
const std::string squad = params.get("squad", "");
|
||||
|
||||
if (theme == RoguelikeTheme::Sarkaz && mode == RoguelikeMode::FastPass && squad == "蓝图测绘分队") {
|
||||
m_routing_strategy = RoutingStrategy::Sarkaz_FastPass;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (theme == RoguelikeTheme::Sarkaz && mode == RoguelikeMode::Investment && squad == "点刺成锭分队") {
|
||||
m_routing_strategy = RoutingStrategy::FastInvestment_Sarkaz;
|
||||
m_routing_strategy = RoutingStrategy::Sarkaz_FastInvestment;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -46,16 +51,11 @@ bool asst::RoguelikeRoutingTaskPlugin::load_params([[maybe_unused]] const json::
|
||||
if (((mode == RoguelikeMode::Investment && squad == "指挥分队") ||
|
||||
(mode == RoguelikeMode::Collectible && params.get("collectible_mode_squad", squad) == "指挥分队")) &&
|
||||
m_config->get_difficulty() >= 3) {
|
||||
m_routing_strategy = RoutingStrategy::FastInvestment_JieGarden;
|
||||
m_routing_strategy = RoutingStrategy::JieGarden_FastPassWithBattle;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == RoguelikeMode::FastPass && squad == "蓝图测绘分队") {
|
||||
m_routing_strategy = RoutingStrategy::FastPass;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -92,22 +92,92 @@ bool asst::RoguelikeRoutingTaskPlugin::_run()
|
||||
LogTraceFunction;
|
||||
|
||||
switch (m_routing_strategy) {
|
||||
case RoutingStrategy::FastInvestment_Sarkaz:
|
||||
case RoutingStrategy::Sarkaz_FastInvestment:
|
||||
if (m_need_generate_map) {
|
||||
// 随机点击一个第一列的节点,先随便写写,垃圾代码迟早要重构
|
||||
ProcessTask(*this, { "Sarkaz@Roguelike@Routing-CombatOps" }).run();
|
||||
ProcessTask(*this, { "Sarkaz@RoguelikeRouting-CombatOps" }).run();
|
||||
// 刷新节点
|
||||
ProcessTask(*this, { m_config->get_theme() + "@Roguelike@RoutingRefreshNode" }).run();
|
||||
ProcessTask(*this, { "Sarkaz@RoguelikeRouting-RefreshNode" }).run();
|
||||
// 不识别了,进商店,Go!
|
||||
Task.set_task_base("Sarkaz@Roguelike@RoutingAction", "Sarkaz@Roguelike@RoutingAction-StageTraderEnter");
|
||||
Task.set_task_base("RoguelikeRoutingAction", "Sarkaz@RoguelikeRoutingAction-StageTraderEnter");
|
||||
// 偷懒,直接用 m_need_generate_map 判断是否已进过商店
|
||||
m_need_generate_map = false;
|
||||
}
|
||||
else {
|
||||
Task.set_task_base("Sarkaz@Roguelike@RoutingAction", "Sarkaz@Roguelike@RoutingAction-ExitThenAbandon");
|
||||
Task.set_task_base("RoguelikeRoutingAction", "Sarkaz@RoguelikeRoutingAction-ExitThenAbandon");
|
||||
}
|
||||
break;
|
||||
case RoutingStrategy::FastInvestment_JieGarden:
|
||||
case RoutingStrategy::JieGarden_FastPassWithBattle:
|
||||
if (m_need_generate_map) {
|
||||
// 向左滑动以检视前三列节点
|
||||
ProcessTask(*this, { "RoguelikeRouting-MoveRightToPeek" }).run();
|
||||
cv::Mat image = ctrler()->get_image();
|
||||
cv::Mat image_draw = image.clone();
|
||||
update_map(image, RoguelikeMap::INIT_INDEX + 1, image_draw);
|
||||
#ifdef ASST_DEBUG
|
||||
const std::filesystem::path& relative_dir = utils::path("debug") / utils::path("roguelikeMap");
|
||||
const auto relative_path = relative_dir / (std::format("{}_draw.png", utils::format_now_for_filename()));
|
||||
Log.trace("Save image", relative_path);
|
||||
asst::imwrite(relative_path, image_draw);
|
||||
#endif
|
||||
m_need_generate_map = false;
|
||||
|
||||
// 根据第三列节点类型更新导航策略
|
||||
const size_t sample_node_of_last_column = m_map.size() - 1;
|
||||
const RoguelikeNodeType sample_node_type = m_map.get_node_type(sample_node_of_last_column);
|
||||
Log.info("RoguelikeRouting | Type of last node:", type2name(sample_node_type));
|
||||
if (sample_node_type == RoguelikeNodeType::RogueTrader) {
|
||||
m_routing_strategy = RoutingStrategy::JieGarden_FastPassWithoutBattle;
|
||||
m_config->set_skip_recruit_in_fast_pass(true);
|
||||
return _run();
|
||||
}
|
||||
}
|
||||
if (m_map.get_curr_pos() == RoguelikeMap::INIT_INDEX) {
|
||||
// 规划路线
|
||||
m_map.set_cost_fun([&](const RoguelikeNodePtr& node) {
|
||||
if (node->type == RoguelikeNodeType::CombatOps) {
|
||||
return 10;
|
||||
}
|
||||
if (node->type == RoguelikeNodeType::EmergencyOps || node->type == RoguelikeNodeType::DreadfulFoe) {
|
||||
return 11;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
m_map.update_node_costs();
|
||||
const size_t next_node = m_map.get_next_node();
|
||||
|
||||
// 若无法避免超过三场战斗则重开
|
||||
if (m_map.get_node_cost(next_node) >= 30) {
|
||||
callback(
|
||||
AsstMsg::TaskChainExtraInfo,
|
||||
json::object {
|
||||
{ "what", "RoutingRestart" },
|
||||
{ "why", "TooManyBattlesAhead" },
|
||||
{ "node_cost", m_map.get_node_cost(next_node) },
|
||||
});
|
||||
|
||||
Task.set_task_base("RoguelikeRoutingAction", "JieGarden@RoguelikeRoutingAction-ExitThenAbandon");
|
||||
}
|
||||
else {
|
||||
const int next_node_x = m_left_most_column_x_in_view;
|
||||
const int next_node_y = m_map.get_node_y(next_node);
|
||||
Point next_node_center = Point(next_node_x + m_node_width / 2, next_node_y + m_node_height / 2);
|
||||
ctrler()->click(next_node_center);
|
||||
sleep(200);
|
||||
|
||||
Task.set_task_base(
|
||||
"RoguelikeRoutingAction",
|
||||
"JieGarden@RoguelikeRoutingAction-StageCombatOpsEnterThenLeave");
|
||||
m_map.set_curr_pos(next_node);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// 执行默认的避战策略
|
||||
Task.set_task_base("RoguelikeRoutingAction", "JieGarden@Roguelike@Stages_default");
|
||||
}
|
||||
break;
|
||||
|
||||
case RoutingStrategy::JieGarden_FastPassWithoutBattle:
|
||||
if (m_need_generate_map) {
|
||||
cv::Mat image = ctrler()->get_image();
|
||||
cv::Mat image_draw = image.clone();
|
||||
@@ -141,30 +211,27 @@ bool asst::RoguelikeRoutingTaskPlugin::_run()
|
||||
{ "node_cost", m_map.get_node_cost(next_node) },
|
||||
});
|
||||
|
||||
Task.set_task_base(
|
||||
"JieGarden@Roguelike@RoutingAction",
|
||||
"JieGarden@Roguelike@RoutingAction-ExitThenAbandon");
|
||||
reset_in_run_variables();
|
||||
Task.set_task_base("RoguelikeRoutingAction", "JieGarden@RoguelikeRoutingAction-ExitThenAbandon");
|
||||
}
|
||||
else {
|
||||
const int next_node_x = m_origin_x;
|
||||
const int next_node_x = m_left_most_column_x_in_view;
|
||||
const int next_node_y = m_map.get_node_y(next_node);
|
||||
Point next_node_center = Point(next_node_x + m_node_width / 2, next_node_y + m_node_height / 2);
|
||||
ctrler()->click(next_node_center);
|
||||
sleep(200);
|
||||
|
||||
Task.set_task_base(
|
||||
"JieGarden@Roguelike@RoutingAction",
|
||||
"JieGarden@Roguelike@RoutingAction-StageCombatOpsEnterThenLeave");
|
||||
"RoguelikeRoutingAction",
|
||||
"JieGarden@RoguelikeRoutingAction-StageCombatOpsEnterThenLeave");
|
||||
m_map.set_curr_pos(next_node);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// 执行默认的避战策略
|
||||
Task.set_task_base("JieGarden@Roguelike@RoutingAction", "JieGarden@Roguelike@Stages_default");
|
||||
Task.set_task_base("RoguelikeRoutingAction", "JieGarden@Roguelike@Stages_default");
|
||||
}
|
||||
break;
|
||||
case RoutingStrategy::FastPass:
|
||||
case RoutingStrategy::Sarkaz_FastPass:
|
||||
if (m_need_generate_map) {
|
||||
generate_map();
|
||||
m_need_generate_map = false;
|
||||
@@ -202,13 +269,14 @@ bool asst::RoguelikeRoutingTaskPlugin::update_map(
|
||||
int curr_x = -m_node_width - 1; // 第一列节点将触发 rect.x >= curr_x + m_node_width 并更新 curr_col 与 curr_x
|
||||
|
||||
MultiMatcher node_analyzer(image);
|
||||
node_analyzer.set_task_info(theme + "@Roguelike@RoutingNodeAnalyze");
|
||||
node_analyzer.set_task_info(theme + "@RoguelikeRoutingNodeAnalyze");
|
||||
if (!node_analyzer.analyze()) {
|
||||
Log.error(__FUNCTION__, "| no nodes are recognised");
|
||||
return false;
|
||||
}
|
||||
MultiMatcher::ResultsVec match_results = node_analyzer.get_result();
|
||||
sort_by_vertical_(match_results); // 按照水平方向从左到右排序各列节点,同一列节点按照垂直方向从上到下排序
|
||||
m_left_most_column_x_in_view = match_results.front().rect.x;
|
||||
|
||||
const size_t old_num_columns = m_map.get_num_columns();
|
||||
for (const auto& [rect, score, templ_name] : match_results) {
|
||||
@@ -247,12 +315,12 @@ void asst::RoguelikeRoutingTaskPlugin::generate_map()
|
||||
|
||||
m_map.reset();
|
||||
size_t curr_col = RoguelikeMap::INIT_INDEX + 1;
|
||||
Rect roi = Task.get<MatchTaskInfo>(theme + "@Roguelike@RoutingNodeAnalyze")->roi;
|
||||
Rect roi = Task.get<MatchTaskInfo>(theme + "@RoguelikeRoutingNodeAnalyze")->roi;
|
||||
|
||||
// 第一列节点
|
||||
cv::Mat image = ctrler()->get_image();
|
||||
MultiMatcher node_analyzer(image);
|
||||
node_analyzer.set_task_info(theme + "@Roguelike@RoutingNodeAnalyze");
|
||||
node_analyzer.set_task_info(theme + "@RoguelikeRoutingNodeAnalyze");
|
||||
if (!node_analyzer.analyze()) {
|
||||
Log.error(__FUNCTION__, "| no nodes found in the first column");
|
||||
return;
|
||||
@@ -277,13 +345,13 @@ void asst::RoguelikeRoutingTaskPlugin::generate_map()
|
||||
const size_t node = m_map.create_and_insert_node(type, curr_col, rect.y).value();
|
||||
generate_edges(node, image, rect.x);
|
||||
}
|
||||
ProcessTask(*this, { theme + "@Roguelike@RoutingSwipeRight" }).run();
|
||||
ProcessTask(*this, { "RoguelikeRouting-MoveRight" }).run();
|
||||
sleep(200);
|
||||
image = ctrler()->get_image();
|
||||
node_analyzer.set_image(image);
|
||||
}
|
||||
|
||||
ProcessTask(*this, { theme + "@Roguelike@RoutingExitThenContinue" }).run(); // 通过退出重进回到初始位置
|
||||
ProcessTask(*this, { theme + "@RoguelikeRouting-ExitThenContinue" }).run(); // 通过退出重进回到初始位置
|
||||
}
|
||||
|
||||
void asst::RoguelikeRoutingTaskPlugin::generate_edges(
|
||||
@@ -436,12 +504,12 @@ void asst::RoguelikeRoutingTaskPlugin::refresh_following_combat_nodes()
|
||||
sleep(200);
|
||||
|
||||
// 刷新节点
|
||||
ProcessTask(*this, { m_config->get_theme() + "@Roguelike@RoutingRefreshNode" }).run();
|
||||
ProcessTask(*this, { m_config->get_theme() + "@RoguelikeRouting-RefreshNode" }).run();
|
||||
m_map.set_node_refresh_times(next_node, m_map.get_node_refresh_times(next_node) + 1);
|
||||
|
||||
// 识别并更新节点类型
|
||||
Matcher node_analyzer(ctrler()->get_image());
|
||||
node_analyzer.set_task_info(theme + "@Roguelike@RoutingNodeAnalyze");
|
||||
node_analyzer.set_task_info(theme + "@RoguelikeRoutingNodeAnalyze");
|
||||
node_analyzer.set_roi(next_node_rect);
|
||||
if (node_analyzer.analyze()) {
|
||||
const Matcher::Result& match_results = node_analyzer.get_result();
|
||||
@@ -478,7 +546,7 @@ void asst::RoguelikeRoutingTaskPlugin::navigate_route()
|
||||
const size_t next_node = m_map.get_next_node();
|
||||
|
||||
if (m_map.get_node_cost(next_node) >= 1000) {
|
||||
Task.set_task_base("Sarkaz@Roguelike@RoutingAction", "Sarkaz@Roguelike@RoutingAction-ExitThenAbandon");
|
||||
Task.set_task_base("RoguelikeRoutingAction", "Sarkaz@RoguelikeRoutingAction-ExitThenAbandon");
|
||||
reset_in_run_variables();
|
||||
return;
|
||||
}
|
||||
@@ -491,15 +559,15 @@ void asst::RoguelikeRoutingTaskPlugin::navigate_route()
|
||||
sleep(200);
|
||||
|
||||
if (m_map.get_node_type(next_node) == RoguelikeNodeType::Encounter) {
|
||||
Task.set_task_base("Sarkaz@Roguelike@RoutingAction", "Sarkaz@Roguelike@RoutingAction-StageEncounterEnter");
|
||||
Task.set_task_base("RoguelikeRoutingAction", "Sarkaz@RoguelikeRoutingAction-StageEncounterEnter");
|
||||
m_map.set_curr_pos(next_node);
|
||||
}
|
||||
else if (m_map.get_node_type(next_node) == RoguelikeNodeType::RogueTrader) {
|
||||
Task.set_task_base("Sarkaz@Roguelike@RoutingAction", "Sarkaz@Roguelike@RoutingAction-StageTraderEnter");
|
||||
Task.set_task_base("RoguelikeRoutingAction", "Sarkaz@RoguelikeRoutingAction-StageTraderEnter");
|
||||
reset_in_run_variables();
|
||||
}
|
||||
else {
|
||||
Task.set_task_base("Sarkaz@Roguelike@RoutingAction", "Sarkaz@Roguelike@RoutingAction-ExitThenAbandon");
|
||||
Task.set_task_base("RoguelikeRoutingAction", "Sarkaz@RoguelikeRoutingAction-ExitThenAbandon");
|
||||
reset_in_run_variables();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,9 +19,10 @@ public:
|
||||
enum class RoutingStrategy
|
||||
{
|
||||
None,
|
||||
FastInvestment_Sarkaz,
|
||||
FastInvestment_JieGarden,
|
||||
FastPass,
|
||||
Sarkaz_FastPass, // 实验模式,暂未开放给用户
|
||||
Sarkaz_FastInvestment, // 点刺成锭分队快速投资
|
||||
JieGarden_FastPassWithBattle, // 指挥分队一战快速投资/烧水
|
||||
JieGarden_FastPassWithoutBattle, // 指挥分队无战快速投资/烧水
|
||||
};
|
||||
|
||||
protected:
|
||||
@@ -57,6 +58,8 @@ private:
|
||||
void navigate_route();
|
||||
void update_selected_x();
|
||||
|
||||
inline static std::function<std::string(RoguelikeNodeType)> type2name = &RoguelikeMapConfig::type2name;
|
||||
|
||||
// ———————— constants and variables ———————————————————————————————————————————————
|
||||
RoutingStrategy m_routing_strategy = RoutingStrategy::None;
|
||||
RoguelikeMap m_map;
|
||||
@@ -73,5 +76,8 @@ private:
|
||||
int m_nameplate_offset = 0; // 节点 Rect 下边缘到节点铭牌下边缘的距离
|
||||
int m_roi_margin = 0; // roi 的 margin offset
|
||||
int m_direction_threshold = 0; // 节点间连线方向判定的阈值
|
||||
|
||||
// view-related
|
||||
int m_left_most_column_x_in_view = 0;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ bool asst::RoguelikeConfig::verify_and_load_params(const json::value& params)
|
||||
if (m_theme == "JieGarden") {
|
||||
if (m_mode == RoguelikeMode::Investment && params.get("squad", "") == "指挥分队" && m_difficulty >= 3) {
|
||||
// 启用特殊策略,联动 RoguelikeRoutingTaskPlugin
|
||||
Task.set_task_base(strategy_task, "JieGarden@Roguelike@StrategyChange-FastInvestment");
|
||||
Task.set_task_base(strategy_task, "JieGarden@Roguelike@StrategyChange_mode1-FastPass");
|
||||
}
|
||||
if (m_mode == RoguelikeMode::Collectible &&
|
||||
params.get("collectible_mode_squad", params.get("squad", "")) == "指挥分队" && m_difficulty >= 3) {
|
||||
|
||||
@@ -129,6 +129,10 @@ public:
|
||||
|
||||
bool get_run_for_collectible() const { return m_run_for_collectible; }
|
||||
|
||||
void set_skip_recruit_in_fast_pass(const bool value) { m_skip_recruit_in_fast_pass = value; }
|
||||
|
||||
bool get_skip_recruit_in_fast_pass() const { return m_skip_recruit_in_fast_pass; }
|
||||
|
||||
// ------------------ 投资模式 ------------------
|
||||
void set_invest_with_more_score(bool value) { m_invest_with_more_score = value; }
|
||||
|
||||
@@ -153,6 +157,7 @@ private:
|
||||
bool m_start_with_elite_two = false; // 在刷开局模式下凹开局干员精二直升
|
||||
bool m_only_start_with_elite_two = false; // 只凹开局干员精二直升且不进行作战
|
||||
bool m_run_for_collectible = false; // 用于 RoguelikeMode::Collectible,判断是否正在烧水
|
||||
bool m_skip_recruit_in_fast_pass = false; // 是否可以在特定情况下跳过招募,是否真的跳过招募需要结合其他条件来判断
|
||||
|
||||
// ------------------ 投资模式 ------------------
|
||||
bool m_invest_with_more_score = false; // 投资时招募、购物刷分
|
||||
|
||||
@@ -96,8 +96,10 @@ bool asst::RoguelikeRecruitTaskPlugin::_run()
|
||||
if (theme == RoguelikeTheme::JieGarden && squad == "指挥分队" && difficulty >= 3) {
|
||||
if (mode == RoguelikeMode::Investment ||
|
||||
(mode == RoguelikeMode::Collectible && m_config->get_run_for_collectible())) {
|
||||
ProcessTask(*this, { "JieGarden@RoguelikeRecruit-GiveUp" }).run();
|
||||
return true;
|
||||
if (m_config->get_skip_recruit_in_fast_pass()) {
|
||||
ProcessTask(*this, { "JieGarden@RoguelikeRecruit-GiveUp" }).run();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||