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>
This commit is contained in:
Weiyou Wang
2025-10-19 22:49:08 +11:00
committed by GitHub
parent 930de73324
commit 5efdab7fbf
58 changed files with 507 additions and 530 deletions

View File

@@ -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"]

View File

@@ -0,0 +1,6 @@
{
"Sarkaz@RoguelikeRouting-ConfirmToRefreshNode": {
"roi": [993, 472, 90, 34],
"text": ["Confirm"]
}
}

View File

@@ -17,9 +17,6 @@
"ocrReplace": [["虚[構横]の境[目E=]?", "虚構の境"]],
"text": ["溶魂の端緒", "錬鉄の根系", "灰燼の迷城", "蓋然の異域", "虚構の境", "輝ける天上", "奇妙な断章"]
},
"Sarkaz@Roguelike@RoutingRefreshNodeConfirm": {
"text": ["確定"]
},
"Sarkaz@Roguelike@SelectTheme": {
"text": ["仮説集"]
},

View File

@@ -0,0 +1,5 @@
{
"Sarkaz@RoguelikeRouting-ConfirmToRefreshNode": {
"text": ["確定"]
}
}

View File

@@ -36,9 +36,6 @@
"괴이한단장"
]
},
"Sarkaz@Roguelike@RoutingRefreshNodeConfirm": {
"text": ["확인"]
},
"Sarkaz@Roguelike@SelectTheme": {
"text": ["가설", "수록"]
},

View File

@@ -0,0 +1,5 @@
{
"Sarkaz@RoguelikeRouting-ConfirmToRefreshNode": {
"text": ["확인"]
}
}

View File

@@ -17,9 +17,6 @@
"Sarkaz@Roguelike@NextLevel": {
"text": ["熔魂之始", "鍛鐵根須", "灰鑄迷城", "或然歧域", "虛實疆界", "輝光天頂", "詭譎斷章"]
},
"Sarkaz@Roguelike@RoutingRefreshNodeConfirm": {
"text": ["確定"]
},
"Sarkaz@Roguelike@SelectTheme": {
"text": ["假說輯錄", "假說", "輯錄"]
},

View File

@@ -0,0 +1,5 @@
{
"Sarkaz@RoguelikeRouting-ConfirmToRefreshNode": {
"text": ["確定"]
}
}

View File

@@ -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"]
}
]
}

View File

@@ -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"]
}
]
}

View File

@@ -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": {}
}

View File

@@ -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": {}
}

View File

@@ -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",

View 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"]
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

After

Width:  |  Height:  |  Size: 1022 B

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -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;

View File

@@ -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();
}
}

View File

@@ -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;
};
}

View File

@@ -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) {

View File

@@ -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; // 投资时招募、购物刷分

View File

@@ -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;
}
}
}