From 2ebaa0a97871444cbcd831f25d96cdcc911ff957 Mon Sep 17 00:00:00 2001 From: status102 <102887808+status102@users.noreply.github.com> Date: Sun, 21 Jul 2024 15:46:18 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=82=89=E9=B8=BD?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E9=87=8D=E5=A4=8D=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaCore/Task/Interface/RoguelikeTask.cpp | 208 +++++++++--------- src/MaaCore/Task/Interface/RoguelikeTask.h | 9 +- src/MaaCore/Task/Roguelike/RoguelikeConfig.h | 2 +- .../RoguelikeStageEncounterTaskPlugin.cpp | 8 +- .../RoguelikeStageEncounterTaskPlugin.h | 2 +- .../RoguelikeCollapsalParadigmTaskPlugin.cpp | 35 ++- .../RoguelikeCollapsalParadigmTaskPlugin.h | 31 +-- .../Sami/RoguelikeFoldartalUseTaskPlugin.cpp | 10 + .../Sami/RoguelikeFoldartalUseTaskPlugin.h | 13 +- 9 files changed, 170 insertions(+), 148 deletions(-) diff --git a/src/MaaCore/Task/Interface/RoguelikeTask.cpp b/src/MaaCore/Task/Interface/RoguelikeTask.cpp index 86db4dcd85..3cce5160c0 100644 --- a/src/MaaCore/Task/Interface/RoguelikeTask.cpp +++ b/src/MaaCore/Task/Interface/RoguelikeTask.cpp @@ -7,8 +7,8 @@ // ------------------ 通用配置及插件 ------------------ #include "Task/Miscellaneous/ScreenshotTaskPlugin.h" -#include "Task/Roguelike/RoguelikeConfig.h" #include "Task/Roguelike/RoguelikeBattleTaskPlugin.h" +#include "Task/Roguelike/RoguelikeConfig.h" #include "Task/Roguelike/RoguelikeControlTaskPlugin.h" #include "Task/Roguelike/RoguelikeCustomStartTaskPlugin.h" #include "Task/Roguelike/RoguelikeDebugTaskPlugin.h" @@ -25,25 +25,62 @@ #include "Task/Roguelike/RoguelikeStrategyChangeTaskPlugin.h" // ------------------ 萨米主题专用配置及插件 ------------------ +#include "Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.h" +#include "Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h" #include "Task/Roguelike/Sami/RoguelikeFoldartalGainTaskPlugin.h" #include "Task/Roguelike/Sami/RoguelikeFoldartalStartTaskPlugin.h" #include "Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.h" -#include "Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.h" -#include "Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h" #include "Utils/Logger.hpp" asst::RoguelikeTask::RoguelikeTask(const AsstCallback& callback, Assistant* inst) - : InterfaceTask(callback, inst, TaskType), - m_roguelike_task_ptr(std::make_shared(callback, inst, TaskType)), - m_roguelike_config_ptr(std::make_shared()) + : InterfaceTask(callback, inst, TaskType) + , m_roguelike_task_ptr(std::make_shared(callback, inst, TaskType)) + , m_config_ptr(std::make_shared()) { LogTraceFunction; m_roguelike_task_ptr->set_ignore_error(true); - m_invest_plugin_ptr = m_roguelike_task_ptr->register_plugin( - m_roguelike_config_ptr); + // ------------------ 通用插件 ------------------ + m_roguelike_task_ptr->register_plugin(); + m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_invest_ptr = m_roguelike_task_ptr->register_plugin(m_config_ptr); + + m_debug_ptr = m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_custom_ptr = + m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr) + ->set_retry_times(0); + + m_roguelike_task_ptr->register_plugin(m_config_ptr) + ->set_retry_times(0) + .set_ignore_error(true); + m_roguelike_task_ptr->register_plugin(m_config_ptr) + ->set_retry_times(2) + .set_ignore_error(true); + + m_roguelike_task_ptr->register_plugin(m_config_ptr) + ->set_retry_times(2) + .set_ignore_error(true); + + m_roguelike_task_ptr->register_plugin(m_config_ptr) + ->set_retry_times(0); + + m_roguelike_task_ptr->register_plugin(m_config_ptr); + + m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr); + + // ------------------ 萨米主题专用插件 ------------------ + + m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr); // 这个任务如果卡住会放弃当前的肉鸽并重新开始,所以多添加亿点。先这样凑合用 for (int i = 0; i != 999; ++i) { @@ -71,20 +108,21 @@ bool asst::RoguelikeTask::set_params(const json::value& params) } m_roguelike_task_ptr->set_tasks({ theme + "@Roguelike@Begin" }); - m_roguelike_config_ptr->set_theme(theme); - m_roguelike_config_ptr->set_mode(mode); - m_roguelike_config_ptr->set_difficulty(0); + m_config_ptr->set_theme(theme); + m_config_ptr->set_mode(mode); + m_config_ptr->set_difficulty(0); // 是否凹指定干员开局直升 - m_roguelike_config_ptr->set_start_with_elite_two(params.get("start_with_elite_two", false)); - m_roguelike_config_ptr->set_only_start_with_elite_two(params.get("only_start_with_elite_two", false)); + m_config_ptr->set_start_with_elite_two(params.get("start_with_elite_two", false)); + m_config_ptr->set_only_start_with_elite_two(params.get("only_start_with_elite_two", false)); - m_invest_plugin_ptr->set_invest_maximum(params.get("investments_count", INT_MAX)); - m_invest_plugin_ptr->set_stop_when_full(params.get("stop_when_investment_full", false)); + m_invest_ptr->set_invest_maximum(params.get("investments_count", INT_MAX)); + m_invest_ptr->set_stop_when_full(params.get("stop_when_investment_full", false)); // 设置层数选点策略,相关逻辑在 RoguelikeStrategyChangeTaskPlugin { Task.set_task_base(theme + "@Roguelike@Stages", theme + "@Roguelike@Stages_default"); std::string strategy_task = theme + "@Roguelike@StrategyChange"; - std::string strategy_task_with_mode = strategy_task + "_mode" + std::to_string(static_cast(mode)); + std::string strategy_task_with_mode = + strategy_task + "_mode" + std::to_string(static_cast(mode)); if (Task.get(strategy_task_with_mode) == nullptr) { strategy_task_with_mode = "#none"; // 没有对应的层数选点策略,使用默认策略(避战) Log.warn(__FUNCTION__, "No strategy for mode", static_cast(mode)); @@ -99,25 +137,36 @@ bool asst::RoguelikeTask::set_params(const json::value& params) Task.set_task_base("Roguelike@LastReward4", "Roguelike@LastReward_default"); Task.set_task_base("Roguelike@LastRewardRand", "Roguelike@LastReward_default"); + m_debug_ptr->set_enable(mode != RoguelikeMode::Investment); if (mode == RoguelikeMode::Investment) { bool investment_with_more_score = params.get("investment_with_more_score", false); - if (!params.contains("investment_with_more_score") && params.contains("investment_enter_second_floor")) { + if (!params.contains("investment_with_more_score") + && params.contains("investment_enter_second_floor")) { investment_with_more_score = params.get("investment_enter_second_floor", true); Log.warn("================ DEPRECATED ================"); - Log.warn("`investment_enter_second_floor` has been deprecated since v5.2.1; Please use 'investment_with_more_score'"); + Log.warn( + "`investment_enter_second_floor` has been deprecated since v5.2.1; Please use " + "'investment_with_more_score'"); Log.warn("================ DEPRECATED ================"); } - m_roguelike_config_ptr->set_invest_with_more_score(investment_with_more_score); + m_config_ptr->set_invest_with_more_score(investment_with_more_score); // 刷源石锭模式是否进入第二层 if (investment_with_more_score) { // 战斗后奖励默认 - Task.set_task_base(theme + "@Roguelike@DropsFlag", theme + "@Roguelike@DropsFlag_default"); + Task.set_task_base( + theme + "@Roguelike@DropsFlag", + theme + "@Roguelike@DropsFlag_default"); m_roguelike_task_ptr->set_times_limit("StageTraderInvestCancel", INT_MAX); - m_roguelike_task_ptr->set_times_limit("StageTraderLeaveConfirm", 0, ProcessTask::TimesLimitType::Post); + m_roguelike_task_ptr->set_times_limit( + "StageTraderLeaveConfirm", + 0, + ProcessTask::TimesLimitType::Post); } else { // 战斗后奖励只拿钱 - Task.set_task_base(theme + "@Roguelike@DropsFlag", theme + "@Roguelike@DropsFlag_mode1"); + Task.set_task_base( + theme + "@Roguelike@DropsFlag", + theme + "@Roguelike@DropsFlag_mode1"); m_roguelike_task_ptr->set_times_limit("StageTraderInvestCancel", 0); m_roguelike_task_ptr->set_times_limit("StageTraderLeaveConfirm", INT_MAX); } @@ -129,22 +178,26 @@ bool asst::RoguelikeTask::set_params(const json::value& params) m_roguelike_task_ptr->set_times_limit("StageTraderLeaveConfirm", INT_MAX); } - m_roguelike_task_ptr->set_times_limit(theme + "@Roguelike@StartExplore", params.get("starts_count", INT_MAX)); + m_roguelike_task_ptr->set_times_limit( + theme + "@Roguelike@StartExplore", + params.get("starts_count", INT_MAX)); // 通过 exceededNext 禁用投资系统,进入商店购买逻辑 - m_roguelike_task_ptr->set_times_limit("StageTraderInvestSystem", - params.get("investment_enabled", true) ? INT_MAX : 0); - m_roguelike_task_ptr->set_times_limit("StageTraderRefreshWithDice", - params.get("refresh_trader_with_dice", false) ? INT_MAX : 0); + m_roguelike_task_ptr->set_times_limit( + "StageTraderInvestSystem", + params.get("investment_enabled", true) ? INT_MAX : 0); + m_roguelike_task_ptr->set_times_limit( + "StageTraderRefreshWithDice", + params.get("refresh_trader_with_dice", false) ? INT_MAX : 0); // =========================== 萨米主题专用参数 =========================== - + if (theme == RoguelikeTheme::Sami) { // 是否凹开局远见密文板 - m_roguelike_config_ptr->set_first_floor_foldartal(params.contains("first_floor_foldartal")); - m_roguelike_config_ptr->set_start_floor_foldartal(params.get("first_floor_foldartal", "")); + m_config_ptr->set_first_floor_foldartal(params.contains("first_floor_foldartal")); + m_config_ptr->set_start_floor_foldartal(params.get("first_floor_foldartal", "")); // 是否生活队凹开局板子 - m_roguelike_config_ptr->set_start_foldartal(params.contains("start_foldartal_list")); + m_config_ptr->set_start_foldartal(params.contains("start_foldartal_list")); if (auto opt = params.find("start_foldartal_list"); opt) { std::vector list; @@ -157,84 +210,35 @@ bool asst::RoguelikeTask::set_params(const json::value& params) Log.error(__FUNCTION__, "| Empty start_foldartal_list"); return false; } - m_roguelike_config_ptr->set_start_foldartal_list(std::move(list)); + m_config_ptr->set_start_foldartal_list(std::move(list)); } // 是否使用密文版, 非CLP_PDS模式下默认为True, CLP_PDS模式下默认为False - m_roguelike_config_ptr->set_use_foldartal(params.get("use_foldartal", mode != RoguelikeMode::CLP_PDS)); + m_config_ptr->set_use_foldartal( + params.get("use_foldartal", mode != RoguelikeMode::CLP_PDS)); // 是否检查坍缩范式,非CLP_PDS模式下默认为False, CLP_PDS模式下默认为True - m_roguelike_config_ptr->set_check_clp_pds(params.get("check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS)); - m_roguelike_config_ptr->set_double_check_clp_pds(params.get("double_check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS)); + m_config_ptr->set_check_clp_pds( + params.get("check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS)); + m_config_ptr->set_double_check_clp_pds( + params.get("double_check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS)); - const std::unordered_set& rare_clp_pds = RoguelikeCollapsalParadigms.get_rare_clp_pds(theme); - m_roguelike_config_ptr->set_expected_clp_pds(params.get("expected_collapsal_paradigms", rare_clp_pds)); + const std::unordered_set& rare_clp_pds = + RoguelikeCollapsalParadigms.get_rare_clp_pds(theme); + m_config_ptr->set_expected_clp_pds( + params.get("expected_collapsal_paradigms", rare_clp_pds)); } - register_roguelike_plugins(params); - + const auto& ptr = m_custom_ptr; + ptr->set_custom(RoguelikeCustomType::Squad, params.get("squad", "")); // 开局分队 + ptr->set_custom(RoguelikeCustomType::Roles, params.get("roles", "")); // 开局职业组 + ptr->set_custom(RoguelikeCustomType::CoreChar, params.get("core_char", "")); // 开局干员名 + ptr->set_custom( + RoguelikeCustomType::UseSupport, + params.get("use_support", false) ? "1" : "0"); // 开局干员是否为助战干员 + ptr->set_custom( + RoguelikeCustomType::UseNonfriendSupport, + params.get("use_nonfriend_support", false) ? "1" : "0"); // 是否可以是非好友助战干员 + return true; } - -void asst::RoguelikeTask::register_roguelike_plugins(const json::value& params) { - - LogTraceFunction; - - // ------------------ 通用插件 ------------------ - m_roguelike_task_ptr->register_plugin(); - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - - std::shared_ptr debug_plugin_ptr = - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - if (m_roguelike_config_ptr->get_mode() == RoguelikeMode::Investment) { - debug_plugin_ptr->set_enable(false); - } - else { - debug_plugin_ptr->set_enable(true); - } - - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr)->set_retry_times(0); - - - const auto& custom_start_plugin_ptr = m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - custom_start_plugin_ptr->set_custom(RoguelikeCustomType::Squad, params.get("squad", "")); // 开局分队 - custom_start_plugin_ptr->set_custom(RoguelikeCustomType::Roles, params.get("roles", "")); // 开局职业组 - custom_start_plugin_ptr->set_custom(RoguelikeCustomType::CoreChar, params.get("core_char", "")); // 开局干员名 - custom_start_plugin_ptr->set_custom(RoguelikeCustomType::UseSupport, - params.get("use_support", false) ? "1" : "0"); // 开局干员是否为助战干员 - custom_start_plugin_ptr->set_custom(RoguelikeCustomType::UseNonfriendSupport, - params.get("use_nonfriend_support", false) ? "1" - : "0"); // 是否可以是非好友助战干员 - - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr) - ->set_retry_times(0) - .set_ignore_error(true); - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr) - ->set_retry_times(2) - .set_ignore_error(true); - - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr) - ->set_retry_times(2) - .set_ignore_error(true); - - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr) - ->set_retry_times(0); - - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - - // ------------------ 萨米主题专用插件 ------------------ - - if (m_roguelike_config_ptr->get_theme() == RoguelikeTheme::Sami) { - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - - m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - } -} diff --git a/src/MaaCore/Task/Interface/RoguelikeTask.h b/src/MaaCore/Task/Interface/RoguelikeTask.h index a8a6dfef81..459327be5e 100644 --- a/src/MaaCore/Task/Interface/RoguelikeTask.h +++ b/src/MaaCore/Task/Interface/RoguelikeTask.h @@ -6,6 +6,8 @@ namespace asst class ProcessTask; class RoguelikeConfig; class RoguelikeInvestTaskPlugin; + class RoguelikeDebugTaskPlugin; + class RoguelikeCustomStartTaskPlugin; class RoguelikeTask : public InterfaceTask { @@ -19,9 +21,10 @@ namespace asst private: std::shared_ptr m_roguelike_task_ptr = nullptr; - std::shared_ptr m_roguelike_config_ptr = nullptr; - std::shared_ptr m_invest_plugin_ptr = nullptr; + std::shared_ptr m_config_ptr = nullptr; + std::shared_ptr m_invest_ptr = nullptr; + std::shared_ptr m_debug_ptr = nullptr; + std::shared_ptr m_custom_ptr = nullptr; - void register_roguelike_plugins(const json::value& params); }; } diff --git a/src/MaaCore/Task/Roguelike/RoguelikeConfig.h b/src/MaaCore/Task/Roguelike/RoguelikeConfig.h index b67e5ffead..a85359da75 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeConfig.h +++ b/src/MaaCore/Task/Roguelike/RoguelikeConfig.h @@ -150,7 +150,7 @@ namespace asst void set_use_nonfriend_support(bool value) { m_use_nonfriend_support = value; } bool get_use_nonfriend_support() const { return m_use_nonfriend_support; } void set_oper(std::unordered_map oper) { m_oper = std::move(oper); } - const std::unordered_map& get_oper() const { return m_oper; } + const auto& get_oper() const { return m_oper; } private: // ------------------ 招募 ------------------ diff --git a/src/MaaCore/Task/Roguelike/RoguelikeStageEncounterTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/RoguelikeStageEncounterTaskPlugin.cpp index 4c9054cb8a..de1fe17193 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeStageEncounterTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/RoguelikeStageEncounterTaskPlugin.cpp @@ -35,11 +35,11 @@ bool asst::RoguelikeStageEncounterTaskPlugin::verify(AsstMsg msg, const json::va bool asst::RoguelikeStageEncounterTaskPlugin::_run() { LogTraceFunction; - if (!plugin_gained) { - plugin_gained = true; - typedef RoguelikeCollapsalParadigmTaskPlugin CPPlugin; + if (!m_plugin_gained) { + m_plugin_gained = true; + typedef RoguelikeCollapsalParadigmTaskPlugin Plugin; for (const auto& plugin : m_task_ptr->get_plugins()) { - if (auto ptr = std::dynamic_pointer_cast(plugin)) { + if (auto ptr = std::dynamic_pointer_cast(plugin)) { m_clp_pd_plugin = ptr; break; } diff --git a/src/MaaCore/Task/Roguelike/RoguelikeStageEncounterTaskPlugin.h b/src/MaaCore/Task/Roguelike/RoguelikeStageEncounterTaskPlugin.h index 83cbd36480..a781649cd6 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeStageEncounterTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/RoguelikeStageEncounterTaskPlugin.h @@ -25,6 +25,6 @@ namespace asst private: std::shared_ptr m_clp_pd_plugin; - bool plugin_gained = false; + bool m_plugin_gained = false; }; } diff --git a/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp index 3bfcbdf0d9..899116d0b1 100644 --- a/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp @@ -10,7 +10,40 @@ #include -bool asst::RoguelikeCollapsalParadigmTaskPlugin::verify(const AsstMsg msg, const json::value& details) const +asst::RoguelikeCollapsalParadigmTaskPlugin::RoguelikeCollapsalParadigmTaskPlugin( + const AsstCallback& callback, + Assistant* inst, + std::string_view task_chain, + std::shared_ptr config) + : AbstractRoguelikeTaskPlugin(callback, inst, task_chain, config) +{ + // 由于仅有萨米肉鸽使用,任务名暂定写死 + std::shared_ptr bannerCheckConfig = + Task.get("Sami@Roguelike@CheckCollapsalParadigms_bannerCheckConfig"); + m_deepen_text = bannerCheckConfig->text.front(); + m_banner_triggers_start.insert(bannerCheckConfig->sub.begin(), bannerCheckConfig->sub.end()); + m_banner_triggers_completed.insert( + bannerCheckConfig->next.begin(), + bannerCheckConfig->next.end()); + + std::shared_ptr panelCheckConfig = + Task.get("Sami@Roguelike@CheckCollapsalParadigms_panelCheckConfig"); + m_roi = panelCheckConfig->roi; + m_swipe_begin.x = panelCheckConfig->specific_rect.x; + m_swipe_begin.y = panelCheckConfig->specific_rect.y; + m_swipe_end.x = panelCheckConfig->rect_move.x; + m_swipe_end.y = panelCheckConfig->rect_move.y; + m_panel_triggers.insert(panelCheckConfig->sub.begin(), panelCheckConfig->sub.end()); + std::ranges::for_each( + panelCheckConfig->replace_map, + [&](const std::pair& p) { + m_zone_dict.emplace(p.first, p.second); + }); +} + +bool asst::RoguelikeCollapsalParadigmTaskPlugin::verify( + const AsstMsg msg, + const json::value& details) const { if ((msg != AsstMsg::SubTaskStart && msg != AsstMsg::SubTaskCompleted) || details.get("subtask", std::string()) != "ProcessTask") { return false; diff --git a/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h index 1a0c07af26..6631bf443a 100644 --- a/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h @@ -9,31 +9,12 @@ namespace asst class RoguelikeCollapsalParadigmTaskPlugin : public AbstractRoguelikeTaskPlugin { public: - RoguelikeCollapsalParadigmTaskPlugin(const AsstCallback& callback, - Assistant* inst, - std::string_view task_chain, - std::shared_ptr config) - : AbstractRoguelikeTaskPlugin(callback, inst, task_chain, config) - { - const std::string& theme = config->get_theme(); - - std::shared_ptr bannerCheckConfig = - Task.get(theme + "@Roguelike@CheckCollapsalParadigms_bannerCheckConfig"); - m_deepen_text = bannerCheckConfig->text.front(); - m_banner_triggers_start.insert(bannerCheckConfig->sub.begin(), bannerCheckConfig->sub.end()); - m_banner_triggers_completed.insert(bannerCheckConfig->next.begin(), bannerCheckConfig->next.end()); - - std::shared_ptr panelCheckConfig = - Task.get(theme + "@Roguelike@CheckCollapsalParadigms_panelCheckConfig"); - m_roi = panelCheckConfig->roi; - m_swipe_begin.x = panelCheckConfig->specific_rect.x; - m_swipe_begin.y = panelCheckConfig->specific_rect.y; - m_swipe_end.x = panelCheckConfig->rect_move.x; - m_swipe_end.y = panelCheckConfig->rect_move.y; - m_panel_triggers.insert(panelCheckConfig->sub.begin(), panelCheckConfig->sub.end()); - std::ranges::for_each(panelCheckConfig->replace_map, - [&](const std::pair& p) { m_zone_dict.emplace(p.first, p.second); }); - } + RoguelikeCollapsalParadigmTaskPlugin( + const AsstCallback& callback, + Assistant* inst, + std::string_view task_chain, + std::shared_ptr config); + // using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin; virtual ~RoguelikeCollapsalParadigmTaskPlugin() override = default; diff --git a/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.cpp index 819b180a6e..5c3850547b 100644 --- a/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.cpp @@ -76,6 +76,16 @@ bool asst::RoguelikeFoldartalUseTaskPlugin::verify(const AsstMsg msg, const json bool asst::RoguelikeFoldartalUseTaskPlugin::_run() { LogTraceFunction; + if (!m_plugin_gained) { + m_plugin_gained = true; + typedef RoguelikeCollapsalParadigmTaskPlugin Plugin; + for (const auto& plugin : m_task_ptr->get_plugins()) { + if (auto ptr = std::dynamic_pointer_cast(plugin)) { + m_clp_pd_plugin = ptr; + break; + } + } + } std::vector combination = RoguelikeFoldartal.get_combination(m_config->get_theme()); diff --git a/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.h b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.h index 15f4d29c6d..a2364f024b 100644 --- a/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.h @@ -8,17 +8,7 @@ namespace asst class RoguelikeFoldartalUseTaskPlugin : public AbstractRoguelikeTaskPlugin { public: - // using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin; - RoguelikeFoldartalUseTaskPlugin(const AsstCallback& callback, - Assistant* inst, - std::string_view task_chain, - std::shared_ptr config) - : AbstractRoguelikeTaskPlugin(callback, inst, task_chain, config) - { - if (RoguelikeCollapsalParadigmTaskPlugin::enabled(config)) { - m_clp_pd_plugin = std::make_shared(callback, inst, task_chain, config); - } - } + using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin; virtual ~RoguelikeFoldartalUseTaskPlugin() override = default; public: @@ -54,6 +44,7 @@ namespace asst // 节点类型 mutable std::string m_stage; + bool m_plugin_gained; std::shared_ptr m_clp_pd_plugin; }; }