diff --git a/src/MaaCore/Task/Interface/RoguelikeTask.cpp b/src/MaaCore/Task/Interface/RoguelikeTask.cpp index 4bbb909ab7..5bf4863861 100644 --- a/src/MaaCore/Task/Interface/RoguelikeTask.cpp +++ b/src/MaaCore/Task/Interface/RoguelikeTask.cpp @@ -204,15 +204,8 @@ bool asst::RoguelikeTask::set_params(const json::value& params) // 是否检查坍缩范式,非CLP_PDS模式下默认为False, CLP_PDS模式下默认为True m_config_ptr->set_check_clp_pds(params.get("check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS)); - m_cp_ptr->set_double_check_clp_pds( - params.get("double_check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS)); } - m_foldartal_gain_ptr->set_enable(theme == RoguelikeTheme::Sami); - m_foldartal_start_ptr->set_enable(theme == RoguelikeTheme::Sami); - m_foldartal_use_ptr->set_enable(theme == RoguelikeTheme::Sami); - m_cp_ptr->set_enable(theme == RoguelikeTheme::Sami); - m_invest_ptr->set_control_plugin_ptr(m_control_ptr); const auto& ptr = m_custom_ptr; @@ -226,5 +219,16 @@ bool asst::RoguelikeTask::set_params(const json::value& params) RoguelikeCustomType::UseNonfriendSupport, params.get("use_nonfriend_support", false) ? "1" : "0"); // 是否可以是非好友助战干员 + m_foldartal_gain_ptr->set_enable(theme == RoguelikeTheme::Sami); + m_foldartal_start_ptr->set_enable(theme == RoguelikeTheme::Sami); + m_foldartal_use_ptr->set_enable(theme == RoguelikeTheme::Sami); + m_cp_ptr->set_enable(theme == RoguelikeTheme::Sami); + + for (const auto& plugin : m_roguelike_task_ptr->get_plugins()) { + if (const auto& roguelike_plugin = std::dynamic_pointer_cast(plugin)) { + roguelike_plugin->set_enable(roguelike_plugin->set_params(params)); + } + } + return true; } diff --git a/src/MaaCore/Task/Roguelike/AbstractRoguelikeTaskPlugin.h b/src/MaaCore/Task/Roguelike/AbstractRoguelikeTaskPlugin.h index 3f89760a06..3f6a71d8c7 100644 --- a/src/MaaCore/Task/Roguelike/AbstractRoguelikeTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/AbstractRoguelikeTaskPlugin.h @@ -15,7 +15,12 @@ namespace asst virtual void reset_variable() {} + // 根据 params 设置插件专用参数, 返回插件是否适用 + virtual bool set_params([[maybe_unused]] const json::value& params) { return true; } + protected: std::shared_ptr m_config; }; + + using RoguelikeTaskPluginPtr = std::shared_ptr; } diff --git a/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp index fceed1dd08..07e34657b8 100644 --- a/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp @@ -1,6 +1,8 @@ #include "RoguelikeCollapsalParadigmTaskPlugin.h" -#include "Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.h" +#include + +#include "Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.h" #include "Config/TaskData.h" #include "Controller/Controller.h" #include "Task/ProcessTask.h" @@ -8,33 +10,35 @@ #include "Vision/Matcher.h" #include "Vision/OCRer.h" -#include - -asst::RoguelikeCollapsalParadigmTaskPlugin::RoguelikeCollapsalParadigmTaskPlugin( - const AsstCallback& callback, - Assistant* inst, - std::string_view task_chain, - std::shared_ptr config) : - AbstractRoguelikeTaskPlugin(callback, inst, task_chain, config) +bool asst::RoguelikeCollapsalParadigmTaskPlugin::set_params(const json::value& params) { - // 由于仅有萨米肉鸽使用,任务名暂定写死 - 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()); + const std::string& theme = m_config->get_theme(); + if (theme != RoguelikeTheme::Sami) { + return false; + } - std::shared_ptr panelCheckConfig = + const RoguelikeMode& mode = m_config->get_mode(); + m_double_check_clp_pds = params.get("double_check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS); + + // 仅萨米肉鸽使用 TODO: 去掉名字里的下划线, _b -> B, _p -> P + const auto& bannerCheckConfig = + Task.get("Sami@Roguelike@CheckCollapsalParadigms_bannerCheckConfig"); + const auto& panelCheckConfig = Task.get("Sami@Roguelike@CheckCollapsalParadigms_panelCheckConfig"); + + m_deepen_text = bannerCheckConfig->text.front(); 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()); - ranges::for_each(panelCheckConfig->replace_map, [&](const std::pair& p) { - m_zone_dict.emplace(p.first, p.second); - }); + + m_banner_triggers_start = std::unordered_set(bannerCheckConfig->sub.begin(), bannerCheckConfig->sub.end()); + m_banner_triggers_completed = std::unordered_set(bannerCheckConfig->next.begin(), bannerCheckConfig->next.end()); + m_panel_triggers = std::unordered_set(panelCheckConfig->sub.begin(), panelCheckConfig->sub.end()); + m_zone_dict = std::unordered_map(panelCheckConfig->replace_map.begin(), panelCheckConfig->replace_map.end()); + + return true; } bool asst::RoguelikeCollapsalParadigmTaskPlugin::verify(const AsstMsg msg, const json::value& details) const diff --git a/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h index 9fb9001497..181c2f4611 100644 --- a/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h @@ -9,15 +9,10 @@ namespace asst class RoguelikeCollapsalParadigmTaskPlugin : public AbstractRoguelikeTaskPlugin { public: - RoguelikeCollapsalParadigmTaskPlugin( - const AsstCallback& callback, - Assistant* inst, - std::string_view task_chain, - std::shared_ptr config); - // using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin; + using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin; virtual ~RoguelikeCollapsalParadigmTaskPlugin() override = default; virtual bool verify(AsstMsg msg, const json::value& details) const override; - + virtual bool set_params(const json::value& params) override; static bool enabled(std::shared_ptr config) { return config->get_theme() == RoguelikeTheme::Sami && config->get_check_clp_pds();